From 4736e77acfc728176591f677cd2c973ef1d71098 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 23 Jun 2010 11:55:23 +0000 Subject: [PATCH] 2010-06-23 Tatsuhiro Tsujikawa Request ut_metadata in end-game mode(in other words, more aggresively) * src/HandshakeExtensionMessage.cc * src/Peer.cc * src/Peer.h * src/PeerSessionResource.cc * src/PeerSessionResource.h * src/UTMetadataRequestFactory.cc * test/UTMetadataRequestFactoryTest.cc --- ChangeLog | 12 ++++++++++++ src/HandshakeExtensionMessage.cc | 9 ++++++++- src/Peer.cc | 6 ++++++ src/Peer.h | 2 ++ src/PeerSessionResource.cc | 6 ++++++ src/PeerSessionResource.h | 2 ++ src/UTMetadataRequestFactory.cc | 17 +++++++---------- test/UTMetadataRequestFactoryTest.cc | 26 +++++++++++++++----------- 8 files changed, 58 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index eca6ce98..9bd7e1fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2010-06-23 Tatsuhiro Tsujikawa + + Request ut_metadata in end-game mode(in other words, more + aggresively) + * src/HandshakeExtensionMessage.cc + * src/Peer.cc + * src/Peer.h + * src/PeerSessionResource.cc + * src/PeerSessionResource.h + * src/UTMetadataRequestFactory.cc + * test/UTMetadataRequestFactoryTest.cc + 2010-06-22 Tatsuhiro Tsujikawa Added missing parameter to log message. diff --git a/src/HandshakeExtensionMessage.cc b/src/HandshakeExtensionMessage.cc index 5a743de2..20c2e621 100644 --- a/src/HandshakeExtensionMessage.cc +++ b/src/HandshakeExtensionMessage.cc @@ -123,6 +123,11 @@ void HandshakeExtensionMessage::doReceivedAction() if(metadataSize_ != attrs->metadataSize) { throw DL_ABORT_EX("Wrong metadata_size. Which one is correct!?"); } + if(!peer_->isSeeder()) { + peer_->reconfigureSessionResource(dctx_->getPieceLength(), + dctx_->getTotalLength()); + peer_->setAllBitfield(); + } } else { attrs->metadataSize = metadataSize_; dctx_->getFirstFileEntry()->setLength(metadataSize_); @@ -131,7 +136,9 @@ void HandshakeExtensionMessage::doReceivedAction() SharedHandle pieceStorage = dctx_->getOwnerRequestGroup()->getPieceStorage(); - pieceStorage->setEndGamePieceNum(0); + peer_->reconfigureSessionResource(dctx_->getPieceLength(), + dctx_->getTotalLength()); + peer_->setAllBitfield(); } } else if(attrs->metadata.empty()) { throw DL_ABORT_EX("Peer didn't provide metadata_size." diff --git a/src/Peer.cc b/src/Peer.cc index 8955d4e3..84fa887e 100644 --- a/src/Peer.cc +++ b/src/Peer.cc @@ -80,6 +80,12 @@ void Peer::allocateSessionResource(size_t pieceLength, uint64_t totalLength) res_->getPeerStat().downloadStart(); } +void Peer::reconfigureSessionResource(size_t pieceLength, uint64_t totalLength) +{ + assert(res_); + res_->reconfigure(pieceLength, totalLength); +} + void Peer::releaseSessionResource() { delete res_; diff --git a/src/Peer.h b/src/Peer.h index f8dd168e..5ab040ad 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -159,6 +159,8 @@ public: void allocateSessionResource(size_t pieceLength, uint64_t totalLength); + void reconfigureSessionResource(size_t pieceLength, uint64_t totalLength); + void releaseSessionResource(); const Timer& getFirstContactTime() const diff --git a/src/PeerSessionResource.cc b/src/PeerSessionResource.cc index daae8bf7..f6a8dd78 100644 --- a/src/PeerSessionResource.cc +++ b/src/PeerSessionResource.cc @@ -273,4 +273,10 @@ size_t PeerSessionResource::countOutstandingUpload() const return dispatcher_->countOutstandingUpload(); } +void PeerSessionResource::reconfigure(size_t pieceLength, uint64_t totalLenth) +{ + delete bitfieldMan_; + bitfieldMan_ = new BitfieldMan(pieceLength, totalLenth); +} + } // namespace aria2 diff --git a/src/PeerSessionResource.h b/src/PeerSessionResource.h index 4fe28d16..c20460bd 100644 --- a/src/PeerSessionResource.h +++ b/src/PeerSessionResource.h @@ -155,6 +155,8 @@ public: size_t getBitfieldLength() const; + void reconfigure(size_t index, uint64_t totalLength); + bool hasPiece(size_t index) const; void markSeeder(); diff --git a/src/UTMetadataRequestFactory.cc b/src/UTMetadataRequestFactory.cc index 8f075882..6ebc0e9c 100644 --- a/src/UTMetadataRequestFactory.cc +++ b/src/UTMetadataRequestFactory.cc @@ -52,26 +52,23 @@ void UTMetadataRequestFactory::create (std::vector >& msgs, size_t num, const SharedHandle& pieceStorage) { - for(size_t index = 0, numPieces = dctx_->getNumPieces(); - index < numPieces && num; ++index) { - SharedHandle p = pieceStorage->getMissingPiece(index); + while(num) { + SharedHandle p = pieceStorage->getMissingPiece(peer_); if(p.isNull()) { if(logger_->debug()) { - logger_->debug - ("ut_metadata piece %lu is used or already acquired.", - static_cast(index)); + logger_->debug("No ut_metadata piece is available to download."); } - continue; + break; } --num; if(logger_->debug()) { logger_->debug("Creating ut_metadata request index=%lu", - static_cast(index)); + static_cast(p->getIndex())); } SharedHandle m (new UTMetadataRequestExtensionMessage (peer_->getExtensionMessageID("ut_metadata"))); - m->setIndex(index); + m->setIndex(p->getIndex()); m->setDownloadContext(dctx_); m->setBtMessageDispatcher(dispatcher_); m->setBtMessageFactory(messageFactory_); @@ -79,7 +76,7 @@ void UTMetadataRequestFactory::create SharedHandle msg = messageFactory_->createBtExtendedMessage(m); msgs.push_back(msg); - tracker_->add(index); + tracker_->add(p->getIndex()); } } diff --git a/test/UTMetadataRequestFactoryTest.cc b/test/UTMetadataRequestFactoryTest.cc index 1958a7af..a304524f 100644 --- a/test/UTMetadataRequestFactoryTest.cc +++ b/test/UTMetadataRequestFactoryTest.cc @@ -1,6 +1,7 @@ #include "UTMetadataRequestFactory.h" #include +#include #include @@ -25,14 +26,17 @@ public: class MockPieceStorage2:public MockPieceStorage { public: - std::set missingIndexes; + std::deque missingIndexes; - virtual SharedHandle getMissingPiece(size_t index) + virtual SharedHandle getMissingPiece + (const SharedHandle& peer) { - if(missingIndexes.find(index) != missingIndexes.end()) { - return SharedHandle(new Piece(index, 0)); - } else { + if(missingIndexes.empty()) { return SharedHandle(); + } else { + size_t index = missingIndexes.front(); + missingIndexes.pop_front(); + return SharedHandle(new Piece(index, 0)); } } }; @@ -48,8 +52,8 @@ void UTMetadataRequestFactoryTest::testCreate() (new DownloadContext(METADATA_PIECE_SIZE, METADATA_PIECE_SIZE*2)); factory.setDownloadContext(dctx); SharedHandle ps(new MockPieceStorage2()); - ps->missingIndexes.insert(0); - ps->missingIndexes.insert(1); + ps->missingIndexes.push_back(0); + ps->missingIndexes.push_back(1); SharedHandle messageFactory (new WrapExtBtMessageFactory()); factory.setBtMessageFactory(messageFactory); @@ -65,11 +69,11 @@ void UTMetadataRequestFactoryTest::testCreate() factory.create(msgs, 1, ps); CPPUNIT_ASSERT_EQUAL((size_t)1, msgs.size()); - msgs.clear(); - - ps->missingIndexes.clear(); factory.create(msgs, 1, ps); - CPPUNIT_ASSERT_EQUAL((size_t)0, msgs.size()); + CPPUNIT_ASSERT_EQUAL((size_t)2, msgs.size()); + + factory.create(msgs, 1, ps); + CPPUNIT_ASSERT_EQUAL((size_t)2, msgs.size()); } } // namespace aria2