From 655b59e350c830993f5e353ba7766ed46ab13e8b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 25 Feb 2011 00:34:50 +0900 Subject: [PATCH] Retry get_peers if connection is low. To eliminate unresponsive node, we have to contact them 5 times. Therefore the maximum number of retry is 10. It is very annoying when it takes some time to get first peer, so retry quickly (5 seconds delay). --- src/DHTGetPeersCommand.cc | 17 ++++++++++++++++- src/DHTGetPeersCommand.h | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/DHTGetPeersCommand.cc b/src/DHTGetPeersCommand.cc index 26bbd1eb..7c53df86 100644 --- a/src/DHTGetPeersCommand.cc +++ b/src/DHTGetPeersCommand.cc @@ -59,6 +59,10 @@ const time_t GET_PEER_INTERVAL = (15*60); const time_t GET_PEER_INTERVAL_LOW = (5*60); // Interval when the peer list is empty. const time_t GET_PEER_INTERVAL_ZERO = 60; +// Interval for retry. +const time_t GET_PEER_INTERVAL_RETRY = 5; +// Maximum retries. Try more than 5 to drop bad node. +const size_t MAX_RETRIES = 10; } // namespace @@ -69,6 +73,7 @@ DHTGetPeersCommand::DHTGetPeersCommand : Command(cuid), requestGroup_(requestGroup), e_(e), + numRetry_(0), lastGetPeerTime_(0) { requestGroup_->increaseNumCommand(); @@ -87,7 +92,9 @@ bool DHTGetPeersCommand::execute() time_t elapsed = lastGetPeerTime_.difference(global::wallclock); if(!task_ && (elapsed >= GET_PEER_INTERVAL || - (((btRuntime_->lessThanMinPeers() && elapsed >= GET_PEER_INTERVAL_LOW) || + (((btRuntime_->lessThanMinPeers() && + ((numRetry_ && elapsed >= GET_PEER_INTERVAL_RETRY) || + elapsed >= GET_PEER_INTERVAL_LOW)) || (btRuntime_->getConnections() == 0 && elapsed >= GET_PEER_INTERVAL_ZERO)) && !requestGroup_->downloadFinished()))) { @@ -98,7 +105,15 @@ bool DHTGetPeersCommand::execute() (requestGroup_->getDownloadContext(), btRuntime_, peerStorage_); taskQueue_->addPeriodicTask2(task_); } else if(task_ && task_->finished()) { + A2_LOG_DEBUG("task finished detected"); lastGetPeerTime_ = global::wallclock; + if(numRetry_ < MAX_RETRIES && btRuntime_->lessThanMinPeers()) { + ++numRetry_; + A2_LOG_DEBUG(fmt("Too few peers. Try again(%lu)", + static_cast(numRetry_))); + } else { + numRetry_ = 0; + } task_.reset(); } diff --git a/src/DHTGetPeersCommand.h b/src/DHTGetPeersCommand.h index 2ff07215..145351e2 100644 --- a/src/DHTGetPeersCommand.h +++ b/src/DHTGetPeersCommand.h @@ -66,6 +66,8 @@ private: SharedHandle task_; + size_t numRetry_; + Timer lastGetPeerTime_; public: DHTGetPeersCommand(cuid_t cuid, RequestGroup* requestGroup,