summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-02-25 00:34:50 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-02-25 00:34:50 +0900
commit655b59e350c830993f5e353ba7766ed46ab13e8b (patch)
treebdab1a7437c759a911670c877db5fadac6540e5b /src
parentf16aef227dc50ac7883e4e8e362aa274e0bee4e7 (diff)
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).
Diffstat (limited to 'src')
-rw-r--r--src/DHTGetPeersCommand.cc17
-rw-r--r--src/DHTGetPeersCommand.h2
2 files changed, 18 insertions, 1 deletions
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<unsigned long>(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<DHTTask> task_;
+ size_t numRetry_;
+
Timer lastGetPeerTime_;
public:
DHTGetPeersCommand(cuid_t cuid, RequestGroup* requestGroup,