diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-06-28 00:18:53 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-06-28 00:21:29 +0900 |
| commit | 2906484345007c734c3ff75a6080fbab2d8f1a05 (patch) | |
| tree | 080529237cc23b060de04e4c29d2c9e246736861 /src/AbstractCommand.cc | |
| parent | ba6ab142352be06f518b46a489ec7a7809613e75 (diff) | |
Use ServerStat to find faster server.
Diffstat (limited to 'src/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 49 |
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; } } |
