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>
|
||||
|
||||
Added _incoming member to Peer class and made it true if the peer
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -471,4 +471,9 @@ void Peer::setIncomingPeer(bool incoming)
|
|||
_incoming = incoming;
|
||||
}
|
||||
|
||||
void Peer::setFirstContactTime(const Time& time)
|
||||
{
|
||||
_firstContactTime = time;
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue