From c46b6055c6a25d50a717d01e293f7ad8a2833be2 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 2 Sep 2008 12:31:04 +0000 Subject: [PATCH] 2008-09-02 Tatsuhiro Tsujikawa Moved threthold values to UTPexExtensionMessage. * src/DefaultBtInteractive.cc * src/Peer.cc * src/Peer.h * src/UTPexExtensionMessage.cc * src/UTPexExtensionMessage.h * test/UTPexExtensionMessageTest.cc --- ChangeLog | 10 +++++ src/DefaultBtInteractive.cc | 28 +++++------- src/Peer.cc | 5 +++ src/Peer.h | 2 + src/UTPexExtensionMessage.cc | 55 ++++++++++++++++++++--- src/UTPexExtensionMessage.h | 29 +++++++++++- test/UTPexExtensionMessageTest.cc | 74 +++++++++++++++++++++++++++++++ 7 files changed, 178 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index faf2dbcd..846ec34b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-09-02 Tatsuhiro Tsujikawa + + Moved threthold values to UTPexExtensionMessage. + * src/DefaultBtInteractive.cc + * src/Peer.cc + * src/Peer.h + * src/UTPexExtensionMessage.cc + * src/UTPexExtensionMessage.h + * test/UTPexExtensionMessageTest.cc + 2008-09-02 Tatsuhiro Tsujikawa Added _incoming member to Peer class and made it true if the peer diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index 9209cd6a..ea29c08c 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -392,32 +392,24 @@ void DefaultBtInteractive::checkActiveInteraction() void DefaultBtInteractive::addPeerExchangeMessage() { - time_t interval = 60; - if(_pexCheckPoint.elapsed(interval)) { + if(_pexCheckPoint.elapsed(UTPexExtensionMessage::DEFAULT_INTERVAL)) { UTPexExtensionMessageHandle m (new UTPexExtensionMessage(peer->getExtensionMessageID("ut_pex"))); const Peers& peers = peerStorage->getPeers(); { - size_t max = 30; - for(Peers::const_iterator i = peers.begin(); - i != peers.end() && max; ++i) { - const PeerHandle& cpeer = *i; - if(peer->ipaddr != cpeer->ipaddr && !cpeer->isIncomingPeer() && - !cpeer->getFirstContactTime().elapsed(interval)) { - m->addFreshPeer(cpeer); - --max; + for(std::deque >::const_iterator i = + peers.begin(); i != peers.end() && !m->freshPeersAreFull(); ++i) { + if(peer->ipaddr != (*i)->ipaddr) { + m->addFreshPeer(*i); } } } { - size_t max = 10; - for(Peers::const_reverse_iterator i = peers.rbegin(); - i != peers.rend() && max; ++i) { - const PeerHandle& cpeer = *i; - if(peer->ipaddr != cpeer->ipaddr && - !cpeer->getBadConditionStartTime().elapsed(interval)) { - m->addDroppedPeer(cpeer); - --max; + for(std::deque >::const_reverse_iterator i = + peers.rbegin(); i != peers.rend() && !m->droppedPeersAreFull(); + ++i) { + if(peer->ipaddr != (*i)->ipaddr) { + m->addDroppedPeer(*i); } } } diff --git a/src/Peer.cc b/src/Peer.cc index 23c6baf2..ee9ac756 100644 --- a/src/Peer.cc +++ b/src/Peer.cc @@ -471,4 +471,9 @@ void Peer::setIncomingPeer(bool incoming) _incoming = incoming; } +void Peer::setFirstContactTime(const Time& time) +{ + _firstContactTime = time; +} + } // namespace aria2 diff --git a/src/Peer.h b/src/Peer.h index 6205001b..ff520364 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -114,6 +114,8 @@ public: const Time& getFirstContactTime() const; + void setFirstContactTime(const Time& time); + const Time& getBadConditionStartTime() const; // Before calling following member functions, make sure that diff --git a/src/UTPexExtensionMessage.cc b/src/UTPexExtensionMessage.cc index 7dcf5365..fb7bfd7b 100644 --- a/src/UTPexExtensionMessage.cc +++ b/src/UTPexExtensionMessage.cc @@ -53,7 +53,10 @@ namespace aria2 { const std::string UTPexExtensionMessage::EXTENSION_NAME = "ut_pex"; UTPexExtensionMessage::UTPexExtensionMessage(uint8_t extensionMessageID): - _extensionMessageID(extensionMessageID) {} + _extensionMessageID(extensionMessageID), + _interval(DEFAULT_INTERVAL), + _maxFreshPeer(DEFAULT_MAX_FRESH_PEER), + _maxDroppedPeer(DEFAULT_MAX_DROPPED_PEER) {} UTPexExtensionMessage::~UTPexExtensionMessage() {} @@ -96,9 +99,15 @@ void UTPexExtensionMessage::doReceivedAction() PEER_STORAGE(_btContext)->addPeer(_freshPeers); } -void UTPexExtensionMessage::addFreshPeer(const PeerHandle& peer) +bool UTPexExtensionMessage::addFreshPeer(const PeerHandle& peer) { - _freshPeers.push_back(peer); + if(!peer->isIncomingPeer() && + !peer->getFirstContactTime().elapsed(_interval)) { + _freshPeers.push_back(peer); + return true; + } else { + return false; + } } const Peers& UTPexExtensionMessage::getFreshPeers() const @@ -106,9 +115,20 @@ const Peers& UTPexExtensionMessage::getFreshPeers() const return _freshPeers; } -void UTPexExtensionMessage::addDroppedPeer(const PeerHandle& peer) +bool UTPexExtensionMessage::freshPeersAreFull() const { - _droppedPeers.push_back(peer); + return _freshPeers.size() >= _maxFreshPeer; +} + +bool UTPexExtensionMessage::addDroppedPeer(const PeerHandle& peer) +{ + if(!peer->isIncomingPeer() && + !peer->getBadConditionStartTime().elapsed(_interval)) { + _droppedPeers.push_back(peer); + return true; + } else { + return false; + } } const Peers& UTPexExtensionMessage::getDroppedPeers() const @@ -116,6 +136,31 @@ const Peers& UTPexExtensionMessage::getDroppedPeers() const return _droppedPeers; } +bool UTPexExtensionMessage::droppedPeersAreFull() const +{ + return _droppedPeers.size() >= _maxDroppedPeer; +} + +void UTPexExtensionMessage::setMaxFreshPeer(size_t maxFreshPeer) +{ + _maxFreshPeer = maxFreshPeer; +} + +size_t UTPexExtensionMessage::getMaxFreshPeer() const +{ + return _maxFreshPeer; +} + +void UTPexExtensionMessage::setMaxDroppedPeer(size_t maxDroppedPeer) +{ + _maxDroppedPeer = maxDroppedPeer; +} + +size_t UTPexExtensionMessage::getMaxDroppedPeer() const +{ + return _maxDroppedPeer; +} + void UTPexExtensionMessage::setBtContext(const BtContextHandle& btContext) { _btContext = btContext; diff --git a/src/UTPexExtensionMessage.h b/src/UTPexExtensionMessage.h index 04956796..41b38119 100644 --- a/src/UTPexExtensionMessage.h +++ b/src/UTPexExtensionMessage.h @@ -36,6 +36,7 @@ #define _D_UT_PEX_EXTENSION_MESSAGE_H_ #include "ExtensionMessage.h" +#include "a2time.h" #include #include @@ -56,6 +57,12 @@ private: SharedHandle _btContext; + time_t _interval; + + size_t _maxFreshPeer; + + size_t _maxDroppedPeer; + std::pair createCompactPeerListAndFlag(const std::deque >& peers); @@ -82,18 +89,36 @@ public: virtual void doReceivedAction(); - void addFreshPeer(const SharedHandle& peer); + bool addFreshPeer(const SharedHandle& peer); const std::deque >& getFreshPeers() const; + + bool freshPeersAreFull() const; - void addDroppedPeer(const SharedHandle& peer); + bool addDroppedPeer(const SharedHandle& peer); const std::deque >& getDroppedPeers() const; + bool droppedPeersAreFull() const; + void setBtContext(const SharedHandle& btContext); static UTPexExtensionMessageHandle create(const SharedHandle& btContext, const unsigned char* data, size_t len); + + void setMaxFreshPeer(size_t maxFreshPeer); + + size_t getMaxFreshPeer() const; + + void setMaxDroppedPeer(size_t maxDroppedPeer); + + size_t getMaxDroppedPeer() const; + + static const time_t DEFAULT_INTERVAL = 60; + + static const size_t DEFAULT_MAX_FRESH_PEER = 30; + + static const size_t DEFAULT_MAX_DROPPED_PEER = 10; }; typedef SharedHandle UTPexExtensionMessageHandle; diff --git a/test/UTPexExtensionMessageTest.cc b/test/UTPexExtensionMessageTest.cc index 480e9d8a..9f0e968f 100644 --- a/test/UTPexExtensionMessageTest.cc +++ b/test/UTPexExtensionMessageTest.cc @@ -22,6 +22,10 @@ class UTPexExtensionMessageTest:public CppUnit::TestFixture { CPPUNIT_TEST(testToString); CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testCreate); + CPPUNIT_TEST(testAddFreshPeer); + CPPUNIT_TEST(testAddDroppedPeer); + CPPUNIT_TEST(testFreshPeersAreFull); + CPPUNIT_TEST(testDroppedPeersAreFull); CPPUNIT_TEST_SUITE_END(); private: SharedHandle _btContext; @@ -50,6 +54,10 @@ public: void testToString(); void testDoReceivedAction(); void testCreate(); + void testAddFreshPeer(); + void testAddDroppedPeer(); + void testFreshPeersAreFull(); + void testDroppedPeersAreFull(); }; @@ -77,8 +85,10 @@ void UTPexExtensionMessageTest::testGetBencodedData() SharedHandle p2(new Peer("10.1.1.2", 9999)); msg.addFreshPeer(p2); SharedHandle p3(new Peer("192.168.0.2", 6882)); + p3->startBadCondition(); msg.addDroppedPeer(p3); SharedHandle p4(new Peer("10.1.1.3", 10000)); + p4->startBadCondition(); msg.addDroppedPeer(p4); unsigned char c1[6]; @@ -110,8 +120,10 @@ void UTPexExtensionMessageTest::testToString() SharedHandle p2(new Peer("10.1.1.2", 9999)); msg.addFreshPeer(p2); SharedHandle p3(new Peer("192.168.0.2", 6882)); + p3->startBadCondition(); msg.addDroppedPeer(p3); SharedHandle p4(new Peer("10.1.1.3", 10000)); + p4->startBadCondition(); msg.addDroppedPeer(p4); CPPUNIT_ASSERT_EQUAL(std::string("ut_pex added=2, dropped=2"), msg.toString()); } @@ -126,8 +138,10 @@ void UTPexExtensionMessageTest::testDoReceivedAction() SharedHandle p2(new Peer("10.1.1.2", 9999)); msg.addFreshPeer(p2); SharedHandle p3(new Peer("192.168.0.2", 6882)); + p3->startBadCondition(); msg.addDroppedPeer(p3); SharedHandle p4(new Peer("10.1.1.3", 10000)); + p4->startBadCondition(); msg.addDroppedPeer(p4); msg.setBtContext(_btContext); @@ -195,4 +209,64 @@ void UTPexExtensionMessageTest::testCreate() } } +void UTPexExtensionMessageTest::testAddFreshPeer() +{ + UTPexExtensionMessage msg(1); + SharedHandle p1(new Peer("192.168.0.1", 6881)); + CPPUNIT_ASSERT(msg.addFreshPeer(p1)); + SharedHandle p2(new Peer("10.1.1.2", 9999)); + p2->setFirstContactTime(Time(Time().getTime()-61)); + CPPUNIT_ASSERT(!msg.addFreshPeer(p2)); + SharedHandle p3(new Peer("10.1.1.3", 9999, true)); + CPPUNIT_ASSERT(!msg.addFreshPeer(p3)); +} + +void UTPexExtensionMessageTest::testAddDroppedPeer() +{ + UTPexExtensionMessage msg(1); + SharedHandle p1(new Peer("192.168.0.1", 6881)); + CPPUNIT_ASSERT(!msg.addDroppedPeer(p1)); + SharedHandle p2(new Peer("10.1.1.2", 9999)); + p2->startBadCondition(); + CPPUNIT_ASSERT(msg.addFreshPeer(p2)); + SharedHandle p3(new Peer("10.1.1.3", 9999, true)); + p3->startBadCondition(); + CPPUNIT_ASSERT(!msg.addDroppedPeer(p3)); +} + +void UTPexExtensionMessageTest::testFreshPeersAreFull() +{ + UTPexExtensionMessage msg(1); + CPPUNIT_ASSERT_EQUAL((size_t)30, msg.getMaxFreshPeer()); + msg.setMaxFreshPeer(2); + SharedHandle p1(new Peer("192.168.0.1", 6881)); + CPPUNIT_ASSERT(msg.addFreshPeer(p1)); + CPPUNIT_ASSERT(!msg.freshPeersAreFull()); + SharedHandle p2(new Peer("10.1.1.2", 9999)); + CPPUNIT_ASSERT(msg.addFreshPeer(p2)); + CPPUNIT_ASSERT(msg.freshPeersAreFull()); + SharedHandle p3(new Peer("10.1.1.3", 9999)); + CPPUNIT_ASSERT(msg.addFreshPeer(p3)); + CPPUNIT_ASSERT(msg.freshPeersAreFull()); +} + +void UTPexExtensionMessageTest::testDroppedPeersAreFull() +{ + UTPexExtensionMessage msg(1); + CPPUNIT_ASSERT_EQUAL((size_t)10, msg.getMaxDroppedPeer()); + msg.setMaxDroppedPeer(2); + SharedHandle p1(new Peer("192.168.0.1", 6881)); + p1->startBadCondition(); + CPPUNIT_ASSERT(msg.addDroppedPeer(p1)); + CPPUNIT_ASSERT(!msg.droppedPeersAreFull()); + SharedHandle p2(new Peer("10.1.1.2", 9999)); + p2->startBadCondition(); + CPPUNIT_ASSERT(msg.addDroppedPeer(p2)); + CPPUNIT_ASSERT(msg.droppedPeersAreFull()); + SharedHandle p3(new Peer("10.1.1.3", 9999)); + p3->startBadCondition(); + CPPUNIT_ASSERT(msg.addDroppedPeer(p3)); + CPPUNIT_ASSERT(msg.droppedPeersAreFull()); +} + } // namespace aria2