mirror of https://github.com/aria2/aria2
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.ccpull/1/head
parent
46f0e018d4
commit
c46b6055c6
10
ChangeLog
10
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>
|
2008-09-02 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
Added _incoming member to Peer class and made it true if the peer
|
Added _incoming member to Peer class and made it true if the peer
|
||||||
|
|
|
@ -392,32 +392,24 @@ void DefaultBtInteractive::checkActiveInteraction()
|
||||||
|
|
||||||
void DefaultBtInteractive::addPeerExchangeMessage()
|
void DefaultBtInteractive::addPeerExchangeMessage()
|
||||||
{
|
{
|
||||||
time_t interval = 60;
|
if(_pexCheckPoint.elapsed(UTPexExtensionMessage::DEFAULT_INTERVAL)) {
|
||||||
if(_pexCheckPoint.elapsed(interval)) {
|
|
||||||
UTPexExtensionMessageHandle m
|
UTPexExtensionMessageHandle m
|
||||||
(new UTPexExtensionMessage(peer->getExtensionMessageID("ut_pex")));
|
(new UTPexExtensionMessage(peer->getExtensionMessageID("ut_pex")));
|
||||||
const Peers& peers = peerStorage->getPeers();
|
const Peers& peers = peerStorage->getPeers();
|
||||||
{
|
{
|
||||||
size_t max = 30;
|
for(std::deque<SharedHandle<Peer> >::const_iterator i =
|
||||||
for(Peers::const_iterator i = peers.begin();
|
peers.begin(); i != peers.end() && !m->freshPeersAreFull(); ++i) {
|
||||||
i != peers.end() && max; ++i) {
|
if(peer->ipaddr != (*i)->ipaddr) {
|
||||||
const PeerHandle& cpeer = *i;
|
m->addFreshPeer(*i);
|
||||||
if(peer->ipaddr != cpeer->ipaddr && !cpeer->isIncomingPeer() &&
|
|
||||||
!cpeer->getFirstContactTime().elapsed(interval)) {
|
|
||||||
m->addFreshPeer(cpeer);
|
|
||||||
--max;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
size_t max = 10;
|
for(std::deque<SharedHandle<Peer> >::const_reverse_iterator i =
|
||||||
for(Peers::const_reverse_iterator i = peers.rbegin();
|
peers.rbegin(); i != peers.rend() && !m->droppedPeersAreFull();
|
||||||
i != peers.rend() && max; ++i) {
|
++i) {
|
||||||
const PeerHandle& cpeer = *i;
|
if(peer->ipaddr != (*i)->ipaddr) {
|
||||||
if(peer->ipaddr != cpeer->ipaddr &&
|
m->addDroppedPeer(*i);
|
||||||
!cpeer->getBadConditionStartTime().elapsed(interval)) {
|
|
||||||
m->addDroppedPeer(cpeer);
|
|
||||||
--max;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -471,4 +471,9 @@ void Peer::setIncomingPeer(bool incoming)
|
||||||
_incoming = incoming;
|
_incoming = incoming;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Peer::setFirstContactTime(const Time& time)
|
||||||
|
{
|
||||||
|
_firstContactTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -114,6 +114,8 @@ public:
|
||||||
|
|
||||||
const Time& getFirstContactTime() const;
|
const Time& getFirstContactTime() const;
|
||||||
|
|
||||||
|
void setFirstContactTime(const Time& time);
|
||||||
|
|
||||||
const Time& getBadConditionStartTime() const;
|
const Time& getBadConditionStartTime() const;
|
||||||
|
|
||||||
// Before calling following member functions, make sure that
|
// Before calling following member functions, make sure that
|
||||||
|
|
|
@ -53,7 +53,10 @@ namespace aria2 {
|
||||||
const std::string UTPexExtensionMessage::EXTENSION_NAME = "ut_pex";
|
const std::string UTPexExtensionMessage::EXTENSION_NAME = "ut_pex";
|
||||||
|
|
||||||
UTPexExtensionMessage::UTPexExtensionMessage(uint8_t extensionMessageID):
|
UTPexExtensionMessage::UTPexExtensionMessage(uint8_t extensionMessageID):
|
||||||
_extensionMessageID(extensionMessageID) {}
|
_extensionMessageID(extensionMessageID),
|
||||||
|
_interval(DEFAULT_INTERVAL),
|
||||||
|
_maxFreshPeer(DEFAULT_MAX_FRESH_PEER),
|
||||||
|
_maxDroppedPeer(DEFAULT_MAX_DROPPED_PEER) {}
|
||||||
|
|
||||||
UTPexExtensionMessage::~UTPexExtensionMessage() {}
|
UTPexExtensionMessage::~UTPexExtensionMessage() {}
|
||||||
|
|
||||||
|
@ -96,9 +99,15 @@ void UTPexExtensionMessage::doReceivedAction()
|
||||||
PEER_STORAGE(_btContext)->addPeer(_freshPeers);
|
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
|
const Peers& UTPexExtensionMessage::getFreshPeers() const
|
||||||
|
@ -106,9 +115,20 @@ const Peers& UTPexExtensionMessage::getFreshPeers() const
|
||||||
return _freshPeers;
|
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
|
const Peers& UTPexExtensionMessage::getDroppedPeers() const
|
||||||
|
@ -116,6 +136,31 @@ const Peers& UTPexExtensionMessage::getDroppedPeers() const
|
||||||
return _droppedPeers;
|
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)
|
void UTPexExtensionMessage::setBtContext(const BtContextHandle& btContext)
|
||||||
{
|
{
|
||||||
_btContext = btContext;
|
_btContext = btContext;
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#define _D_UT_PEX_EXTENSION_MESSAGE_H_
|
#define _D_UT_PEX_EXTENSION_MESSAGE_H_
|
||||||
|
|
||||||
#include "ExtensionMessage.h"
|
#include "ExtensionMessage.h"
|
||||||
|
#include "a2time.h"
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
|
||||||
|
@ -56,6 +57,12 @@ private:
|
||||||
|
|
||||||
SharedHandle<BtContext> _btContext;
|
SharedHandle<BtContext> _btContext;
|
||||||
|
|
||||||
|
time_t _interval;
|
||||||
|
|
||||||
|
size_t _maxFreshPeer;
|
||||||
|
|
||||||
|
size_t _maxDroppedPeer;
|
||||||
|
|
||||||
std::pair<std::string, std::string>
|
std::pair<std::string, std::string>
|
||||||
createCompactPeerListAndFlag(const std::deque<SharedHandle<Peer> >& peers);
|
createCompactPeerListAndFlag(const std::deque<SharedHandle<Peer> >& peers);
|
||||||
|
|
||||||
|
@ -82,18 +89,36 @@ public:
|
||||||
|
|
||||||
virtual void doReceivedAction();
|
virtual void doReceivedAction();
|
||||||
|
|
||||||
void addFreshPeer(const SharedHandle<Peer>& peer);
|
bool addFreshPeer(const SharedHandle<Peer>& peer);
|
||||||
|
|
||||||
const std::deque<SharedHandle<Peer> >& getFreshPeers() const;
|
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;
|
const std::deque<SharedHandle<Peer> >& getDroppedPeers() const;
|
||||||
|
|
||||||
|
bool droppedPeersAreFull() const;
|
||||||
|
|
||||||
void setBtContext(const SharedHandle<BtContext>& btContext);
|
void setBtContext(const SharedHandle<BtContext>& btContext);
|
||||||
|
|
||||||
static UTPexExtensionMessageHandle create(const SharedHandle<BtContext>& btContext,
|
static UTPexExtensionMessageHandle create(const SharedHandle<BtContext>& btContext,
|
||||||
const unsigned char* data, size_t len);
|
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;
|
typedef SharedHandle<UTPexExtensionMessage> UTPexExtensionMessageHandle;
|
||||||
|
|
|
@ -22,6 +22,10 @@ class UTPexExtensionMessageTest:public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testToString);
|
CPPUNIT_TEST(testToString);
|
||||||
CPPUNIT_TEST(testDoReceivedAction);
|
CPPUNIT_TEST(testDoReceivedAction);
|
||||||
CPPUNIT_TEST(testCreate);
|
CPPUNIT_TEST(testCreate);
|
||||||
|
CPPUNIT_TEST(testAddFreshPeer);
|
||||||
|
CPPUNIT_TEST(testAddDroppedPeer);
|
||||||
|
CPPUNIT_TEST(testFreshPeersAreFull);
|
||||||
|
CPPUNIT_TEST(testDroppedPeersAreFull);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
private:
|
private:
|
||||||
SharedHandle<MockBtContext> _btContext;
|
SharedHandle<MockBtContext> _btContext;
|
||||||
|
@ -50,6 +54,10 @@ public:
|
||||||
void testToString();
|
void testToString();
|
||||||
void testDoReceivedAction();
|
void testDoReceivedAction();
|
||||||
void testCreate();
|
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));
|
SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
|
||||||
msg.addFreshPeer(p2);
|
msg.addFreshPeer(p2);
|
||||||
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
||||||
|
p3->startBadCondition();
|
||||||
msg.addDroppedPeer(p3);
|
msg.addDroppedPeer(p3);
|
||||||
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
||||||
|
p4->startBadCondition();
|
||||||
msg.addDroppedPeer(p4);
|
msg.addDroppedPeer(p4);
|
||||||
|
|
||||||
unsigned char c1[6];
|
unsigned char c1[6];
|
||||||
|
@ -110,8 +120,10 @@ void UTPexExtensionMessageTest::testToString()
|
||||||
SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
|
SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
|
||||||
msg.addFreshPeer(p2);
|
msg.addFreshPeer(p2);
|
||||||
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
||||||
|
p3->startBadCondition();
|
||||||
msg.addDroppedPeer(p3);
|
msg.addDroppedPeer(p3);
|
||||||
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
||||||
|
p4->startBadCondition();
|
||||||
msg.addDroppedPeer(p4);
|
msg.addDroppedPeer(p4);
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("ut_pex added=2, dropped=2"), msg.toString());
|
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));
|
SharedHandle<Peer> p2(new Peer("10.1.1.2", 9999));
|
||||||
msg.addFreshPeer(p2);
|
msg.addFreshPeer(p2);
|
||||||
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
SharedHandle<Peer> p3(new Peer("192.168.0.2", 6882));
|
||||||
|
p3->startBadCondition();
|
||||||
msg.addDroppedPeer(p3);
|
msg.addDroppedPeer(p3);
|
||||||
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
SharedHandle<Peer> p4(new Peer("10.1.1.3", 10000));
|
||||||
|
p4->startBadCondition();
|
||||||
msg.addDroppedPeer(p4);
|
msg.addDroppedPeer(p4);
|
||||||
msg.setBtContext(_btContext);
|
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
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue