From 2176b68116ecc08f48f26094e03542bd98e56e11 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 4 Aug 2010 12:25:46 +0000 Subject: [PATCH] 2010-08-04 Tatsuhiro Tsujikawa 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 --- ChangeLog | 12 +++++++++++ src/DefaultBtInteractive.cc | 33 ++++++++++++++++--------------- src/DefaultPeerStorage.cc | 17 ++++++++++++++++ src/DefaultPeerStorage.h | 5 +++++ src/PeerStorage.h | 5 +++++ src/UTPexExtensionMessage.h | 4 ++-- test/DefaultPeerStorageTest.cc | 2 ++ test/MockPeerStorage.h | 9 +++++++++ test/UTPexExtensionMessageTest.cc | 4 ++-- 9 files changed, 71 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index f4e30831..1701f2c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2010-08-04 Tatsuhiro Tsujikawa + + 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 Added bittorrent::packcompact() which replaces diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index b00c25d2..b1bc3299 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -475,26 +475,27 @@ void DefaultBtInteractive::addPeerExchangeMessage() difference(global::wallclock) >= UTPexExtensionMessage::DEFAULT_INTERVAL) { UTPexExtensionMessageHandle m (new UTPexExtensionMessage(peer_->getExtensionMessageID("ut_pex"))); - const std::deque >& peers = peerStorage_->getPeers(); - { - for(std::deque >::const_iterator i = - peers.begin(), eoi = peers.end(); - i != eoi && !m->freshPeersAreFull(); ++i) { - if(peer_->getIPAddress() != (*i)->getIPAddress()) { - m->addFreshPeer(*i); - } + + std::vector > activePeers; + peerStorage_->getActivePeers(activePeers); + for(std::vector >::const_iterator i = + activePeers.begin(), eoi = activePeers.end(); + i != eoi && !m->freshPeersAreFull(); ++i) { + if(peer_->getIPAddress() != (*i)->getIPAddress()) { + m->addFreshPeer(*i); } } - { - for(std::deque >::const_reverse_iterator i = - peers.rbegin(), eoi = peers.rend(); - i != eoi && !m->droppedPeersAreFull(); - ++i) { - if(peer_->getIPAddress() != (*i)->getIPAddress()) { - m->addDroppedPeer(*i); - } + const std::deque >& droppedPeers = + peerStorage_->getDroppedPeers(); + for(std::deque >::const_iterator i = + droppedPeers.begin(), eoi = droppedPeers.end(); + i != eoi && !m->droppedPeersAreFull(); + ++i) { + if(peer_->getIPAddress() != (*i)->getIPAddress()) { + m->addDroppedPeer(*i); } } + BtMessageHandle msg = messageFactory_->createBtExtendedMessage(m); dispatcher_->addMessageToQueue(msg); pexTimer_ = global::wallclock; diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc index a22ffc83..6379088a 100644 --- a/src/DefaultPeerStorage.cc +++ b/src/DefaultPeerStorage.cc @@ -124,11 +124,24 @@ void DefaultPeerStorage::addPeer(const std::vector >& peers) } } +void DefaultPeerStorage::addDroppedPeer(const SharedHandle& peer) +{ + droppedPeers_.push_front(peer); + if(droppedPeers_.size() > 50) { + droppedPeers_.pop_back(); + } +} + const std::deque >& DefaultPeerStorage::getPeers() { return peers_; } +const std::deque >& DefaultPeerStorage::getDroppedPeers() +{ + return droppedPeers_; +} + class FindFinePeer { public: bool operator()(const SharedHandle& peer) const { @@ -295,6 +308,10 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle& peer) removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength(); cachedTransferStat_ -= removedStat; + if(!peer->isIncomingPeer()) { + peer->startBadCondition(); + addDroppedPeer(peer); + } // Execute choking algorithm if unchoked and interested peer is // disconnected. if(!peer->amChoking() && peer->peerInterested()) { diff --git a/src/DefaultPeerStorage.h b/src/DefaultPeerStorage.h index 44b0159d..0b8a34e1 100644 --- a/src/DefaultPeerStorage.h +++ b/src/DefaultPeerStorage.h @@ -54,6 +54,7 @@ private: SharedHandle btRuntime_; SharedHandle pieceStorage_; std::deque > peers_; + std::deque > droppedPeers_; Logger* logger_; uint64_t removedPeerSessionDownloadLength_; uint64_t removedPeerSessionUploadLength_; @@ -68,6 +69,8 @@ private: TransferStat cachedTransferStat_; bool isPeerAlreadyAdded(const SharedHandle& peer); + + void addDroppedPeer(const SharedHandle& peer); public: DefaultPeerStorage(); @@ -85,6 +88,8 @@ public: virtual const std::deque >& getPeers(); + virtual const std::deque >& getDroppedPeers(); + virtual bool isPeerAvailable(); virtual void getActivePeers(std::vector >& peers); diff --git a/src/PeerStorage.h b/src/PeerStorage.h index 857358fd..23d6038e 100644 --- a/src/PeerStorage.h +++ b/src/PeerStorage.h @@ -67,6 +67,11 @@ public: */ virtual const std::deque >& getPeers() = 0; + /** + * Returns internal dropped peer list. + */ + virtual const std::deque >& getDroppedPeers() = 0; + /** * Returns one of the unused peers. */ diff --git a/src/UTPexExtensionMessage.h b/src/UTPexExtensionMessage.h index 206a01cf..74b5f4fb 100644 --- a/src/UTPexExtensionMessage.h +++ b/src/UTPexExtensionMessage.h @@ -130,9 +130,9 @@ public: 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 UTPexExtensionMessageHandle; diff --git a/test/DefaultPeerStorageTest.cc b/test/DefaultPeerStorageTest.cc index f9467d75..3f423e19 100644 --- a/test/DefaultPeerStorageTest.cc +++ b/test/DefaultPeerStorageTest.cc @@ -229,6 +229,8 @@ void DefaultPeerStorageTest::testReturnPeer() ps.returnPeer(peer1); // peer1 is removed from the container 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_EQUAL((size_t)2, ps.getDroppedPeers().size()); } void DefaultPeerStorageTest::testOnErasingPeer() diff --git a/test/MockPeerStorage.h b/test/MockPeerStorage.h index 8876456a..28e9e541 100644 --- a/test/MockPeerStorage.h +++ b/test/MockPeerStorage.h @@ -13,6 +13,7 @@ class MockPeerStorage : public PeerStorage { private: TransferStat stat; std::deque > peers; + std::deque > droppedPeers; std::vector > activePeers; int numChokeExecuted_; public: @@ -32,6 +33,14 @@ public: return peers; } + virtual const std::deque >& getDroppedPeers() { + return droppedPeers; + } + + void addDroppedPeer(const SharedHandle& peer) { + droppedPeers.push_back(peer); + } + virtual SharedHandle getUnusedPeer() { return SharedHandle(); } diff --git a/test/UTPexExtensionMessageTest.cc b/test/UTPexExtensionMessageTest.cc index 0aa700ea..168aea4f 100644 --- a/test/UTPexExtensionMessageTest.cc +++ b/test/UTPexExtensionMessageTest.cc @@ -228,7 +228,7 @@ void UTPexExtensionMessageTest::testAddDroppedPeer() void UTPexExtensionMessageTest::testFreshPeersAreFull() { UTPexExtensionMessage msg(1); - CPPUNIT_ASSERT_EQUAL((size_t)30, msg.getMaxFreshPeer()); + CPPUNIT_ASSERT_EQUAL((size_t)50, msg.getMaxFreshPeer()); msg.setMaxFreshPeer(2); SharedHandle p1(new Peer("192.168.0.1", 6881)); CPPUNIT_ASSERT(msg.addFreshPeer(p1)); @@ -244,7 +244,7 @@ void UTPexExtensionMessageTest::testFreshPeersAreFull() void UTPexExtensionMessageTest::testDroppedPeersAreFull() { UTPexExtensionMessage msg(1); - CPPUNIT_ASSERT_EQUAL((size_t)10, msg.getMaxDroppedPeer()); + CPPUNIT_ASSERT_EQUAL((size_t)50, msg.getMaxDroppedPeer()); msg.setMaxDroppedPeer(2); SharedHandle p1(new Peer("192.168.0.1", 6881)); p1->startBadCondition();