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
pull/1/head
Tatsuhiro Tsujikawa 2008-09-02 12:31:04 +00:00
parent 46f0e018d4
commit c46b6055c6
7 changed files with 178 additions and 25 deletions

View File

@ -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

View File

@ -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);
}
}
}

View File

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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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