Browse Source

Fasten seed/download on fast connection

Tatsuhiro Tsujikawa 9 năm trước cách đây
mục cha
commit
482cf6aca4

+ 1 - 0
src/DefaultBtInteractive.cc

@@ -189,6 +189,7 @@ void DefaultBtInteractive::doPostHandshakeProcessing()
   if (!metadataGetMode_) {
     addAllowedFastMessageToQueue();
   }
+  peerStorage_->scheduleForcedChokeRound();
   sendPendingMessage();
 }
 

+ 12 - 6
src/DefaultPeerStorage.cc

@@ -62,7 +62,8 @@ DefaultPeerStorage::DefaultPeerStorage()
     : maxPeerListSize_(MAX_PEER_LIST_SIZE),
       seederStateChoke_(make_unique<BtSeederStateChoke>()),
       leecherStateChoke_(make_unique<BtLeecherStateChoke>()),
-      lastTransferStatMapUpdated_(Timer::zero())
+      lastTransferStatMapUpdated_(Timer::zero()),
+      forceChokeRound_(false)
 {
 }
 
@@ -284,16 +285,21 @@ void DefaultPeerStorage::returnPeer(const std::shared_ptr<Peer>& peer)
 bool DefaultPeerStorage::chokeRoundIntervalElapsed()
 {
   constexpr auto CHOKE_ROUND_INTERVAL = 10_s;
+  auto forceChokeRound = forceChokeRound_;
+  forceChokeRound_ = false;
+
   if (pieceStorage_->downloadFinished()) {
+    auto interval = forceChokeRound ? 1_s : CHOKE_ROUND_INTERVAL;
     return seederStateChoke_->getLastRound().difference(global::wallclock()) >=
-           CHOKE_ROUND_INTERVAL;
-  }
-  else {
-    return leecherStateChoke_->getLastRound().difference(global::wallclock()) >=
-           CHOKE_ROUND_INTERVAL;
+           interval;
   }
+
+  return leecherStateChoke_->getLastRound().difference(global::wallclock()) >=
+         CHOKE_ROUND_INTERVAL;
 }
 
+void DefaultPeerStorage::scheduleForcedChokeRound() { forceChokeRound_ = true; }
+
 void DefaultPeerStorage::executeChoke()
 {
   if (pieceStorage_->downloadFinished()) {

+ 4 - 0
src/DefaultPeerStorage.h

@@ -74,6 +74,8 @@ private:
   std::map<std::string, Timer> badPeers_;
   Timer lastBadPeerCleaned_;
 
+  bool forceChokeRound_;
+
   bool isPeerAlreadyAdded(const std::shared_ptr<Peer>& peer);
   void addUniqPeer(const std::shared_ptr<Peer>& peer);
 
@@ -113,6 +115,8 @@ public:
 
   virtual bool chokeRoundIntervalElapsed() CXX11_OVERRIDE;
 
+  virtual void scheduleForcedChokeRound() CXX11_OVERRIDE;
+
   virtual void executeChoke() CXX11_OVERRIDE;
 
   void deleteUnusedPeer(size_t delSize);

+ 12 - 18
src/PeerInteractionCommand.cc

@@ -347,29 +347,23 @@ bool PeerInteractionCommand::executeInternal()
       if (btInteractive_->countReceivedMessageInIteration() > 0) {
         updateKeepAlive();
       }
-      if ((getPeer()->amInterested() && !getPeer()->peerChoking()) ||
-          btInteractive_->countOutstandingRequest() ||
-          (getPeer()->peerInterested() && !getPeer()->amChoking())) {
 
-        // Writable check to avoid slow seeding
-        if (btInteractive_->isSendingMessageInProgress()) {
-          setWriteCheckSocket(getSocket());
-        }
+      // Writable check to avoid slow seeding
+      if (btInteractive_->isSendingMessageInProgress()) {
+        setWriteCheckSocket(getSocket());
+      }
 
-        if (getDownloadEngine()
-                ->getRequestGroupMan()
-                ->doesOverallDownloadSpeedExceed() ||
-            requestGroup_->doesDownloadSpeedExceed()) {
-          disableReadCheckSocket();
-          setNoCheck(true);
-        }
-        else {
-          setReadCheckSocket(getSocket());
-        }
+      if (getDownloadEngine()
+              ->getRequestGroupMan()
+              ->doesOverallDownloadSpeedExceed() ||
+          requestGroup_->doesDownloadSpeedExceed()) {
+        disableReadCheckSocket();
+        setNoCheck(true);
       }
       else {
-        disableReadCheckSocket();
+        setReadCheckSocket(getSocket());
       }
+
       done = true;
       break;
     }

+ 5 - 0
src/PeerStorage.h

@@ -113,6 +113,11 @@ public:
 
   virtual bool chokeRoundIntervalElapsed() = 0;
 
+  /**
+   * Schedules choke round forcibly.
+   */
+  virtual void scheduleForcedChokeRound() = 0;
+
   virtual void executeChoke() = 0;
 };
 

+ 2 - 0
test/MockPeerStorage.h

@@ -84,6 +84,8 @@ public:
 
   virtual bool chokeRoundIntervalElapsed() CXX11_OVERRIDE { return false; }
 
+  virtual void scheduleForcedChokeRound() CXX11_OVERRIDE {}
+
   virtual void executeChoke() CXX11_OVERRIDE { ++numChokeExecuted_; }
 
   int getNumChokeExecuted() const { return numChokeExecuted_; }