summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-06-28 00:18:53 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-06-28 00:21:29 +0900
commit2906484345007c734c3ff75a6080fbab2d8f1a05 (patch)
tree080529237cc23b060de04e4c29d2c9e246736861 /src/AbstractCommand.cc
parentba6ab142352be06f518b46a489ec7a7809613e75 (diff)
Use ServerStat to find faster server.
Diffstat (limited to 'src/AbstractCommand.cc')
-rw-r--r--src/AbstractCommand.cc49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index b7f246b5..d85d7ac1 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -92,7 +92,8 @@ AbstractCommand::AbstractCommand
socketRecvBuffer_(socketRecvBuffer),
checkSocketIsReadable_(false), checkSocketIsWritable_(false),
nameResolverCheck_(false),
- incNumConnection_(incNumConnection)
+ incNumConnection_(incNumConnection),
+ serverStatTimer_(global::wallclock)
{
if(socket_ && socket_->isOpen()) {
setReadCheckSocket(socket_);
@@ -117,6 +118,22 @@ AbstractCommand::~AbstractCommand() {
}
}
+void AbstractCommand::useFasterRequest
+(const SharedHandle<Request>& fasterRequest)
+{
+ A2_LOG_INFO(fmt("CUID#%lld - Use faster Request hostname=%s, port=%u",
+ getCuid(),
+ fasterRequest->getHost().c_str(),
+ fasterRequest->getPort()));
+ // Cancel current Request object and use faster one.
+ fileEntry_->removeRequest(req_);
+ Command* command =
+ InitiateConnectionCommandFactory::createInitiateConnectionCommand
+ (getCuid(), fasterRequest, fileEntry_, requestGroup_, e_);
+ e_->setNoWait(true);
+ e_->addCommand(command);
+}
+
bool AbstractCommand::execute() {
A2_LOG_DEBUG(fmt("CUID#%lld - socket: read:%d, write:%d, hup:%d, err:%d",
getCuid(),
@@ -158,17 +175,25 @@ bool AbstractCommand::execute() {
!getPieceStorage()->hasMissingUnusedPiece()) {
SharedHandle<Request> fasterRequest = fileEntry_->findFasterRequest(req_);
if(fasterRequest) {
- A2_LOG_INFO(fmt("CUID#%lld - Use faster Request hostname=%s, port=%u",
- getCuid(),
- fasterRequest->getHost().c_str(),
- fasterRequest->getPort()));
- // Cancel current Request object and use faster one.
- fileEntry_->removeRequest(req_);
- Command* command =
- InitiateConnectionCommandFactory::createInitiateConnectionCommand
- (getCuid(), fasterRequest, fileEntry_, requestGroup_, e_);
- e_->setNoWait(true);
- e_->addCommand(command);
+ useFasterRequest(fasterRequest);
+ return true;
+ }
+ }
+ // Don't use this feature if PREF_MAX_{OVERALL_}DOWNLOAD_LIMIT
+ // is used
+ if(e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 &&
+ requestGroup_->getMaxDownloadSpeedLimit() == 0 &&
+ serverStatTimer_.difference(global::wallclock) >= 10) {
+ serverStatTimer_ = global::wallclock;
+ std::vector<std::pair<size_t, std::string> > usedHosts;
+ if(getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) {
+ getDownloadEngine()->getRequestGroupMan()->getUsedHosts(usedHosts);
+ }
+ SharedHandle<Request> fasterRequest =
+ fileEntry_->findFasterRequest
+ (req_, usedHosts, e_->getRequestGroupMan()->getServerStatMan());
+ if(fasterRequest) {
+ useFasterRequest(fasterRequest);
return true;
}
}