mirror of https://github.com/aria2/aria2
2008-08-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added options to load/save the server's performance/status to a file and the timeout to drop their data. --server-stat-of=FILE specifies the file to which performance data is saved. --server-stat-if=FILE specifies the file to read previously saved by --server-stat-of option. Might be used with --uri-selector=feedback. --server-stat-timeout=TIMEOUT specifies timeout to invalidate the data. TIMEOUT is specified in seconds and the default value is 24hours. * src/MultiUrlRequestInfo.cc * src/OptionHandlerFactory.cc * src/RequestGroupMan.cc * src/RequestGroupMan.h * src/ServerStatMan.cc * src/ServerStatMan.h * src/option_processing.cc * src/prefs.cc * src/prefs.h * test/ServerStatManTest.ccpull/1/head
parent
6aba376430
commit
db46bab38b
21
ChangeLog
21
ChangeLog
|
@ -1,3 +1,24 @@
|
||||||
|
2008-08-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
|
Added options to load/save the server's performance/status to a file
|
||||||
|
and the timeout to drop their data.
|
||||||
|
--server-stat-of=FILE specifies the file to which performance data
|
||||||
|
is saved.
|
||||||
|
--server-stat-if=FILE specifies the file to read previously saved
|
||||||
|
by --server-stat-of option. Might be used with --uri-selector=feedback.
|
||||||
|
--server-stat-timeout=TIMEOUT specifies timeout to invalidate the data.
|
||||||
|
TIMEOUT is specified in seconds and the default value is 24hours.
|
||||||
|
* src/MultiUrlRequestInfo.cc
|
||||||
|
* src/OptionHandlerFactory.cc
|
||||||
|
* src/RequestGroupMan.cc
|
||||||
|
* src/RequestGroupMan.h
|
||||||
|
* src/ServerStatMan.cc
|
||||||
|
* src/ServerStatMan.h
|
||||||
|
* src/option_processing.cc
|
||||||
|
* src/prefs.cc
|
||||||
|
* src/prefs.h
|
||||||
|
* test/ServerStatManTest.cc
|
||||||
|
|
||||||
2008-08-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
2008-08-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
Implemented ServerStatMan::removeStaleServerStat() and its test case.
|
Implemented ServerStatMan::removeStaleServerStat() and its test case.
|
||||||
|
|
|
@ -100,6 +100,12 @@ int MultiUrlRequestInfo::execute()
|
||||||
DownloadEngineHandle e =
|
DownloadEngineHandle e =
|
||||||
DownloadEngineFactory().newDownloadEngine(_option, _requestGroups);
|
DownloadEngineFactory().newDownloadEngine(_option, _requestGroups);
|
||||||
|
|
||||||
|
std::string serverStatIf = _option->get(PREF_SERVER_STAT_IF);
|
||||||
|
if(!serverStatIf.empty()) {
|
||||||
|
e->_requestGroupMan->loadServerStat(serverStatIf);
|
||||||
|
e->_requestGroupMan->removeStaleServerStat
|
||||||
|
(_option->getAsInt(PREF_SERVER_STAT_TIMEOUT));
|
||||||
|
}
|
||||||
e->setStatCalc(_statCalc);
|
e->setStatCalc(_statCalc);
|
||||||
e->fillCommand();
|
e->fillCommand();
|
||||||
|
|
||||||
|
@ -115,6 +121,10 @@ int MultiUrlRequestInfo::execute()
|
||||||
|
|
||||||
e->run();
|
e->run();
|
||||||
|
|
||||||
|
std::string serverStatOf = _option->get(PREF_SERVER_STAT_OF);
|
||||||
|
if(!serverStatOf.empty()) {
|
||||||
|
e->_requestGroupMan->saveServerStat(serverStatOf);
|
||||||
|
}
|
||||||
e->_requestGroupMan->showDownloadResults(_summaryOut);
|
e->_requestGroupMan->showDownloadResults(_summaryOut);
|
||||||
_summaryOut << std::flush;
|
_summaryOut << std::flush;
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,11 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
|
||||||
std::deque<std::string>
|
std::deque<std::string>
|
||||||
(¶ms[0], ¶ms[arrayLength(params)]))));
|
(¶ms[0], ¶ms[arrayLength(params)]))));
|
||||||
}
|
}
|
||||||
|
handlers.push_back(SH(new NumberOptionHandler(PREF_SERVER_STAT_TIMEOUT,
|
||||||
|
0, INT32_MAX)));
|
||||||
|
handlers.push_back(SH(new DefaultOptionHandler(PREF_SERVER_STAT_IF)));
|
||||||
|
handlers.push_back(SH(new DefaultOptionHandler(PREF_SERVER_STAT_OF)));
|
||||||
|
|
||||||
return handlers;
|
return handlers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
#include <fstream>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -477,4 +478,44 @@ bool RequestGroupMan::addServerStat(const SharedHandle<ServerStat>& serverStat)
|
||||||
return _serverStatMan->add(serverStat);
|
return _serverStatMan->add(serverStat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RequestGroupMan::loadServerStat(const std::string& filename)
|
||||||
|
{
|
||||||
|
std::ifstream in(filename.c_str());
|
||||||
|
if(!in) {
|
||||||
|
_logger->error("Failed to open ServerStat file %s for read.",
|
||||||
|
filename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(_serverStatMan->load(in)) {
|
||||||
|
_logger->notice("ServerStat file %s loaded successfully.",
|
||||||
|
filename.c_str());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
_logger->error("Failed to read ServerStat from %s.", filename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RequestGroupMan::saveServerStat(const std::string& filename) const
|
||||||
|
{
|
||||||
|
std::ofstream out(filename.c_str());
|
||||||
|
if(!out) {
|
||||||
|
_logger->error("Failed to open ServerStat file %s for write.",
|
||||||
|
filename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(_serverStatMan->save(out)) {
|
||||||
|
_logger->notice("ServerStat file %s saved successfully.", filename.c_str());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
_logger->error("Failed to write ServerStat to %s.", filename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestGroupMan::removeStaleServerStat(time_t timeout)
|
||||||
|
{
|
||||||
|
_serverStatMan->removeStaleServerStat(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -143,6 +143,12 @@ public:
|
||||||
|
|
||||||
|
|
||||||
void updateServerStat();
|
void updateServerStat();
|
||||||
|
|
||||||
|
bool loadServerStat(const std::string& filename);
|
||||||
|
|
||||||
|
bool saveServerStat(const std::string& filename) const;
|
||||||
|
|
||||||
|
void removeStaleServerStat(time_t timeout);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SharedHandle<RequestGroupMan> RequestGroupManHandle;
|
typedef SharedHandle<RequestGroupMan> RequestGroupManHandle;
|
||||||
|
|
|
@ -74,13 +74,14 @@ bool ServerStatMan::add(const SharedHandle<ServerStat>& serverStat)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerStatMan::save(std::ostream& out) const
|
bool ServerStatMan::save(std::ostream& out) const
|
||||||
{
|
{
|
||||||
std::copy(_serverStats.begin(), _serverStats.end(),
|
std::copy(_serverStats.begin(), _serverStats.end(),
|
||||||
std::ostream_iterator<SharedHandle<ServerStat> >(out, "\n"));
|
std::ostream_iterator<SharedHandle<ServerStat> >(out, "\n"));
|
||||||
|
return !out.bad();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerStatMan::load(std::istream& in)
|
bool ServerStatMan::load(std::istream& in)
|
||||||
{
|
{
|
||||||
static const std::string S_HOST = "host";
|
static const std::string S_HOST = "host";
|
||||||
static const std::string S_PROTOCOL = "protocol";
|
static const std::string S_PROTOCOL = "protocol";
|
||||||
|
@ -117,6 +118,7 @@ void ServerStatMan::load(std::istream& in)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return !in.bad();
|
||||||
}
|
}
|
||||||
|
|
||||||
class FindStaleServerStat {
|
class FindStaleServerStat {
|
||||||
|
|
|
@ -55,9 +55,9 @@ public:
|
||||||
|
|
||||||
bool add(const SharedHandle<ServerStat>& serverStat);
|
bool add(const SharedHandle<ServerStat>& serverStat);
|
||||||
|
|
||||||
void load(std::istream& in);
|
bool load(std::istream& in);
|
||||||
|
|
||||||
void save(std::ostream& out) const;
|
bool save(std::ostream& out) const;
|
||||||
|
|
||||||
void removeStaleServerStat(time_t timeout);
|
void removeStaleServerStat(time_t timeout);
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -157,6 +157,7 @@ Option* createDefaultOption()
|
||||||
op->put(PREF_SUMMARY_INTERVAL, "60");
|
op->put(PREF_SUMMARY_INTERVAL, "60");
|
||||||
op->put(PREF_LOG_LEVEL, V_DEBUG);
|
op->put(PREF_LOG_LEVEL, V_DEBUG);
|
||||||
op->put(PREF_URI_SELECTOR, V_INORDER);
|
op->put(PREF_URI_SELECTOR, V_INORDER);
|
||||||
|
op->put(PREF_SERVER_STAT_TIMEOUT, "86400");// 1day
|
||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,6 +236,9 @@ Option* option_processing(int argc, char* const argv[])
|
||||||
{ PREF_SUMMARY_INTERVAL.c_str(), required_argument, &lopt, 218 },
|
{ PREF_SUMMARY_INTERVAL.c_str(), required_argument, &lopt, 218 },
|
||||||
{ PREF_LOG_LEVEL.c_str(), required_argument, &lopt, 219 },
|
{ PREF_LOG_LEVEL.c_str(), required_argument, &lopt, 219 },
|
||||||
{ PREF_URI_SELECTOR.c_str(), required_argument, &lopt, 220 },
|
{ PREF_URI_SELECTOR.c_str(), required_argument, &lopt, 220 },
|
||||||
|
{ PREF_SERVER_STAT_IF.c_str(), required_argument, &lopt, 221 },
|
||||||
|
{ PREF_SERVER_STAT_OF.c_str(), required_argument, &lopt, 222 },
|
||||||
|
{ PREF_SERVER_STAT_TIMEOUT.c_str(), required_argument, &lopt, 223 },
|
||||||
#if defined ENABLE_BITTORRENT || defined ENABLE_METALINK
|
#if defined ENABLE_BITTORRENT || defined ENABLE_METALINK
|
||||||
{ PREF_SHOW_FILES.c_str(), no_argument, NULL, 'S' },
|
{ PREF_SHOW_FILES.c_str(), no_argument, NULL, 'S' },
|
||||||
{ PREF_SELECT_FILE.c_str(), required_argument, &lopt, 21 },
|
{ PREF_SELECT_FILE.c_str(), required_argument, &lopt, 21 },
|
||||||
|
@ -466,6 +470,15 @@ Option* option_processing(int argc, char* const argv[])
|
||||||
case 220:
|
case 220:
|
||||||
cmdstream << PREF_URI_SELECTOR << "=" << optarg << "\n";
|
cmdstream << PREF_URI_SELECTOR << "=" << optarg << "\n";
|
||||||
break;
|
break;
|
||||||
|
case 221:
|
||||||
|
cmdstream << PREF_SERVER_STAT_IF << "=" << optarg << "\n";
|
||||||
|
break;
|
||||||
|
case 222:
|
||||||
|
cmdstream << PREF_SERVER_STAT_OF << "=" << optarg << "\n";
|
||||||
|
break;
|
||||||
|
case 223:
|
||||||
|
cmdstream << PREF_SERVER_STAT_TIMEOUT << "=" << optarg << "\n";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,12 @@ const std::string V_ERROR("error");
|
||||||
const std::string PREF_URI_SELECTOR("uri-selector");
|
const std::string PREF_URI_SELECTOR("uri-selector");
|
||||||
const std::string V_INORDER("inorder");
|
const std::string V_INORDER("inorder");
|
||||||
const std::string V_FEEDBACK("feedback");
|
const std::string V_FEEDBACK("feedback");
|
||||||
|
// value: 1*digit
|
||||||
|
const std::string PREF_SERVER_STAT_TIMEOUT("server-stat-timeout");
|
||||||
|
// value: string that your file system recognizes as a file name.
|
||||||
|
const std::string PREF_SERVER_STAT_IF("server-stat-if");
|
||||||
|
// value: string that your file system recognizes as a file name.
|
||||||
|
const std::string PREF_SERVER_STAT_OF("server-stat-of");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FTP related preferences
|
* FTP related preferences
|
||||||
|
|
|
@ -143,6 +143,12 @@ extern const std::string V_ERROR;
|
||||||
extern const std::string PREF_URI_SELECTOR;
|
extern const std::string PREF_URI_SELECTOR;
|
||||||
extern const std::string V_INORDER;
|
extern const std::string V_INORDER;
|
||||||
extern const std::string V_FEEDBACK;
|
extern const std::string V_FEEDBACK;
|
||||||
|
// value: 1*digit
|
||||||
|
extern const std::string PREF_SERVER_STAT_TIMEOUT;
|
||||||
|
// value: string that your file system recognizes as a file name.
|
||||||
|
extern const std::string PREF_SERVER_STAT_IF;
|
||||||
|
// value: string that your file system recognizes as a file name.
|
||||||
|
extern const std::string PREF_SERVER_STAT_OF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FTP related preferences
|
* FTP related preferences
|
||||||
|
|
|
@ -73,7 +73,7 @@ void ServerStatManTest::testSave()
|
||||||
CPPUNIT_ASSERT(ssm.add(mirror));
|
CPPUNIT_ASSERT(ssm.add(mirror));
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ssm.save(ss);
|
CPPUNIT_ASSERT(ssm.save(ss));
|
||||||
std::string out = ss.str();
|
std::string out = ss.str();
|
||||||
CPPUNIT_ASSERT_EQUAL
|
CPPUNIT_ASSERT_EQUAL
|
||||||
(std::string
|
(std::string
|
||||||
|
@ -93,7 +93,7 @@ void ServerStatManTest::testLoad()
|
||||||
std::stringstream ss(in);
|
std::stringstream ss(in);
|
||||||
|
|
||||||
ServerStatMan ssm;
|
ServerStatMan ssm;
|
||||||
ssm.load(ss);
|
CPPUNIT_ASSERT(ssm.load(ss));
|
||||||
|
|
||||||
SharedHandle<ServerStat> localhost_http = ssm.find("localhost", "http");
|
SharedHandle<ServerStat> localhost_http = ssm.find("localhost", "http");
|
||||||
CPPUNIT_ASSERT(!localhost_http.isNull());
|
CPPUNIT_ASSERT(!localhost_http.isNull());
|
||||||
|
|
Loading…
Reference in New Issue