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
pull/1/head
Tatsuhiro Tsujikawa 2008-08-10 15:22:55 +00:00
parent 6aba376430
commit db46bab38b
11 changed files with 116 additions and 6 deletions

View File

@ -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.

View File

@ -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;

View File

@ -150,6 +150,11 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
std::deque<std::string> std::deque<std::string>
(&params[0], &params[arrayLength(params)])))); (&params[0], &params[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;
} }

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -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:

View File

@ -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;
} }

View File

@ -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

View File

@ -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

View File

@ -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());