Explorar el Código

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 hace 14 años
padre
commit
655b59e350
Se han modificado 2 ficheros con 18 adiciones y 1 borrados
  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,