mirror of https://github.com/aria2/aria2
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.ccpull/1/head
parent
3e98f05533
commit
4736e77acf
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
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
|
||||||
|
|
||||||
2010-06-22 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2010-06-22 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Added missing parameter to log message.
|
Added missing parameter to log message.
|
||||||
|
|
|
@ -123,6 +123,11 @@ void HandshakeExtensionMessage::doReceivedAction()
|
||||||
if(metadataSize_ != attrs->metadataSize) {
|
if(metadataSize_ != attrs->metadataSize) {
|
||||||
throw DL_ABORT_EX("Wrong metadata_size. Which one is correct!?");
|
throw DL_ABORT_EX("Wrong metadata_size. Which one is correct!?");
|
||||||
}
|
}
|
||||||
|
if(!peer_->isSeeder()) {
|
||||||
|
peer_->reconfigureSessionResource(dctx_->getPieceLength(),
|
||||||
|
dctx_->getTotalLength());
|
||||||
|
peer_->setAllBitfield();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
attrs->metadataSize = metadataSize_;
|
attrs->metadataSize = metadataSize_;
|
||||||
dctx_->getFirstFileEntry()->setLength(metadataSize_);
|
dctx_->getFirstFileEntry()->setLength(metadataSize_);
|
||||||
|
@ -131,7 +136,9 @@ void HandshakeExtensionMessage::doReceivedAction()
|
||||||
|
|
||||||
SharedHandle<PieceStorage> pieceStorage =
|
SharedHandle<PieceStorage> pieceStorage =
|
||||||
dctx_->getOwnerRequestGroup()->getPieceStorage();
|
dctx_->getOwnerRequestGroup()->getPieceStorage();
|
||||||
pieceStorage->setEndGamePieceNum(0);
|
peer_->reconfigureSessionResource(dctx_->getPieceLength(),
|
||||||
|
dctx_->getTotalLength());
|
||||||
|
peer_->setAllBitfield();
|
||||||
}
|
}
|
||||||
} else if(attrs->metadata.empty()) {
|
} else if(attrs->metadata.empty()) {
|
||||||
throw DL_ABORT_EX("Peer didn't provide metadata_size."
|
throw DL_ABORT_EX("Peer didn't provide metadata_size."
|
||||||
|
|
|
@ -80,6 +80,12 @@ void Peer::allocateSessionResource(size_t pieceLength, uint64_t totalLength)
|
||||||
res_->getPeerStat().downloadStart();
|
res_->getPeerStat().downloadStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Peer::reconfigureSessionResource(size_t pieceLength, uint64_t totalLength)
|
||||||
|
{
|
||||||
|
assert(res_);
|
||||||
|
res_->reconfigure(pieceLength, totalLength);
|
||||||
|
}
|
||||||
|
|
||||||
void Peer::releaseSessionResource()
|
void Peer::releaseSessionResource()
|
||||||
{
|
{
|
||||||
delete res_;
|
delete res_;
|
||||||
|
|
|
@ -159,6 +159,8 @@ public:
|
||||||
|
|
||||||
void allocateSessionResource(size_t pieceLength, uint64_t totalLength);
|
void allocateSessionResource(size_t pieceLength, uint64_t totalLength);
|
||||||
|
|
||||||
|
void reconfigureSessionResource(size_t pieceLength, uint64_t totalLength);
|
||||||
|
|
||||||
void releaseSessionResource();
|
void releaseSessionResource();
|
||||||
|
|
||||||
const Timer& getFirstContactTime() const
|
const Timer& getFirstContactTime() const
|
||||||
|
|
|
@ -273,4 +273,10 @@ size_t PeerSessionResource::countOutstandingUpload() const
|
||||||
return dispatcher_->countOutstandingUpload();
|
return dispatcher_->countOutstandingUpload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PeerSessionResource::reconfigure(size_t pieceLength, uint64_t totalLenth)
|
||||||
|
{
|
||||||
|
delete bitfieldMan_;
|
||||||
|
bitfieldMan_ = new BitfieldMan(pieceLength, totalLenth);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -155,6 +155,8 @@ public:
|
||||||
|
|
||||||
size_t getBitfieldLength() const;
|
size_t getBitfieldLength() const;
|
||||||
|
|
||||||
|
void reconfigure(size_t index, uint64_t totalLength);
|
||||||
|
|
||||||
bool hasPiece(size_t index) const;
|
bool hasPiece(size_t index) const;
|
||||||
|
|
||||||
void markSeeder();
|
void markSeeder();
|
||||||
|
|
|
@ -52,26 +52,23 @@ void UTMetadataRequestFactory::create
|
||||||
(std::vector<SharedHandle<BtMessage> >& msgs, size_t num,
|
(std::vector<SharedHandle<BtMessage> >& msgs, size_t num,
|
||||||
const SharedHandle<PieceStorage>& pieceStorage)
|
const SharedHandle<PieceStorage>& pieceStorage)
|
||||||
{
|
{
|
||||||
for(size_t index = 0, numPieces = dctx_->getNumPieces();
|
while(num) {
|
||||||
index < numPieces && num; ++index) {
|
SharedHandle<Piece> p = pieceStorage->getMissingPiece(peer_);
|
||||||
SharedHandle<Piece> p = pieceStorage->getMissingPiece(index);
|
|
||||||
if(p.isNull()) {
|
if(p.isNull()) {
|
||||||
if(logger_->debug()) {
|
if(logger_->debug()) {
|
||||||
logger_->debug
|
logger_->debug("No ut_metadata piece is available to download.");
|
||||||
("ut_metadata piece %lu is used or already acquired.",
|
|
||||||
static_cast<unsigned long>(index));
|
|
||||||
}
|
}
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
--num;
|
--num;
|
||||||
if(logger_->debug()) {
|
if(logger_->debug()) {
|
||||||
logger_->debug("Creating ut_metadata request index=%lu",
|
logger_->debug("Creating ut_metadata request index=%lu",
|
||||||
static_cast<unsigned long>(index));
|
static_cast<unsigned long>(p->getIndex()));
|
||||||
}
|
}
|
||||||
SharedHandle<UTMetadataRequestExtensionMessage> m
|
SharedHandle<UTMetadataRequestExtensionMessage> m
|
||||||
(new UTMetadataRequestExtensionMessage
|
(new UTMetadataRequestExtensionMessage
|
||||||
(peer_->getExtensionMessageID("ut_metadata")));
|
(peer_->getExtensionMessageID("ut_metadata")));
|
||||||
m->setIndex(index);
|
m->setIndex(p->getIndex());
|
||||||
m->setDownloadContext(dctx_);
|
m->setDownloadContext(dctx_);
|
||||||
m->setBtMessageDispatcher(dispatcher_);
|
m->setBtMessageDispatcher(dispatcher_);
|
||||||
m->setBtMessageFactory(messageFactory_);
|
m->setBtMessageFactory(messageFactory_);
|
||||||
|
@ -79,7 +76,7 @@ void UTMetadataRequestFactory::create
|
||||||
|
|
||||||
SharedHandle<BtMessage> msg = messageFactory_->createBtExtendedMessage(m);
|
SharedHandle<BtMessage> msg = messageFactory_->createBtExtendedMessage(m);
|
||||||
msgs.push_back(msg);
|
msgs.push_back(msg);
|
||||||
tracker_->add(index);
|
tracker_->add(p->getIndex());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "UTMetadataRequestFactory.h"
|
#include "UTMetadataRequestFactory.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
#include <cppunit/extensions/HelperMacros.h>
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
@ -25,14 +26,17 @@ public:
|
||||||
|
|
||||||
class MockPieceStorage2:public MockPieceStorage {
|
class MockPieceStorage2:public MockPieceStorage {
|
||||||
public:
|
public:
|
||||||
std::set<size_t> missingIndexes;
|
std::deque<size_t> missingIndexes;
|
||||||
|
|
||||||
virtual SharedHandle<Piece> getMissingPiece(size_t index)
|
virtual SharedHandle<Piece> getMissingPiece
|
||||||
|
(const SharedHandle<Peer>& peer)
|
||||||
{
|
{
|
||||||
if(missingIndexes.find(index) != missingIndexes.end()) {
|
if(missingIndexes.empty()) {
|
||||||
return SharedHandle<Piece>(new Piece(index, 0));
|
|
||||||
} else {
|
|
||||||
return SharedHandle<Piece>();
|
return SharedHandle<Piece>();
|
||||||
|
} else {
|
||||||
|
size_t index = missingIndexes.front();
|
||||||
|
missingIndexes.pop_front();
|
||||||
|
return SharedHandle<Piece>(new Piece(index, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -48,8 +52,8 @@ void UTMetadataRequestFactoryTest::testCreate()
|
||||||
(new DownloadContext(METADATA_PIECE_SIZE, METADATA_PIECE_SIZE*2));
|
(new DownloadContext(METADATA_PIECE_SIZE, METADATA_PIECE_SIZE*2));
|
||||||
factory.setDownloadContext(dctx);
|
factory.setDownloadContext(dctx);
|
||||||
SharedHandle<MockPieceStorage2> ps(new MockPieceStorage2());
|
SharedHandle<MockPieceStorage2> ps(new MockPieceStorage2());
|
||||||
ps->missingIndexes.insert(0);
|
ps->missingIndexes.push_back(0);
|
||||||
ps->missingIndexes.insert(1);
|
ps->missingIndexes.push_back(1);
|
||||||
SharedHandle<WrapExtBtMessageFactory> messageFactory
|
SharedHandle<WrapExtBtMessageFactory> messageFactory
|
||||||
(new WrapExtBtMessageFactory());
|
(new WrapExtBtMessageFactory());
|
||||||
factory.setBtMessageFactory(messageFactory);
|
factory.setBtMessageFactory(messageFactory);
|
||||||
|
@ -65,11 +69,11 @@ void UTMetadataRequestFactoryTest::testCreate()
|
||||||
factory.create(msgs, 1, ps);
|
factory.create(msgs, 1, ps);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, msgs.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, msgs.size());
|
||||||
|
|
||||||
msgs.clear();
|
|
||||||
|
|
||||||
ps->missingIndexes.clear();
|
|
||||||
factory.create(msgs, 1, ps);
|
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
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue