mirror of https://github.com/aria2/aria2
2010-08-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten ut_pex peer selection. * src/DefaultBtInteractive.cc * src/DefaultPeerStorage.cc * src/DefaultPeerStorage.h * src/PeerStorage.h * src/UTPexExtensionMessage.h * test/DefaultPeerStorageTest.cc * test/MockPeerStorage.h * test/UTPexExtensionMessageTest.ccpull/1/head
parent
2bd5020f81
commit
2176b68116
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2010-08-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
Rewritten ut_pex peer selection.
|
||||||
|
* src/DefaultBtInteractive.cc
|
||||||
|
* src/DefaultPeerStorage.cc
|
||||||
|
* src/DefaultPeerStorage.h
|
||||||
|
* src/PeerStorage.h
|
||||||
|
* src/UTPexExtensionMessage.h
|
||||||
|
* test/DefaultPeerStorageTest.cc
|
||||||
|
* test/MockPeerStorage.h
|
||||||
|
* test/UTPexExtensionMessageTest.cc
|
||||||
|
|
||||||
2010-08-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2010-08-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Added bittorrent::packcompact() which replaces
|
Added bittorrent::packcompact() which replaces
|
||||||
|
|
|
@ -475,26 +475,27 @@ void DefaultBtInteractive::addPeerExchangeMessage()
|
||||||
difference(global::wallclock) >= UTPexExtensionMessage::DEFAULT_INTERVAL) {
|
difference(global::wallclock) >= UTPexExtensionMessage::DEFAULT_INTERVAL) {
|
||||||
UTPexExtensionMessageHandle m
|
UTPexExtensionMessageHandle m
|
||||||
(new UTPexExtensionMessage(peer_->getExtensionMessageID("ut_pex")));
|
(new UTPexExtensionMessage(peer_->getExtensionMessageID("ut_pex")));
|
||||||
const std::deque<SharedHandle<Peer> >& peers = peerStorage_->getPeers();
|
|
||||||
{
|
std::vector<SharedHandle<Peer> > activePeers;
|
||||||
for(std::deque<SharedHandle<Peer> >::const_iterator i =
|
peerStorage_->getActivePeers(activePeers);
|
||||||
peers.begin(), eoi = peers.end();
|
for(std::vector<SharedHandle<Peer> >::const_iterator i =
|
||||||
i != eoi && !m->freshPeersAreFull(); ++i) {
|
activePeers.begin(), eoi = activePeers.end();
|
||||||
if(peer_->getIPAddress() != (*i)->getIPAddress()) {
|
i != eoi && !m->freshPeersAreFull(); ++i) {
|
||||||
m->addFreshPeer(*i);
|
if(peer_->getIPAddress() != (*i)->getIPAddress()) {
|
||||||
}
|
m->addFreshPeer(*i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
const std::deque<SharedHandle<Peer> >& droppedPeers =
|
||||||
for(std::deque<SharedHandle<Peer> >::const_reverse_iterator i =
|
peerStorage_->getDroppedPeers();
|
||||||
peers.rbegin(), eoi = peers.rend();
|
for(std::deque<SharedHandle<Peer> >::const_iterator i =
|
||||||
i != eoi && !m->droppedPeersAreFull();
|
droppedPeers.begin(), eoi = droppedPeers.end();
|
||||||
++i) {
|
i != eoi && !m->droppedPeersAreFull();
|
||||||
if(peer_->getIPAddress() != (*i)->getIPAddress()) {
|
++i) {
|
||||||
m->addDroppedPeer(*i);
|
if(peer_->getIPAddress() != (*i)->getIPAddress()) {
|
||||||
}
|
m->addDroppedPeer(*i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BtMessageHandle msg = messageFactory_->createBtExtendedMessage(m);
|
BtMessageHandle msg = messageFactory_->createBtExtendedMessage(m);
|
||||||
dispatcher_->addMessageToQueue(msg);
|
dispatcher_->addMessageToQueue(msg);
|
||||||
pexTimer_ = global::wallclock;
|
pexTimer_ = global::wallclock;
|
||||||
|
|
|
@ -124,11 +124,24 @@ void DefaultPeerStorage::addPeer(const std::vector<SharedHandle<Peer> >& peers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DefaultPeerStorage::addDroppedPeer(const SharedHandle<Peer>& peer)
|
||||||
|
{
|
||||||
|
droppedPeers_.push_front(peer);
|
||||||
|
if(droppedPeers_.size() > 50) {
|
||||||
|
droppedPeers_.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const std::deque<SharedHandle<Peer> >& DefaultPeerStorage::getPeers()
|
const std::deque<SharedHandle<Peer> >& DefaultPeerStorage::getPeers()
|
||||||
{
|
{
|
||||||
return peers_;
|
return peers_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::deque<SharedHandle<Peer> >& DefaultPeerStorage::getDroppedPeers()
|
||||||
|
{
|
||||||
|
return droppedPeers_;
|
||||||
|
}
|
||||||
|
|
||||||
class FindFinePeer {
|
class FindFinePeer {
|
||||||
public:
|
public:
|
||||||
bool operator()(const SharedHandle<Peer>& peer) const {
|
bool operator()(const SharedHandle<Peer>& peer) const {
|
||||||
|
@ -295,6 +308,10 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle<Peer>& peer)
|
||||||
removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength();
|
removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength();
|
||||||
cachedTransferStat_ -= removedStat;
|
cachedTransferStat_ -= removedStat;
|
||||||
|
|
||||||
|
if(!peer->isIncomingPeer()) {
|
||||||
|
peer->startBadCondition();
|
||||||
|
addDroppedPeer(peer);
|
||||||
|
}
|
||||||
// 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()) {
|
||||||
|
|
|
@ -54,6 +54,7 @@ private:
|
||||||
SharedHandle<BtRuntime> btRuntime_;
|
SharedHandle<BtRuntime> btRuntime_;
|
||||||
SharedHandle<PieceStorage> pieceStorage_;
|
SharedHandle<PieceStorage> pieceStorage_;
|
||||||
std::deque<SharedHandle<Peer> > peers_;
|
std::deque<SharedHandle<Peer> > peers_;
|
||||||
|
std::deque<SharedHandle<Peer> > droppedPeers_;
|
||||||
Logger* logger_;
|
Logger* logger_;
|
||||||
uint64_t removedPeerSessionDownloadLength_;
|
uint64_t removedPeerSessionDownloadLength_;
|
||||||
uint64_t removedPeerSessionUploadLength_;
|
uint64_t removedPeerSessionUploadLength_;
|
||||||
|
@ -68,6 +69,8 @@ private:
|
||||||
TransferStat cachedTransferStat_;
|
TransferStat cachedTransferStat_;
|
||||||
|
|
||||||
bool isPeerAlreadyAdded(const SharedHandle<Peer>& peer);
|
bool isPeerAlreadyAdded(const SharedHandle<Peer>& peer);
|
||||||
|
|
||||||
|
void addDroppedPeer(const SharedHandle<Peer>& peer);
|
||||||
public:
|
public:
|
||||||
DefaultPeerStorage();
|
DefaultPeerStorage();
|
||||||
|
|
||||||
|
@ -85,6 +88,8 @@ public:
|
||||||
|
|
||||||
virtual const std::deque<SharedHandle<Peer> >& getPeers();
|
virtual const std::deque<SharedHandle<Peer> >& getPeers();
|
||||||
|
|
||||||
|
virtual const std::deque<SharedHandle<Peer> >& getDroppedPeers();
|
||||||
|
|
||||||
virtual bool isPeerAvailable();
|
virtual bool isPeerAvailable();
|
||||||
|
|
||||||
virtual void getActivePeers(std::vector<SharedHandle<Peer> >& peers);
|
virtual void getActivePeers(std::vector<SharedHandle<Peer> >& peers);
|
||||||
|
|
|
@ -67,6 +67,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual const std::deque<SharedHandle<Peer> >& getPeers() = 0;
|
virtual const std::deque<SharedHandle<Peer> >& getPeers() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns internal dropped peer list.
|
||||||
|
*/
|
||||||
|
virtual const std::deque<SharedHandle<Peer> >& getDroppedPeers() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns one of the unused peers.
|
* Returns one of the unused peers.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -130,9 +130,9 @@ public:
|
||||||
|
|
||||||
static const time_t DEFAULT_INTERVAL = 60;
|
static const time_t DEFAULT_INTERVAL = 60;
|
||||||
|
|
||||||
static const size_t DEFAULT_MAX_FRESH_PEER = 30;
|
static const size_t DEFAULT_MAX_FRESH_PEER = 50;
|
||||||
|
|
||||||
static const size_t DEFAULT_MAX_DROPPED_PEER = 10;
|
static const size_t DEFAULT_MAX_DROPPED_PEER = 50;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SharedHandle<UTPexExtensionMessage> UTPexExtensionMessageHandle;
|
typedef SharedHandle<UTPexExtensionMessage> UTPexExtensionMessageHandle;
|
||||||
|
|
|
@ -229,6 +229,8 @@ void DefaultPeerStorageTest::testReturnPeer()
|
||||||
ps.returnPeer(peer1); // peer1 is removed from the container
|
ps.returnPeer(peer1); // peer1 is removed from the container
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getPeers().size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getPeers().size());
|
||||||
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
|
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getDroppedPeers().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultPeerStorageTest::testOnErasingPeer()
|
void DefaultPeerStorageTest::testOnErasingPeer()
|
||||||
|
|
|
@ -13,6 +13,7 @@ class MockPeerStorage : public PeerStorage {
|
||||||
private:
|
private:
|
||||||
TransferStat stat;
|
TransferStat stat;
|
||||||
std::deque<SharedHandle<Peer> > peers;
|
std::deque<SharedHandle<Peer> > peers;
|
||||||
|
std::deque<SharedHandle<Peer> > droppedPeers;
|
||||||
std::vector<SharedHandle<Peer> > activePeers;
|
std::vector<SharedHandle<Peer> > activePeers;
|
||||||
int numChokeExecuted_;
|
int numChokeExecuted_;
|
||||||
public:
|
public:
|
||||||
|
@ -32,6 +33,14 @@ public:
|
||||||
return peers;
|
return peers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual const std::deque<SharedHandle<Peer> >& getDroppedPeers() {
|
||||||
|
return droppedPeers;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addDroppedPeer(const SharedHandle<Peer>& peer) {
|
||||||
|
droppedPeers.push_back(peer);
|
||||||
|
}
|
||||||
|
|
||||||
virtual SharedHandle<Peer> getUnusedPeer() {
|
virtual SharedHandle<Peer> getUnusedPeer() {
|
||||||
return SharedHandle<Peer>();
|
return SharedHandle<Peer>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,7 +228,7 @@ void UTPexExtensionMessageTest::testAddDroppedPeer()
|
||||||
void UTPexExtensionMessageTest::testFreshPeersAreFull()
|
void UTPexExtensionMessageTest::testFreshPeersAreFull()
|
||||||
{
|
{
|
||||||
UTPexExtensionMessage msg(1);
|
UTPexExtensionMessage msg(1);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)30, msg.getMaxFreshPeer());
|
CPPUNIT_ASSERT_EQUAL((size_t)50, msg.getMaxFreshPeer());
|
||||||
msg.setMaxFreshPeer(2);
|
msg.setMaxFreshPeer(2);
|
||||||
SharedHandle<Peer> p1(new Peer("192.168.0.1", 6881));
|
SharedHandle<Peer> p1(new Peer("192.168.0.1", 6881));
|
||||||
CPPUNIT_ASSERT(msg.addFreshPeer(p1));
|
CPPUNIT_ASSERT(msg.addFreshPeer(p1));
|
||||||
|
@ -244,7 +244,7 @@ void UTPexExtensionMessageTest::testFreshPeersAreFull()
|
||||||
void UTPexExtensionMessageTest::testDroppedPeersAreFull()
|
void UTPexExtensionMessageTest::testDroppedPeersAreFull()
|
||||||
{
|
{
|
||||||
UTPexExtensionMessage msg(1);
|
UTPexExtensionMessage msg(1);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, msg.getMaxDroppedPeer());
|
CPPUNIT_ASSERT_EQUAL((size_t)50, msg.getMaxDroppedPeer());
|
||||||
msg.setMaxDroppedPeer(2);
|
msg.setMaxDroppedPeer(2);
|
||||||
SharedHandle<Peer> p1(new Peer("192.168.0.1", 6881));
|
SharedHandle<Peer> p1(new Peer("192.168.0.1", 6881));
|
||||||
p1->startBadCondition();
|
p1->startBadCondition();
|
||||||
|
|
Loading…
Reference in New Issue