Browse Source

2009-04-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Fixed the bug that removed peer's session upload/download length
	are counted twice in _cachedTransferStat before it is
	re-calculated.  This affected the calculation of shara ratio,
	resulting aria2 wrongly determines that specified share ratio is
	reached. Also fixed the typo in calculateStatFor function name.
	* src/BtSetup.cc
	* src/DefaultPeerStorage.cc
	* src/ShareRatioSeedCriteria.h
	* test/ShareRatioSeedCriteriaTest.cc
Tatsuhiro Tsujikawa 16 years ago
parent
commit
becd34bcb9
5 changed files with 25 additions and 23 deletions
  1. 12 0
      ChangeLog
  2. 1 1
      src/BtSetup.cc
  3. 9 6
      src/DefaultPeerStorage.cc
  4. 2 10
      src/ShareRatioSeedCriteria.h
  5. 1 6
      test/ShareRatioSeedCriteriaTest.cc

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+2009-04-05  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Fixed the bug that removed peer's session upload/download length
+	are counted twice in _cachedTransferStat before it is
+	re-calculated.  This affected the calculation of shara ratio,
+	resulting aria2 wrongly determines that specified share ratio is
+	reached. Also fixed the typo in calculateStatFor function name.
+	* src/BtSetup.cc
+	* src/DefaultPeerStorage.cc
+	* src/ShareRatioSeedCriteria.h
+	* test/ShareRatioSeedCriteriaTest.cc
+
 2009-04-01  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	* Release 1.3.0

+ 1 - 1
src/BtSetup.cc

@@ -57,6 +57,7 @@
 #include "DHTRegistry.h"
 #include "BtProgressInfoFile.h"
 #include "BtAnnounce.h"
+#include "BtRuntime.h"
 
 namespace aria2 {
 
@@ -136,7 +137,6 @@ void BtSetup::setup(std::deque<Command*>& commands,
 				    btContext));
       cri->setPieceStorage(pieceStorage);
       cri->setPeerStorage(peerStorage);
-      cri->setBtRuntime(btRuntime);
 
       unionCri->addSeedCriteria(cri);
     }

+ 9 - 6
src/DefaultPeerStorage.cc

@@ -192,7 +192,7 @@ void DefaultPeerStorage::getActivePeers(std::deque<SharedHandle<Peer> >& activeP
   std::for_each(peers.begin(), peers.end(), CollectActivePeer(activePeers));
 }
 
-static TransferStat caluclateStatFor(const SharedHandle<Peer>& peer)
+static TransferStat calculateStatFor(const SharedHandle<Peer>& peer)
 {
   struct timeval now;
   gettimeofday(&now, 0);
@@ -223,7 +223,7 @@ TransferStat DefaultPeerStorage::calculateStat()
       s.sessionDownloadLength = (*i)->getSessionDownloadLength();
       s.sessionUploadLength = (*i)->getSessionUploadLength();
 
-      _peerTransferStatMap[(*i)->getID()] = caluclateStatFor(*i);
+      _peerTransferStatMap[(*i)->getID()] = calculateStatFor(*i);
       stat += s;
     }
     _cachedTransferStat = stat;
@@ -240,8 +240,8 @@ TransferStat DefaultPeerStorage::calculateStat()
 void DefaultPeerStorage::updateTransferStatFor(const SharedHandle<Peer>& peer)
 {
   logger->debug("Updating TransferStat for peer %s", peer->getID().c_str());
-  _cachedTransferStat = _cachedTransferStat-_peerTransferStatMap[peer->getID()];
-  TransferStat s = caluclateStatFor(peer);
+  _cachedTransferStat -= _peerTransferStatMap[peer->getID()];
+  TransferStat s = calculateStatFor(peer);
   _cachedTransferStat += s;
   _peerTransferStatMap[peer->getID()] = s;
 }
@@ -266,8 +266,11 @@ void DefaultPeerStorage::onErasingPeer(const SharedHandle<Peer>& peer) {}
 void DefaultPeerStorage::onReturningPeer(const SharedHandle<Peer>& peer)
 {
   if(peer->isActive()) {
-    removedPeerSessionDownloadLength += peer->getSessionDownloadLength();
-    removedPeerSessionUploadLength += peer->getSessionUploadLength();
+    TransferStat removedStat(calculateStatFor(peer));
+    removedPeerSessionDownloadLength += removedStat.getSessionDownloadLength();
+    removedPeerSessionUploadLength += removedStat.getSessionUploadLength();
+    _cachedTransferStat -= removedStat;
+
     // Execute choking algorithm if unchoked and interested peer is
     // disconnected.
     if(!peer->amChoking() && peer->peerInterested()) {

+ 2 - 10
src/ShareRatioSeedCriteria.h

@@ -39,7 +39,6 @@
 #include "BtContext.h"
 #include "PeerStorage.h"
 #include "PieceStorage.h"
-#include "BtRuntime.h"
 
 namespace aria2 {
 
@@ -49,7 +48,6 @@ private:
   SharedHandle<BtContext> btContext;
   SharedHandle<PeerStorage> _peerStorage;
   SharedHandle<PieceStorage> _pieceStorage;
-  SharedHandle<BtRuntime> _btRuntime;
 public:
   ShareRatioSeedCriteria(double ratio, const SharedHandle<BtContext>& btContext)
     :ratio(ratio),
@@ -64,10 +62,9 @@ public:
       return false;
     }
     TransferStat stat = _peerStorage->calculateStat();
-    uint64_t allTimeUploadLength =
-      _btRuntime->getUploadLengthAtStartup()+stat.getSessionUploadLength();
     return ratio <=
-      ((double)allTimeUploadLength)/_pieceStorage->getCompletedLength();
+      (double)stat.getAllTimeUploadLength()/
+       _pieceStorage->getCompletedLength();
   }
 
   void setRatio(double ratio) {
@@ -87,11 +84,6 @@ public:
   {
     _pieceStorage = pieceStorage;
   }
-
-  void setBtRuntime(const SharedHandle<BtRuntime>& btRuntime)
-  {
-    _btRuntime = btRuntime;
-  }
 };
 
 } // namespace aria2

+ 1 - 6
test/ShareRatioSeedCriteriaTest.cc

@@ -30,13 +30,9 @@ void ShareRatioSeedCriteriaTest::testEvaluate() {
   btContext->setTotalLength(1000000);
   btContext->setInfoHash((const unsigned char*)infoHash.c_str());
   
-  SharedHandle<BtRuntime> btRuntime(new BtRuntime());
-  btRuntime->setUploadLengthAtStartup(500000);
-  
   SharedHandle<MockPeerStorage> peerStorage(new MockPeerStorage());
   TransferStat stat;
-  stat.setSessionDownloadLength(1000000);
-  stat.setSessionUploadLength(500000);
+  stat.setAllTimeUploadLength(1000000);
   peerStorage->setStat(stat);
 
   SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
@@ -45,7 +41,6 @@ void ShareRatioSeedCriteriaTest::testEvaluate() {
   ShareRatioSeedCriteria cri(1.0, btContext);
   cri.setPeerStorage(peerStorage);
   cri.setPieceStorage(pieceStorage);
-  cri.setBtRuntime(btRuntime);
 
   CPPUNIT_ASSERT(cri.evaluate());