summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-05 14:02:23 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-05 14:02:23 +0000
commitfe8fea56ca586df592470d82bcec93d7bc8b27ba (patch)
tree8852a13c4339b051f5fa4d013fcf755e238834d2
parentdb4ed87f7a944a8d177ca8c13efc68f127b7b37d (diff)
2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Only execute RequestGroupMan::fillRequestGroupFromReserver() when queue maintenance is requested by RequestGroup to avoid to call the function unnecessarily. * src/FillRequestGroupCommand.cc * src/RequestGroup.cc * src/RequestGroup.h * src/RequestGroupMan.cc * src/RequestGroupMan.h
-rw-r--r--ChangeLog11
-rw-r--r--src/FillRequestGroupCommand.cc19
-rw-r--r--src/RequestGroup.cc7
-rw-r--r--src/RequestGroup.h8
-rw-r--r--src/RequestGroupMan.cc4
-rw-r--r--src/RequestGroupMan.h20
6 files changed, 61 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index c8cdf936..503e2c2a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
+ Only execute RequestGroupMan::fillRequestGroupFromReserver() when
+ queue maintenance is requested by RequestGroup to avoid to call
+ the function unnecessarily.
+ * src/FillRequestGroupCommand.cc
+ * src/RequestGroup.cc
+ * src/RequestGroup.h
+ * src/RequestGroupMan.cc
+ * src/RequestGroupMan.h
+
+2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
+
Don't use hash for Peer::id. Simple concatenation of ip address
and port is enough.
* src/Peer.cc
diff --git a/src/FillRequestGroupCommand.cc b/src/FillRequestGroupCommand.cc
index 7681c5db..13d53c7f 100644
--- a/src/FillRequestGroupCommand.cc
+++ b/src/FillRequestGroupCommand.cc
@@ -40,6 +40,7 @@
#include "message.h"
#include "Logger.h"
#include "DownloadContext.h"
+#include "ServerStatMan.h"
namespace aria2 {
@@ -60,13 +61,17 @@ bool FillRequestGroupCommand::execute()
if(_e->isHaltRequested()) {
return true;
}
- try {
- _e->_requestGroupMan->fillRequestGroupFromReserver(_e);
- } catch(RecoverableException& ex) {
- logger->error(EX_EXCEPTION_CAUGHT, ex);
- }
- if(_e->_requestGroupMan->downloadFinished()) {
- return true;
+ SharedHandle<RequestGroupMan> rgman = _e->_requestGroupMan;
+ if(rgman->queueCheckRequested()) {
+ try {
+ rgman->fillRequestGroupFromReserver(_e);
+ rgman->clearQueueCheck();
+ } catch(RecoverableException& ex) {
+ logger->error(EX_EXCEPTION_CAUGHT, ex);
+ }
+ if(rgman->downloadFinished()) {
+ return true;
+ }
}
_e->addRoutineCommand(this);
return false;
diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc
index 275cd164..c2a0f092 100644
--- a/src/RequestGroup.cc
+++ b/src/RequestGroup.cc
@@ -130,6 +130,7 @@ RequestGroup::RequestGroup(const SharedHandle<Option>& option):
_maxDownloadSpeedLimit(option->getAsInt(PREF_MAX_DOWNLOAD_LIMIT)),
_maxUploadSpeedLimit(option->getAsInt(PREF_MAX_UPLOAD_LIMIT)),
_belongsToGID(0),
+ _requestGroupMan(0),
_logger(LogFactory::getInstance())
{
_fileAllocationEnabled = _option->get(PREF_FILE_ALLOCATION) != V_NONE;
@@ -799,6 +800,12 @@ void RequestGroup::increaseNumCommand()
void RequestGroup::decreaseNumCommand()
{
--_numCommand;
+ if(!_numCommand && _requestGroupMan) {
+ if(_logger->debug()) {
+ _logger->debug("GID#%d - Request queue check", _gid);
+ }
+ _requestGroupMan->requestQueueCheck();
+ }
}
diff --git a/src/RequestGroup.h b/src/RequestGroup.h
index d7672b82..bef34b84 100644
--- a/src/RequestGroup.h
+++ b/src/RequestGroup.h
@@ -67,6 +67,7 @@ class CheckIntegrityEntry;
class DownloadResult;
class URISelector;
class URIResult;
+class RequestGroupMan;
#ifdef ENABLE_BITTORRENT
class BtRuntime;
class PeerStorage;
@@ -162,6 +163,8 @@ private:
// RequestGroup.
int32_t _belongsToGID;
+ RequestGroupMan* _requestGroupMan;
+
Logger* _logger;
void validateFilename(const std::string& expectedFilename,
@@ -488,6 +491,11 @@ public:
return _belongsToGID;
}
+ void setRequestGroupMan(RequestGroupMan* requestGroupMan)
+ {
+ _requestGroupMan = requestGroupMan;
+ }
+
static void resetGIDCounter() { _gidCounter = 0; }
static int32_t newGID();
diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc
index 442ecf6d..bf9a9206 100644
--- a/src/RequestGroupMan.cc
+++ b/src/RequestGroupMan.cc
@@ -83,7 +83,8 @@ RequestGroupMan::RequestGroupMan
_maxOverallDownloadSpeedLimit
(option->getAsInt(PREF_MAX_OVERALL_DOWNLOAD_LIMIT)),
_maxOverallUploadSpeedLimit(option->getAsInt(PREF_MAX_OVERALL_UPLOAD_LIMIT)),
- _xmlRpc(option->getAsBool(PREF_ENABLE_XML_RPC))
+ _xmlRpc(option->getAsBool(PREF_ENABLE_XML_RPC)),
+ _queueCheck(true)
{}
bool RequestGroupMan::downloadFinished()
@@ -497,6 +498,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
}
configureRequestGroup(groupToAdd);
createInitialCommand(groupToAdd, commands, e);
+ groupToAdd->setRequestGroupMan(this);
_requestGroups.push_back(groupToAdd);
++count;
e->addCommand(commands);
diff --git a/src/RequestGroupMan.h b/src/RequestGroupMan.h
index 6f63ca92..df112794 100644
--- a/src/RequestGroupMan.h
+++ b/src/RequestGroupMan.h
@@ -77,6 +77,8 @@ private:
// truf if XML-RPC is enabled.
bool _xmlRpc;
+ bool _queueCheck;
+
std::string
formatDownloadResult(const std::string& status,
const SharedHandle<DownloadResult>& downloadResult) const;
@@ -254,6 +256,24 @@ public:
{
_maxSimultaneousDownloads = max;
}
+
+ // Call this function if _requestGroups queue should be maintained.
+ // This function is added to reduce the call of maintenance, but at
+ // the same time, it provides fast maintenance reaction.
+ void requestQueueCheck()
+ {
+ _queueCheck = true;
+ }
+
+ void clearQueueCheck()
+ {
+ _queueCheck = false;
+ }
+
+ bool queueCheckRequested() const
+ {
+ return _queueCheck;
+ }
};
typedef SharedHandle<RequestGroupMan> RequestGroupManHandle;