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

Removed incomingPeer. Set 0 to peer's port if it is not a listening
	port.
	* src/DefaultPeerStorage.{h, cc}
	* test/DefaultPeerStorageTest.cc
	* src/HandshakeExtensionMessage.cc
	* test/HandshakeExtensionMessageTest.cc
	* src/Peer.{h, cc}: Added ipaddr and port to identity comparison.
	* src/PeerStorage.h
	* test/MockPeerStorage.h
	* src/PeerListenCommand.cc
pull/1/head
Tatsuhiro Tsujikawa 2007-12-25 12:34:23 +00:00
parent 7ff1f5a620
commit f5b68379d5
11 changed files with 51 additions and 165 deletions

View File

@ -1,3 +1,16 @@
2007-12-25 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Removed incomingPeer. Set 0 to peer's port if it is not a listening
port.
* src/DefaultPeerStorage.{h, cc}
* test/DefaultPeerStorageTest.cc
* src/HandshakeExtensionMessage.cc
* test/HandshakeExtensionMessageTest.cc
* src/Peer.{h, cc}: Added ipaddr and port to identity comparison.
* src/PeerStorage.h
* test/MockPeerStorage.h
* src/PeerListenCommand.cc
2007-12-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> 2007-12-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added --metalink-enable-unique-protocol option. Added --metalink-enable-unique-protocol option.

View File

@ -54,18 +54,13 @@ DefaultPeerStorage::~DefaultPeerStorage() {}
bool DefaultPeerStorage::isPeerAlreadyAdded(const PeerHandle& peer) bool DefaultPeerStorage::isPeerAlreadyAdded(const PeerHandle& peer)
{ {
return find(peers.begin(), peers.end(), peer) != peers.end() || return find(peers.begin(), peers.end(), peer) != peers.end();
find(incomingPeers.begin(), incomingPeers.end(), peer) != incomingPeers.end();
} }
bool DefaultPeerStorage::addPeer(const PeerHandle& peer) { bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
{ if(isPeerAlreadyAdded(peer)) {
Peers::iterator i = find(incomingPeers.begin(), incomingPeers.end(), peer); logger->debug("Adding %s:%u is rejected because it has been already added.", peer->ipaddr.c_str(), peer->port);
if(i != incomingPeers.end() && (*i).get() != peer.get() || return false;
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;
}
} }
if(peers.size() >= (size_t)maxPeerListSize) { if(peers.size() >= (size_t)maxPeerListSize) {
deleteUnusedPeer(peers.size()-maxPeerListSize+1); deleteUnusedPeer(peers.size()-maxPeerListSize+1);
@ -74,17 +69,6 @@ bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
return true; return true;
} }
bool DefaultPeerStorage::addIncomingPeer(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 {
incomingPeers.push_back(peer);
return true;
}
}
void DefaultPeerStorage::addPeer(const Peers& peers) { void DefaultPeerStorage::addPeer(const Peers& peers) {
for(Peers::const_iterator itr = peers.begin(); for(Peers::const_iterator itr = peers.begin();
itr != peers.end(); itr++) { itr != peers.end(); itr++) {
@ -163,10 +147,7 @@ public:
}; };
Peers DefaultPeerStorage::getActivePeers() { Peers DefaultPeerStorage::getActivePeers() {
CollectActivePeer funcObj; return for_each(peers.begin(), peers.end(), CollectActivePeer()).getActivePeers();
funcObj = for_each(peers.begin(), peers.end(), funcObj);
funcObj = for_each(incomingPeers.begin(), incomingPeers.end(), funcObj);
return funcObj.getActivePeers();
} }
class CalculateStat { class CalculateStat {
@ -193,11 +174,7 @@ public:
}; };
TransferStat DefaultPeerStorage::calculateStat() { TransferStat DefaultPeerStorage::calculateStat() {
CalculateStat calStat; TransferStat stat = for_each(peers.begin(), peers.end(), CalculateStat()).getTransferStat();
calStat = for_each(peers.begin(), peers.end(), calStat);
calStat = for_each(incomingPeers.begin(), incomingPeers.end(), calStat);
TransferStat stat = calStat.getTransferStat();
stat.sessionDownloadLength += removedPeerSessionDownloadLength; stat.sessionDownloadLength += removedPeerSessionDownloadLength;
stat.sessionUploadLength += removedPeerSessionUploadLength; stat.sessionUploadLength += removedPeerSessionUploadLength;
stat.setAllTimeUploadLength(btRuntime->getUploadLengthAtStartup()+ stat.setAllTimeUploadLength(btRuntime->getUploadLengthAtStartup()+
@ -231,19 +208,16 @@ void DefaultPeerStorage::returnPeer(const PeerHandle& peer)
{ {
Peers::iterator itr = find(peers.begin(), peers.end(), peer); Peers::iterator itr = find(peers.begin(), peers.end(), peer);
if(itr == peers.end()) { if(itr == peers.end()) {
itr = find(incomingPeers.begin(), incomingPeers.end(), peer); logger->debug("Cannot find peer %s:%u in PeerStorage.", peer->ipaddr.c_str(), peer->port);
if(itr == peers.end()) {
// do nothing
} else {
// erase incoming peer because we cannot connect to it with port number
// (*itr)->port. It is not the listening port.
onErasingPeer(*itr);
incomingPeers.erase(itr);
}
} else { } else {
peer->startBadCondition(); if((*itr)->port == 0) {
peer->resetStatus(); onErasingPeer(*itr);
peers.erase(itr); peers.erase(itr);
peers.push_back(peer); } else {
peer->startBadCondition();
peer->resetStatus();
peers.erase(itr);
peers.push_back(peer);
}
} }
} }

View File

@ -49,7 +49,6 @@ private:
BtContextHandle btContext; BtContextHandle btContext;
const Option* option; const Option* option;
Peers peers; Peers peers;
Peers incomingPeers;
int32_t maxPeerListSize; int32_t maxPeerListSize;
Logger* logger; Logger* logger;
BtRuntimeHandle btRuntime; BtRuntimeHandle btRuntime;
@ -68,8 +67,6 @@ public:
virtual bool addPeer(const PeerHandle& peer); virtual bool addPeer(const PeerHandle& peer);
virtual bool addIncomingPeer(const PeerHandle& peer);
int32_t countPeer() const; int32_t countPeer() const;
virtual PeerHandle getUnusedPeer(); virtual PeerHandle getUnusedPeer();
@ -95,8 +92,6 @@ public:
void deleteUnusedPeer(int32_t delSize); void deleteUnusedPeer(int32_t delSize);
void onErasingPeer(const PeerHandle& peer); void onErasingPeer(const PeerHandle& peer);
const Peers& getIncomingPeers() const { return incomingPeers; }
}; };
#endif // _D_DEFAULT_PEER_STORAGE_H_ #endif // _D_DEFAULT_PEER_STORAGE_H_

View File

@ -39,7 +39,6 @@
#include "Data.h" #include "Data.h"
#include "Util.h" #include "Util.h"
#include "BencodeVisitor.h" #include "BencodeVisitor.h"
#include "BtRegistry.h"
#include "MetaFileUtil.h" #include "MetaFileUtil.h"
#include "DlAbortEx.h" #include "DlAbortEx.h"
#include "LogFactory.h" #include "LogFactory.h"
@ -107,14 +106,6 @@ void HandshakeExtensionMessage::doReceivedAction()
const map<string, uint8_t>::value_type& vt = *itr; const map<string, uint8_t>::value_type& vt = *itr;
_peer->setExtension(vt.first, vt.second); _peer->setExtension(vt.first, vt.second);
} }
if(_peer->port > 0) {
// This is needed when _peer is a connection initiator, listen port of
// _peer is now available, which is initially unknown.
// If _peer is a receiver or already its port is known, _peer has to be
// already added to PeerStorage using addPeer() and call
// PeerStorage::addPeer() here does nothing and just returns false.
PEER_STORAGE(_btContext)->addPeer(_peer);
}
} }
void HandshakeExtensionMessage::setPeer(const PeerHandle& peer) void HandshakeExtensionMessage::setPeer(const PeerHandle& peer)

View File

@ -44,7 +44,6 @@ Peer::Peer(string ipaddr, uint16_t port, int32_t pieceLength, int64_t totalLengt
port(port), port(port),
sessionUploadLength(0), sessionUploadLength(0),
sessionDownloadLength(0), sessionDownloadLength(0),
pieceLength(pieceLength),
active(false), active(false),
_badConditionStartTime(0), _badConditionStartTime(0),
_badConditionInterval(10) _badConditionInterval(10)
@ -63,20 +62,10 @@ Peer::Peer(string ipaddr, uint16_t port, int32_t pieceLength, int64_t totalLengt
void Peer::reconfigure(int32_t pieceLength, int64_t totalLength) void Peer::reconfigure(int32_t pieceLength, int64_t totalLength)
{ {
delete bitfield; delete bitfield;
this->pieceLength = pieceLength;
this->bitfield = BitfieldManFactory::getFactoryInstance()-> this->bitfield = BitfieldManFactory::getFactoryInstance()->
createBitfieldMan(this->pieceLength, totalLength); createBitfieldMan(pieceLength, totalLength);
} }
/*
Peer::Peer():entryId(0), ipaddr(""), port(0), bitfield(0),
sessionUploadLength(0), sessionDownloadLength(0),
pieceLength(0)
{
resetStatus();
}
*/
void Peer::updateBitfield(int32_t index, int32_t operation) { void Peer::updateBitfield(int32_t index, int32_t operation) {
if(operation == 1) { if(operation == 1) {
bitfield->setBit(index); bitfield->setBit(index);

View File

@ -46,10 +46,11 @@
#define DEFAULT_LATENCY 1500 #define DEFAULT_LATENCY 1500
class Peer { class Peer {
friend bool operator==(const Peer& p1, const Peer& p2);
friend bool operator!=(const Peer& p1, const Peer& p2);
public: public:
string ipaddr; string ipaddr;
// TCP port which this peer is listening for incoming connections.
// If it is unknown, for example, localhost accepted the incoming connection
// from this peer, set port to 0.
uint16_t port; uint16_t port;
bool amChoking; bool amChoking;
bool amInterested; bool amInterested;
@ -73,7 +74,6 @@ private:
PeerStat peerStat; PeerStat peerStat;
int64_t sessionUploadLength; int64_t sessionUploadLength;
int64_t sessionDownloadLength; int64_t sessionDownloadLength;
int32_t pieceLength;
int32_t latency; int32_t latency;
bool active; bool active;
string id; string id;
@ -88,8 +88,7 @@ public:
} }
bool operator==(const Peer& p) { bool operator==(const Peer& p) {
//return ipaddr == p.ipaddr && port == p.port; return id == p.id || ipaddr == p.ipaddr && port == p.port;
return id == p.id;
} }
bool operator!=(const Peer& p) { bool operator!=(const Peer& p) {

View File

@ -93,12 +93,12 @@ bool PeerListenCommand::execute() {
if(peerInfo.first == localInfo.first) { if(peerInfo.first == localInfo.first) {
continue; continue;
} }
PeerHandle peer = new Peer(peerInfo.first, peerInfo.second, 0, 0); PeerHandle peer = new Peer(peerInfo.first, 0, 0, 0);
PeerReceiveHandshakeCommand* command = PeerReceiveHandshakeCommand* command =
new PeerReceiveHandshakeCommand(CUIDCounterSingletonHolder::instance()->newID(), new PeerReceiveHandshakeCommand(CUIDCounterSingletonHolder::instance()->newID(),
peer, e, peerSocket); peer, e, peerSocket);
e->commands.push_back(command); e->commands.push_back(command);
logger->debug("Accepted the connection from %s:%d.", logger->debug("Accepted the connection from %s:%u.",
peer->ipaddr.c_str(), peer->ipaddr.c_str(),
peer->port); peer->port);
logger->debug("Added CUID#%d to receive Bt handshake.", logger->debug("Added CUID#%d to receive Bt handshake.",

View File

@ -49,12 +49,6 @@ public:
*/ */
virtual bool addPeer(const PeerHandle& peer) = 0; virtual bool addPeer(const PeerHandle& peer) = 0;
/**
* Adds new incoming peer to the internal peer list.
* If the peer is added successfully, returns true. Otherwise returns false.
*/
virtual bool addIncomingPeer(const PeerHandle& peer) = 0;
/** /**
* Adds all peers in peers to internal peer list. * Adds all peers in peers to internal peer list.
*/ */

View File

@ -12,12 +12,10 @@ class DefaultPeerStorageTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testCountPeer); CPPUNIT_TEST(testCountPeer);
CPPUNIT_TEST(testDeleteUnusedPeer); CPPUNIT_TEST(testDeleteUnusedPeer);
CPPUNIT_TEST(testAddPeer); CPPUNIT_TEST(testAddPeer);
CPPUNIT_TEST(testAddPeer_incomingPeer);
CPPUNIT_TEST(testGetPeer); CPPUNIT_TEST(testGetPeer);
CPPUNIT_TEST(testIsPeerAvailable); CPPUNIT_TEST(testIsPeerAvailable);
CPPUNIT_TEST(testActivatePeer); CPPUNIT_TEST(testActivatePeer);
CPPUNIT_TEST(testCalculateStat); CPPUNIT_TEST(testCalculateStat);
CPPUNIT_TEST(testAddIncomingPeer);
CPPUNIT_TEST(testReturnPeer); CPPUNIT_TEST(testReturnPeer);
CPPUNIT_TEST(testOnErasingPeer); CPPUNIT_TEST(testOnErasingPeer);
CPPUNIT_TEST(testReturnPeer); CPPUNIT_TEST(testReturnPeer);
@ -39,12 +37,10 @@ public:
void testCountPeer(); void testCountPeer();
void testDeleteUnusedPeer(); void testDeleteUnusedPeer();
void testAddPeer(); void testAddPeer();
void testAddPeer_incomingPeer();
void testGetPeer(); void testGetPeer();
void testIsPeerAvailable(); void testIsPeerAvailable();
void testActivatePeer(); void testActivatePeer();
void testCalculateStat(); void testCalculateStat();
void testAddIncomingPeer();
void testReturnPeer(); void testReturnPeer();
void testOnErasingPeer(); void testOnErasingPeer();
}; };
@ -99,22 +95,6 @@ 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() { void DefaultPeerStorageTest::testAddPeer() {
DefaultPeerStorage ps(btContext, option); DefaultPeerStorage ps(btContext, option);
@ -145,22 +125,12 @@ void DefaultPeerStorageTest::testAddPeer() {
// peer1 was deleted. // peer1 was deleted.
CPPUNIT_ASSERT_EQUAL((int32_t)3, ps.countPeer()); CPPUNIT_ASSERT_EQUAL((int32_t)3, ps.countPeer());
peer4->startBadCondition(); PeerHandle peer5(new Peer("192.168.0.4", 0, btContext->getPieceLength(),
PeerHandle peer5(new Peer("192.168.0.4", 6889, btContext->getPieceLength(),
btContext->getTotalLength())); btContext->getTotalLength()));
peer5->port = 6889;
// this returns false, because peer4 in the container has error. // this returns false because the peer which has same ip and port has already added
CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer5)); CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer5));
peer3->cuid = 1;
PeerHandle peer6(new Peer("192.168.0.3", 6889, btContext->getPieceLength(),
btContext->getTotalLength()));
// this is false, because peer3's cuid is not zero
CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer6));
} }
void DefaultPeerStorageTest::testGetPeer() { void DefaultPeerStorageTest::testGetPeer() {
@ -231,18 +201,6 @@ void DefaultPeerStorageTest::testActivatePeer() {
void DefaultPeerStorageTest::testCalculateStat() { void DefaultPeerStorageTest::testCalculateStat() {
} }
void DefaultPeerStorageTest::testAddIncomingPeer()
{
DefaultPeerStorage ps(btContext, option);
CPPUNIT_ASSERT(ps.addIncomingPeer(new Peer("192.168.0.1", 6889,
btContext->getPieceLength(),
btContext->getTotalLength())));
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getIncomingPeers().size());
}
void DefaultPeerStorageTest::testReturnPeer() void DefaultPeerStorageTest::testReturnPeer()
{ {
DefaultPeerStorage ps(btContext, option); DefaultPeerStorage ps(btContext, option);
@ -254,20 +212,18 @@ void DefaultPeerStorageTest::testReturnPeer()
ps.addPeer(peer1); ps.addPeer(peer1);
ps.addPeer(peer2); ps.addPeer(peer2);
PeerHandle peer3(new Peer("192.168.0.3", 6889, btContext->getPieceLength(), PeerHandle peer3(new Peer("192.168.0.3", 0, btContext->getPieceLength(),
btContext->getTotalLength())); btContext->getTotalLength()));
ps.addPeer(peer3);
ps.addIncomingPeer(peer3);
CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"),
ps.getPeers().front()->ipaddr);
ps.returnPeer(peer2); ps.returnPeer(peer2);
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), // peer2 is moved to the end of container
ps.getPeers().front()->ipaddr); CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"),
ps.getPeers().back()->ipaddr);
ps.returnPeer(peer3);
CPPUNIT_ASSERT_EQUAL((size_t)0, ps.getIncomingPeers().size());
ps.returnPeer(peer3); // peer3 is removed from the container
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
CPPUNIT_ASSERT(find(ps.getPeers().begin(), ps.getPeers().end(), peer3) == ps.getPeers().end());
} }
void DefaultPeerStorageTest::testOnErasingPeer() void DefaultPeerStorageTest::testOnErasingPeer()

View File

@ -1,8 +1,7 @@
#include "HandshakeExtensionMessage.h" #include "HandshakeExtensionMessage.h"
#include "Peer.h" #include "Peer.h"
#include "MockBtContext.h" #include "MockBtContext.h"
#include "MockPeerStorage.h" #include "Exception.h"
#include "BtRegistry.h"
#include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/HelperMacros.h>
class HandshakeExtensionMessageTest:public CppUnit::TestFixture { class HandshakeExtensionMessageTest:public CppUnit::TestFixture {
@ -21,23 +20,9 @@ private:
public: public:
HandshakeExtensionMessageTest():_btContext(0) {} HandshakeExtensionMessageTest():_btContext(0) {}
void setUp() void setUp() {}
{
BtRegistry::unregisterAll();
MockBtContextHandle btContext = new MockBtContext();
unsigned char infohash[20];
memset(infohash, 0, sizeof(infohash));
btContext->setInfoHash(infohash);
_btContext = btContext;
MockPeerStorageHandle peerStorage = new MockPeerStorage();
BtRegistry::registerPeerStorage(_btContext->getInfoHashAsString(),
peerStorage);
}
void tearDown() void tearDown() {}
{
BtRegistry::unregisterAll();
}
void testGetExtensionMessageID(); void testGetExtensionMessageID();
void testGetExtensionName(); void testGetExtensionName();
@ -99,11 +84,6 @@ void HandshakeExtensionMessageTest::testDoReceivedAction()
CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port); CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port);
CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex")); CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht")); CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
CPPUNIT_ASSERT_EQUAL((size_t)1, PEER_STORAGE(_btContext)->getPeers().size());
PeerHandle p1 = PEER_STORAGE(_btContext)->getPeers().front();
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), p1->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6889, p1->port);
} }
void HandshakeExtensionMessageTest::testCreate() void HandshakeExtensionMessageTest::testCreate()

View File

@ -21,11 +21,6 @@ public:
copy(peers.begin(), peers.end(), back_inserter(this->peers)); copy(peers.begin(), peers.end(), back_inserter(this->peers));
} }
virtual bool addIncomingPeer(const PeerHandle& peer)
{
return true;
}
virtual const Peers& getPeers() { virtual const Peers& getPeers() {
return peers; return peers;
} }