瀏覽代碼

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).
Tatsuhiro Tsujikawa 14 年之前
父節點
當前提交
655b59e350
共有 2 個文件被更改,包括 18 次插入1 次删除
  1. 16 1
      src/DHTGetPeersCommand.cc
  2. 2 0
      src/DHTGetPeersCommand.h

+ 16 - 1
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();
   }
 

+ 2 - 0
src/DHTGetPeersCommand.h

@@ -66,6 +66,8 @@ private:
 
   SharedHandle<DHTTask> task_;
 
+  size_t numRetry_;
+
   Timer lastGetPeerTime_;
 public:
   DHTGetPeersCommand(cuid_t cuid, RequestGroup* requestGroup,