浏览代码

Download rate based strategy to increase outstanding request

This strategy performs better than old one in high latency
environment.
Tatsuhiro Tsujikawa 12 年之前
父节点
当前提交
53dde0a9ae
共有 3 个文件被更改,包括 25 次插入10 次删除
  1. 2 2
      src/BtConstants.h
  2. 21 8
      src/DefaultBtInteractive.cc
  3. 2 0
      src/DefaultBtInteractive.h

+ 2 - 2
src/BtConstants.h

@@ -48,12 +48,12 @@
 
 #define MAX_BLOCK_LENGTH (16*1024)
 
-#define DEFAULT_MAX_OUTSTANDING_REQUEST 6
+#define DEFAULT_MAX_OUTSTANDING_REQUEST 2
 
 #define OUTSTANDING_REQUEST_STEP 6
 
 // Upper Bound of the number of outstanding request
-#define UB_MAX_OUTSTANDING_REQUEST 256
+#define UB_MAX_OUTSTANDING_REQUEST 512
 
 #define METADATA_PIECE_SIZE (16*1024)
 

+ 21 - 8
src/DefaultBtInteractive.cc

@@ -98,7 +98,8 @@ DefaultBtInteractive::DefaultBtInteractive
     maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST),
     requestGroupMan_(0),
     tcpPort_(0),
-    haveLastSent_(global::wallclock())
+    haveLastSent_(global::wallclock()),
+    baseSpeed_(0)
 {}
 
 DefaultBtInteractive::~DefaultBtInteractive() {}
@@ -321,13 +322,25 @@ size_t DefaultBtInteractive::receiveMessages() {
       break;
     }
   }
-  if(!pieceStorage_->isEndGame() &&
-     countOldOutstandingRequest > dispatcher_->countOutstandingRequest() &&
-     (countOldOutstandingRequest - dispatcher_->countOutstandingRequest())*2 >=
-     maxOutstandingRequest_) {
-    maxOutstandingRequest_ =
-      std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
-               maxOutstandingRequest_+OUTSTANDING_REQUEST_STEP);
+
+  if(!pieceStorage_->isEndGame() && !pieceStorage_->downloadFinished()) {
+    if(baseSpeed_ == 0) {
+      if(countOldOutstandingRequest &&
+         dispatcher_->countOutstandingRequest() == 0) {
+        baseSpeed_ = peer_->calculateDownloadSpeed();
+        maxOutstandingRequest_ *= 2;
+      }
+    } else {
+      int speed = peer_->calculateDownloadSpeed();
+      // Double the number of outstanding request if 20% download rate
+      // increase is observed.
+      if(baseSpeed_*12 <= speed*10) {
+        maxOutstandingRequest_ =
+          std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
+                   maxOutstandingRequest_*2);
+        baseSpeed_ = speed;
+      }
+    }
   }
   return msgcount;
 }

+ 2 - 0
src/DefaultBtInteractive.h

@@ -149,6 +149,8 @@ private:
   std::vector<size_t> haveIndexes_;
   Timer haveLastSent_;
 
+  int baseSpeed_;
+
   static const time_t FLOODING_CHECK_INTERVAL = 5;
 
   void addBitfieldMessageToQueue();