Преглед на файлове

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();