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
pull/1/head
Tatsuhiro Tsujikawa 2009-04-05 10:38:15 +00:00
parent 8831819407
commit becd34bcb9
5 changed files with 25 additions and 23 deletions

View File

@ -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> 2009-04-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
* Release 1.3.0 * Release 1.3.0

View File

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

View File

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

View File

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

View File

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