diff --git a/ChangeLog b/ChangeLog index 4b8c26c4..90aa7b2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-12-22 Tatsuhiro Tsujikawa + + Allow a peer in incomingPeer to be added peers. + * src/DefaultPeerStorage.cc + * test/DefaultPeerStorageTest.cc + 2007-12-22 Tatsuhiro Tsujikawa Fixed the bug that causes aria2 not to finish download. BUG#1855875. diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc index 0f370b14..a9e714db 100644 --- a/src/DefaultPeerStorage.cc +++ b/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) diff --git a/test/DefaultPeerStorageTest.cc b/test/DefaultPeerStorageTest.cc index 46d0697e..f353f959 100644 --- a/test/DefaultPeerStorageTest.cc +++ b/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);