Quellcode durchsuchen

2008-09-02 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Moved threthold values to UTPexExtensionMessage.
	* src/DefaultBtInteractive.cc
	* src/Peer.cc
	* src/Peer.h
	* src/UTPexExtensionMessage.cc
	* src/UTPexExtensionMessage.h
	* test/UTPexExtensionMessageTest.cc
Tatsuhiro Tsujikawa vor 17 Jahren
Ursprung
Commit
c46b6055c6
7 geänderte Dateien mit 178 neuen und 25 gelöschten Zeilen
  1. 10 0
      ChangeLog
  2. 10 18
      src/DefaultBtInteractive.cc
  3. 5 0
      src/Peer.cc
  4. 2 0
      src/Peer.h
  5. 50 5
      src/UTPexExtensionMessage.cc
  6. 27 2
      src/UTPexExtensionMessage.h
  7. 74 0
      test/UTPexExtensionMessageTest.cc

+ 10 - 0
ChangeLog

@@ -1,3 +1,13 @@
+2008-09-02  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	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  <tujikawa at rednoah dot com>
 
 	Added _incoming member to Peer class and made it true if the peer

+ 10 - 18
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<SharedHandle<Peer> >::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<SharedHandle<Peer> >::const_reverse_iterator i =
+	    peers.rbegin(); i != peers.rend() && !m->droppedPeersAreFull();
+	  ++i) {
+	if(peer->ipaddr != (*i)->ipaddr) {
+	  m->addDroppedPeer(*i);
 	}
       }
     }

+ 5 - 0
src/Peer.cc

@@ -471,4 +471,9 @@ void Peer::setIncomingPeer(bool incoming)
   _incoming = incoming;
 }
 
+void Peer::setFirstContactTime(const Time& time)
+{
+  _firstContactTime = time;
+}
+
 } // namespace aria2

+ 2 - 0
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

+ 50 - 5
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;

+ 27 - 2
src/UTPexExtensionMessage.h

@@ -36,6 +36,7 @@
 #define _D_UT_PEX_EXTENSION_MESSAGE_H_
 
 #include "ExtensionMessage.h"
+#include "a2time.h"
 #include <utility>
 #include <deque>
 
@@ -56,6 +57,12 @@ private:
 
   SharedHandle<BtContext> _btContext;
 
+  time_t _interval;
+
+  size_t _maxFreshPeer;
+
+  size_t _maxDroppedPeer;
+
   std::pair<std::string, std::string>
   createCompactPeerListAndFlag(const std::deque<SharedHandle<Peer> >& peers);
 
@@ -82,18 +89,36 @@ public:
 
   virtual void doReceivedAction();
 
-  void addFreshPeer(const SharedHandle<Peer>& peer);
+  bool addFreshPeer(const SharedHandle<Peer>& peer);
 
   const std::deque<SharedHandle<Peer> >& getFreshPeers() const;
+  
+  bool freshPeersAreFull() const;
 
-  void addDroppedPeer(const SharedHandle<Peer>& peer);
+  bool addDroppedPeer(const SharedHandle<Peer>& peer);
 
   const std::deque<SharedHandle<Peer> >& getDroppedPeers() const;
 
+  bool droppedPeersAreFull() const;
+
   void setBtContext(const SharedHandle<BtContext>& btContext);
 
   static UTPexExtensionMessageHandle create(const SharedHandle<BtContext>& 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<UTPexExtensionMessage> UTPexExtensionMessageHandle;

+ 74 - 0
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<MockBtContext> _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<Peer> p2(new Peer("10.1.1.2", 9999));
   msg.addFreshPeer(p2);
   SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
+  p3->startBadCondition();
   msg.addDroppedPeer(p3);
   SharedHandle<Peer> 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<Peer> p2(new Peer("10.1.1.2", 9999));
   msg.addFreshPeer(p2);
   SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
+  p3->startBadCondition();
   msg.addDroppedPeer(p3);
   SharedHandle<Peer> 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<Peer> p2(new Peer("10.1.1.2", 9999));
   msg.addFreshPeer(p2);
   SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
+  p3->startBadCondition();
   msg.addDroppedPeer(p3);
   SharedHandle<Peer> 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<Peer> p1(new Peer("192.168.0.1", 6881));
+  CPPUNIT_ASSERT(msg.addFreshPeer(p1));
+  SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
+  p2->setFirstContactTime(Time(Time().getTime()-61));
+  CPPUNIT_ASSERT(!msg.addFreshPeer(p2));
+  SharedHandle<Peer> p3(new Peer("10.1.1.3", 9999, true));
+  CPPUNIT_ASSERT(!msg.addFreshPeer(p3));
+}
+
+void UTPexExtensionMessageTest::testAddDroppedPeer()
+{
+  UTPexExtensionMessage msg(1);
+  SharedHandle<Peer> p1(new Peer("192.168.0.1", 6881));
+  CPPUNIT_ASSERT(!msg.addDroppedPeer(p1));
+  SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
+  p2->startBadCondition();
+  CPPUNIT_ASSERT(msg.addFreshPeer(p2));
+  SharedHandle<Peer> 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<Peer> p1(new Peer("192.168.0.1", 6881));
+  CPPUNIT_ASSERT(msg.addFreshPeer(p1));
+  CPPUNIT_ASSERT(!msg.freshPeersAreFull());
+  SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
+  CPPUNIT_ASSERT(msg.addFreshPeer(p2));
+  CPPUNIT_ASSERT(msg.freshPeersAreFull());
+  SharedHandle<Peer> 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<Peer> p1(new Peer("192.168.0.1", 6881));
+  p1->startBadCondition();
+  CPPUNIT_ASSERT(msg.addDroppedPeer(p1));
+  CPPUNIT_ASSERT(!msg.droppedPeersAreFull());
+  SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
+  p2->startBadCondition();
+  CPPUNIT_ASSERT(msg.addDroppedPeer(p2));
+  CPPUNIT_ASSERT(msg.droppedPeersAreFull());
+  SharedHandle<Peer> p3(new Peer("10.1.1.3", 9999));
+  p3->startBadCondition();
+  CPPUNIT_ASSERT(msg.addDroppedPeer(p3));
+  CPPUNIT_ASSERT(msg.droppedPeersAreFull());
+}
+
 } // namespace aria2