Tatsuhiro Tsujikawa 19 gadi atpakaļ
vecāks
revīzija
d6100c7507

+ 16 - 28
src/PeerChokeCommand.cc

@@ -44,36 +44,26 @@ void PeerChokeCommand::optUnchokingPeer(Peers& peers) const {
   }
   Peer* peer = peers.front();
   peer->optUnchoking = true;
-  /*
-  Peers::iterator itr = peers.begin();
-  for(;itr != peers.end(); itr++) {
-    if((*itr)->optUnchoking) {
-      break;
-    }
-  }
-  if(itr != peers.end()) {
-    (*itr)->optUnchoking = false;
-    itr++;
-  }
-  if(itr == peers.end()) {
-    itr = peers.begin();
-  }
-  (*itr)->optUnchoking = true;
-  */
   logger->debug("opt, unchoking %s, delta=%d",
 		peer->ipaddr.c_str(), peer->getDeltaUpload());
-}
-
-void PeerChokeCommand::setAllPeerResetDeltaUpload(Peers& peers) const {
-  for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) {
-    Peer* peer = *itr;
-    peer->resetDeltaUpload();
+  if(e->torrentMan->isEndGame()) {
+    Peers::iterator itr = peers.begin()+1;
+    for(; itr != peers.end(); itr++) {
+      Peer* peer = *itr;
+      if(peer->amInterested && peer->peerInterested) {
+	peer->optUnchoking = true;
+	logger->debug("opt, unchoking %s, delta=%d",
+		      peer->ipaddr.c_str(), peer->getDeltaUpload());
+	break;
+      }
+    }
   }
 }
 
-void PeerChokeCommand::setAllPeerResetDeltaDownload(Peers& peers) const {
+void PeerChokeCommand::setAllPeerResetDelta(Peers& peers) const {
   for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) {
     Peer* peer = *itr;
+    peer->resetDeltaUpload();
     peer->resetDeltaDownload();
   }
 }
@@ -113,6 +103,7 @@ bool PeerChokeCommand::execute() {
     Peer* peer = *itr;
     if(peer->peerInterested) {
       peer->chokingRequired = false;
+      peer->optUnchoking = false;
       itr = peers.erase(itr);
       unchokingCount--;
       logger->debug("cat01, unchoking %s, delta=%d", peer->ipaddr.c_str(), peer->getDeltaUpload());
@@ -124,6 +115,7 @@ bool PeerChokeCommand::execute() {
     Peer* peer = *itr;
     if(!peer->peerInterested) {
       peer->chokingRequired = false;
+      peer->optUnchoking = false;
       itr = peers.erase(itr);
       logger->debug("cat02, unchoking %s, delta=%d", peer->ipaddr.c_str(), peer->getDeltaUpload());
       break;
@@ -136,11 +128,7 @@ bool PeerChokeCommand::execute() {
     rotate = 0;
   }
   rotate++;
-  if(e->torrentMan->downloadComplete()) {
-    setAllPeerResetDeltaDownload(e->torrentMan->getActivePeers());
-  } else {
-    setAllPeerResetDeltaUpload(e->torrentMan->getActivePeers());
-  }
+  setAllPeerResetDelta(e->torrentMan->getActivePeers());
 
   SleepCommand* command = new SleepCommand(cuid, e, this, interval);
   e->commands.push(command);

+ 1 - 2
src/PeerChokeCommand.h

@@ -34,8 +34,7 @@ private:
   void orderByUploadRate(Peers& peers) const;
   void orderByDownloadRate(Peers& peers) const;
   void setAllPeerChoked(Peers& peers) const;
-  void setAllPeerResetDeltaUpload(Peers& peers) const;
-  void setAllPeerResetDeltaDownload(Peers& peers) const;
+  void setAllPeerResetDelta(Peers& peers) const;
   void optUnchokingPeer(Peers& peers) const;
 
 public:

+ 1 - 1
src/PeerInteractionCommand.cc

@@ -333,7 +333,7 @@ Piece PeerInteractionCommand::getNewPieceAndSendInterest() {
     PendingMessage pendingMessage(PeerMessage::NOT_INTERESTED, peerConnection);
     sendMessageQueue->addPendingMessage(pendingMessage);
   } else {
-    logger->debug("CUID#%d - starting download for piece index=%d", cuid, piece.getIndex());
+    logger->debug("CUID#%d - starting download for piece index=%d (%d/%d completed)", cuid, piece.getIndex(), piece.countCompleteBlock(), piece.countBlock());
     logger->debug("CUID#%d - try to send interested", cuid);
     PendingMessage pendingMessage(PeerMessage::INTERESTED, peerConnection);
     sendMessageQueue->addPendingMessage(pendingMessage);

+ 4 - 2
src/TorrentDownloadEngine.cc

@@ -96,8 +96,10 @@ void TorrentDownloadEngine::calculateStatistics() {
     totalLength = torrentMan->getTotalLength();
   }
   
-  downloadSpeed = calculateSpeed(sessionDownloadLengthArray[currentCp], elapsed);
-  uploadSpeed = calculateSpeed(sessionUploadLengthArray[currentCp], elapsed);
+  if(elapsed > 0) {
+    downloadSpeed = calculateSpeed(sessionDownloadLengthArray[currentCp], elapsed);
+    uploadSpeed = calculateSpeed(sessionUploadLengthArray[currentCp], elapsed);
+  }
 
   if(elapsed-lastElapsed >= 1) {
     avgSpeed = calculateSpeed(sessionDownloadLength,

+ 1 - 0
src/TorrentDownloadEngine.h

@@ -68,6 +68,7 @@ public:
 
   // returns uploading speed in byte/sec.
   int getUploadSpeed() const { return uploadSpeed; }
+  int getDownloadSpeed() const { return downloadSpeed; }
 };
 
 #endif // _D_TORRENT_DOWNLOAD_ENGINE_H_