summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-04-05 10:38:15 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-04-05 10:38:15 +0000
commitbecd34bcb9eae1aecd6b1ec2a79f8990aee04ec6 (patch)
tree9b6c22edebc9a0f671062e78c99252a3219f9a7d
parent88318194070be9b14ee2295919c2c211b7fd501d (diff)
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
-rw-r--r--ChangeLog12
-rw-r--r--src/BtSetup.cc2
-rw-r--r--src/DefaultPeerStorage.cc15
-rw-r--r--src/ShareRatioSeedCriteria.h12
-rw-r--r--test/ShareRatioSeedCriteriaTest.cc7
5 files changed, 25 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 101360c9..c1a64a29 100644
--- a/ChangeLog
+++ b/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
diff --git a/src/BtSetup.cc b/src/BtSetup.cc
index 8ed29674..033e9b6a 100644
--- a/src/BtSetup.cc
+++ b/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);
}
diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc
index c13f6b41..a8e8df8e 100644
--- a/src/DefaultPeerStorage.cc
+++ b/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()) {
diff --git a/src/ShareRatioSeedCriteria.h b/src/ShareRatioSeedCriteria.h
index 41a8ae92..d09d5219 100644
--- a/src/ShareRatioSeedCriteria.h
+++ b/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
diff --git a/test/ShareRatioSeedCriteriaTest.cc b/test/ShareRatioSeedCriteriaTest.cc
index 13db47c1..8b5d8a15 100644
--- a/test/ShareRatioSeedCriteriaTest.cc
+++ b/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());