Explorar o código

2007-12-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Allow a peer in incomingPeer to be added peers.
	* src/DefaultPeerStorage.cc
	* test/DefaultPeerStorageTest.cc
Tatsuhiro Tsujikawa %!s(int64=18) %!d(string=hai) anos
pai
achega
51cb6b5ba9
Modificáronse 3 ficheiros con 35 adicións e 8 borrados
  1. 6 0
      ChangeLog
  2. 11 8
      src/DefaultPeerStorage.cc
  3. 18 0
      test/DefaultPeerStorageTest.cc

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2007-12-22  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Allow a peer in incomingPeer to be added peers.
+	* src/DefaultPeerStorage.cc
+	* test/DefaultPeerStorageTest.cc
+
 2007-12-22  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Fixed the bug that causes aria2 not to finish download. BUG#1855875.

+ 11 - 8
src/DefaultPeerStorage.cc

@@ -59,16 +59,19 @@ bool DefaultPeerStorage::isPeerAlreadyAdded(const PeerHandle& peer)
 }
 
 bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
-  if(isPeerAlreadyAdded(peer)) {
-    logger->debug("Adding %s:%u is rejected because it is already in PeerStorage.", peer->ipaddr.c_str(), peer->port);
-    return false;
-  } else {
-    if(peers.size() >= (size_t)maxPeerListSize) {
-      deleteUnusedPeer(peers.size()-maxPeerListSize+1);
+  {
+    Peers::iterator i = find(incomingPeers.begin(), incomingPeers.end(), peer);
+    if(i != incomingPeers.end() && (*i).get() != peer.get() ||
+       find(peers.begin(), peers.end(), peer) != peers.end()) {
+      logger->debug("Adding %s:%u is rejected because it is already in PeerStorage.", peer->ipaddr.c_str(), peer->port);
+      return false;
     }
-    peers.push_front(peer);
-    return true;
   }
+  if(peers.size() >= (size_t)maxPeerListSize) {
+    deleteUnusedPeer(peers.size()-maxPeerListSize+1);
+  }
+  peers.push_front(peer);
+  return true;
 }
 
 bool DefaultPeerStorage::addIncomingPeer(const PeerHandle& peer)

+ 18 - 0
test/DefaultPeerStorageTest.cc

@@ -12,6 +12,7 @@ class DefaultPeerStorageTest:public CppUnit::TestFixture {
   CPPUNIT_TEST(testCountPeer);
   CPPUNIT_TEST(testDeleteUnusedPeer);
   CPPUNIT_TEST(testAddPeer);
+  CPPUNIT_TEST(testAddPeer_incomingPeer);
   CPPUNIT_TEST(testGetPeer);
   CPPUNIT_TEST(testIsPeerAvailable);
   CPPUNIT_TEST(testActivatePeer);
@@ -38,6 +39,7 @@ public:
   void testCountPeer();
   void testDeleteUnusedPeer();
   void testAddPeer();
+  void testAddPeer_incomingPeer();
   void testGetPeer();
   void testIsPeerAvailable();
   void testActivatePeer();
@@ -97,6 +99,22 @@ void DefaultPeerStorageTest::testDeleteUnusedPeer() {
   
 }
 
+void DefaultPeerStorageTest::testAddPeer_incomingPeer()
+{
+  DefaultPeerStorage ps(btContext, option);
+
+  PeerHandle peer1 = new Peer("192.168.0.1", 6889, btContext->getPieceLength(),
+			      btContext->getTotalLength());
+  PeerHandle peer2 = new Peer("192.168.0.1", 6889, btContext->getPieceLength(),
+			      btContext->getTotalLength());
+  
+  CPPUNIT_ASSERT(ps.addIncomingPeer(peer1));
+  CPPUNIT_ASSERT(ps.addPeer(peer1));// because same instance is stored in incomingPeers and peers.
+  CPPUNIT_ASSERT(!ps.addPeer(peer2));
+
+
+}
+
 void DefaultPeerStorageTest::testAddPeer() {
   DefaultPeerStorage ps(btContext, option);