diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-23 11:55:23 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-23 11:55:23 +0000 |
| commit | 4736e77acfc728176591f677cd2c973ef1d71098 (patch) | |
| tree | dc3d6913df2ba3e5ca3e81986534a7df169e3ff7 /src | |
| parent | 3e98f0553319033a9a37190870541417ea3f3a1e (diff) | |
2010-06-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/HandshakeExtensionMessage.cc | 9 | ||||
| -rw-r--r-- | src/Peer.cc | 6 | ||||
| -rw-r--r-- | src/Peer.h | 2 | ||||
| -rw-r--r-- | src/PeerSessionResource.cc | 6 | ||||
| -rw-r--r-- | src/PeerSessionResource.h | 2 | ||||
| -rw-r--r-- | src/UTMetadataRequestFactory.cc | 17 |
6 files changed, 31 insertions, 11 deletions
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> 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_; @@ -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<SharedHandle<BtMessage> >& msgs, size_t num, const SharedHandle<PieceStorage>& pieceStorage) { - for(size_t index = 0, numPieces = dctx_->getNumPieces(); - index < numPieces && num; ++index) { - SharedHandle<Piece> p = pieceStorage->getMissingPiece(index); + while(num) { + SharedHandle<Piece> p = pieceStorage->getMissingPiece(peer_); if(p.isNull()) { if(logger_->debug()) { - logger_->debug - ("ut_metadata piece %lu is used or already acquired.", - static_cast<unsigned long>(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<unsigned long>(index)); + static_cast<unsigned long>(p->getIndex())); } SharedHandle<UTMetadataRequestExtensionMessage> 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<BtMessage> msg = messageFactory_->createBtExtendedMessage(m); msgs.push_back(msg); - tracker_->add(index); + tracker_->add(p->getIndex()); } } |
