Sfoglia il codice sorgente

Download rate based strategy to increase outstanding request

This strategy performs better than old one in high latency
environment.
Tatsuhiro Tsujikawa 12 anni fa
parent
commit
53dde0a9ae
3 ha cambiato i file con 25 aggiunte e 10 eliminazioni
  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();