mirror of https://github.com/aria2/aria2
2007-04-06 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
* src/PeerAbstractCommand.cc (onAbort): Call PeerStorage::returnPeer() * src/DefaultPeerStorage.h, src/DefaultPeerStorage.cc (incomingPeers): New variable. (addIncomingPeer): New function. (returnPeer): New function. (onErasingPeer): New function. (addPeer): push_back -> push_front (getActivePeers): Rewritten. (calculateStat): Rewritten. * src/PeerStorage.h (TransferStat::copy): New function. (TransferStat::TransferStat): New function. (TransferStat::operator=): New function. (addIncomingPeer): New function. (returnPeer): New function. * src/PeerListenCommand.cc (execute): Use PeerStorage::addIncomingPeer() instead of Peer::addPeer().pull/1/head
parent
f030408d8e
commit
dd37b7be0a
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
|||
2007-04-06 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
* src/PeerAbstractCommand.cc
|
||||
(onAbort): Call PeerStorage::returnPeer()
|
||||
* src/DefaultPeerStorage.h, src/DefaultPeerStorage.cc
|
||||
(incomingPeers): New variable.
|
||||
(addIncomingPeer): New function.
|
||||
(returnPeer): New function.
|
||||
(onErasingPeer): New function.
|
||||
(addPeer): push_back -> push_front
|
||||
(getActivePeers): Rewritten.
|
||||
(calculateStat): Rewritten.
|
||||
* src/PeerStorage.h
|
||||
(TransferStat::copy): New function.
|
||||
(TransferStat::TransferStat): New function.
|
||||
(TransferStat::operator=): New function.
|
||||
(addIncomingPeer): New function.
|
||||
(returnPeer): New function.
|
||||
* src/PeerListenCommand.cc
|
||||
(execute): Use PeerStorage::addIncomingPeer() instead of
|
||||
Peer::addPeer().
|
||||
|
||||
2007-04-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Connect to a peer actively when download speed is lower than specified
|
||||
|
|
|
@ -39,7 +39,7 @@ bool ActivePeerConnectionCommand::execute() {
|
|||
if(btRuntime->isHalt()) {
|
||||
return true;
|
||||
}
|
||||
if(checkPoint.elapsed(interval)) {
|
||||
if(!pieceStorage->downloadFinished() && checkPoint.elapsed(interval)) {
|
||||
checkPoint.reset();
|
||||
|
||||
TransferStat tstat = peerStorage->calculateStat();
|
||||
|
|
|
@ -56,7 +56,7 @@ bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
|
|||
if(peers.size() >= (size_t)maxPeerListSize) {
|
||||
deleteUnusedPeer(peers.size()-maxPeerListSize+1);
|
||||
}
|
||||
peers.push_back(peer);
|
||||
peers.push_front(peer);
|
||||
return true;
|
||||
} else {
|
||||
const PeerHandle& peer = *itr;
|
||||
|
@ -69,6 +69,12 @@ bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
|
|||
}
|
||||
}
|
||||
|
||||
bool DefaultPeerStorage::addIncomingPeer(const PeerHandle& peer)
|
||||
{
|
||||
incomingPeers.push_back(peer);
|
||||
return true;
|
||||
}
|
||||
|
||||
void DefaultPeerStorage::addPeer(const Peers& peers) {
|
||||
for(Peers::const_iterator itr = peers.begin();
|
||||
itr != peers.end(); itr++) {
|
||||
|
@ -124,7 +130,7 @@ PeerHandle DefaultPeerStorage::getPeer(const string& ipaddr,
|
|||
}
|
||||
}
|
||||
|
||||
int DefaultPeerStorage::countPeer() const {
|
||||
int32_t DefaultPeerStorage::countPeer() const {
|
||||
return peers.size();
|
||||
}
|
||||
|
||||
|
@ -132,45 +138,94 @@ bool DefaultPeerStorage::isPeerAvailable() {
|
|||
return !getUnusedPeer().isNull();
|
||||
}
|
||||
|
||||
Peers DefaultPeerStorage::getActivePeers() {
|
||||
Peers activePeers;
|
||||
for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) {
|
||||
PeerHandle& peer = *itr;
|
||||
class CollectActivePeer {
|
||||
private:
|
||||
Peers _activePeers;
|
||||
public:
|
||||
void operator()(const PeerHandle& peer)
|
||||
{
|
||||
if(peer->isActive()) {
|
||||
activePeers.push_back(peer);
|
||||
_activePeers.push_back(peer);
|
||||
}
|
||||
}
|
||||
return activePeers;
|
||||
|
||||
const Peers& getActivePeers() { return _activePeers; }
|
||||
};
|
||||
|
||||
Peers DefaultPeerStorage::getActivePeers() {
|
||||
CollectActivePeer funcObj;
|
||||
funcObj = for_each(peers.begin(), peers.end(), funcObj);
|
||||
funcObj = for_each(incomingPeers.begin(), incomingPeers.end(), funcObj);
|
||||
return funcObj.getActivePeers();
|
||||
}
|
||||
|
||||
TransferStat DefaultPeerStorage::calculateStat() {
|
||||
TransferStat stat;
|
||||
for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) {
|
||||
PeerHandle& peer = *itr;
|
||||
class CalculateStat {
|
||||
private:
|
||||
TransferStat _stat;
|
||||
public:
|
||||
void operator()(const PeerHandle& peer)
|
||||
{
|
||||
if(peer->isActive()) {
|
||||
stat.downloadSpeed += peer->calculateDownloadSpeed();
|
||||
stat.uploadSpeed += peer->calculateUploadSpeed();
|
||||
_stat.downloadSpeed += peer->calculateDownloadSpeed();
|
||||
_stat.uploadSpeed += peer->calculateUploadSpeed();
|
||||
}
|
||||
stat.sessionDownloadLength += peer->getSessionDownloadLength();
|
||||
stat.sessionUploadLength += peer->getSessionUploadLength();
|
||||
_stat.sessionDownloadLength += peer->getSessionDownloadLength();
|
||||
_stat.sessionUploadLength += peer->getSessionUploadLength();
|
||||
}
|
||||
|
||||
const TransferStat& getTransferStat() { return _stat; }
|
||||
};
|
||||
|
||||
TransferStat DefaultPeerStorage::calculateStat() {
|
||||
CalculateStat calStat;
|
||||
calStat = for_each(peers.begin(), peers.end(), calStat);
|
||||
calStat = for_each(incomingPeers.begin(), incomingPeers.end(), calStat);
|
||||
|
||||
TransferStat stat = calStat.getTransferStat();
|
||||
stat.sessionDownloadLength += removedPeerSessionDownloadLength;
|
||||
stat.sessionUploadLength += removedPeerSessionUploadLength;
|
||||
return stat;
|
||||
}
|
||||
|
||||
void DefaultPeerStorage::deleteUnusedPeer(int delSize) {
|
||||
for(Peers::iterator itr = peers.begin();
|
||||
itr != peers.end() && delSize > 0;) {
|
||||
Peers temp;
|
||||
for(Peers::reverse_iterator itr = peers.rbegin();
|
||||
itr != peers.rend(); ++itr) {
|
||||
const PeerHandle& p = *itr;
|
||||
if(p->cuid == 0) {
|
||||
if(p->cuid == 0 && delSize > 0) {
|
||||
// Update removedPeerSession******Length
|
||||
removedPeerSessionDownloadLength += p->getSessionDownloadLength();
|
||||
removedPeerSessionUploadLength += p->getSessionUploadLength();
|
||||
itr = peers.erase(itr);
|
||||
onErasingPeer(p);
|
||||
delSize--;
|
||||
} else {
|
||||
itr++;
|
||||
temp.push_front(p);
|
||||
}
|
||||
}
|
||||
peers = temp;
|
||||
}
|
||||
|
||||
void DefaultPeerStorage::onErasingPeer(const PeerHandle& peer)
|
||||
{
|
||||
removedPeerSessionDownloadLength += peer->getSessionDownloadLength();
|
||||
removedPeerSessionUploadLength += peer->getSessionUploadLength();
|
||||
}
|
||||
|
||||
void DefaultPeerStorage::returnPeer(const PeerHandle& peer)
|
||||
{
|
||||
Peers::iterator itr = find(peers.begin(), peers.end(), peer);
|
||||
if(itr == peers.end()) {
|
||||
itr = find(incomingPeers.begin(), incomingPeers.end(), peer);
|
||||
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 {
|
||||
peer->startBadCondition();
|
||||
peer->resetStatus();
|
||||
peers.erase(itr);
|
||||
peers.push_back(peer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ private:
|
|||
BtContextHandle btContext;
|
||||
const Option* option;
|
||||
Peers peers;
|
||||
Peers incomingPeers;
|
||||
int maxPeerListSize;
|
||||
Logger* logger;
|
||||
BtRuntimeHandle btRuntime;
|
||||
|
@ -65,7 +66,9 @@ public:
|
|||
|
||||
virtual bool addPeer(const PeerHandle& peer);
|
||||
|
||||
int countPeer() const;
|
||||
virtual bool addIncomingPeer(const PeerHandle& peer);
|
||||
|
||||
int32_t countPeer() const;
|
||||
|
||||
virtual PeerHandle getUnusedPeer();
|
||||
|
||||
|
@ -81,11 +84,17 @@ public:
|
|||
|
||||
virtual TransferStat calculateStat();
|
||||
|
||||
virtual void returnPeer(const PeerHandle& peer);
|
||||
|
||||
void setMaxPeerListSize(int size) { this->maxPeerListSize = size; }
|
||||
|
||||
int getMaxPeerListSize() const { return maxPeerListSize; }
|
||||
|
||||
void deleteUnusedPeer(int delSize);
|
||||
|
||||
void onErasingPeer(const PeerHandle& peer);
|
||||
|
||||
const Peers& getIncomingPeers() const { return incomingPeers; }
|
||||
};
|
||||
|
||||
#endif // _D_DEFAULT_PEER_STORAGE_H_
|
||||
|
|
|
@ -97,8 +97,7 @@ bool PeerAbstractCommand::prepareForRetry(int wait) {
|
|||
}
|
||||
|
||||
void PeerAbstractCommand::onAbort(RecoverableException* ex) {
|
||||
peer->startBadCondition();
|
||||
peer->resetStatus();
|
||||
peerStorage->returnPeer(peer);
|
||||
}
|
||||
|
||||
void PeerAbstractCommand::disableReadCheckSocket() {
|
||||
|
|
|
@ -80,7 +80,7 @@ bool PeerListenCommand::execute() {
|
|||
PeerHandle peer = PeerHandle(new Peer(peerInfo.first, peerInfo.second,
|
||||
btContext->getPieceLength(),
|
||||
btContext->getTotalLength()));
|
||||
if(peerStorage->addPeer(peer)) {
|
||||
if(peerStorage->addIncomingPeer(peer)) {
|
||||
int newCuid = btRuntime->getNewCuid();
|
||||
peer->cuid = newCuid;
|
||||
PeerInteractionCommand* command =
|
||||
|
|
|
@ -44,10 +44,31 @@ public:
|
|||
int32_t uploadSpeed;
|
||||
int64_t sessionDownloadLength;
|
||||
int64_t sessionUploadLength;
|
||||
|
||||
void copy(const TransferStat& stat)
|
||||
{
|
||||
downloadSpeed = stat.downloadSpeed;
|
||||
uploadSpeed = stat.uploadSpeed;
|
||||
sessionDownloadLength = stat.sessionDownloadLength;
|
||||
sessionUploadLength = stat.sessionUploadLength;
|
||||
}
|
||||
public:
|
||||
TransferStat():downloadSpeed(0), uploadSpeed(0),
|
||||
sessionDownloadLength(0), sessionUploadLength(0) {}
|
||||
|
||||
TransferStat(const TransferStat& stat)
|
||||
{
|
||||
copy(stat);
|
||||
}
|
||||
|
||||
TransferStat& operator=(const TransferStat& stat)
|
||||
{
|
||||
if(this != &stat) {
|
||||
copy(stat);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
int32_t getDownloadSpeed() const {
|
||||
return downloadSpeed;
|
||||
}
|
||||
|
@ -86,11 +107,17 @@ public:
|
|||
virtual ~PeerStorage() {}
|
||||
|
||||
/**
|
||||
* Adds new peer to internal peer list.
|
||||
* Adds new peer to the internal peer list.
|
||||
* If the peer is added successfully, returns true. Otherwise returns false.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
|
@ -121,6 +148,11 @@ public:
|
|||
* Calculates current download/upload statistics.
|
||||
*/
|
||||
virtual TransferStat calculateStat() = 0;
|
||||
|
||||
/**
|
||||
* Tells PeerStorage object that peer is no longer used in the session.
|
||||
*/
|
||||
virtual void returnPeer(const PeerHandle& peer) = 0;
|
||||
};
|
||||
|
||||
typedef SharedHandle<PeerStorage> PeerStorageHandle;
|
||||
|
|
|
@ -16,6 +16,9 @@ class DefaultPeerStorageTest:public CppUnit::TestFixture {
|
|||
CPPUNIT_TEST(testIsPeerAvailable);
|
||||
CPPUNIT_TEST(testActivatePeer);
|
||||
CPPUNIT_TEST(testCalculateStat);
|
||||
CPPUNIT_TEST(testAddIncomingPeer);
|
||||
CPPUNIT_TEST(testReturnPeer);
|
||||
CPPUNIT_TEST(testOnErasingPeer);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
private:
|
||||
BtContextHandle btContext;
|
||||
|
@ -38,6 +41,9 @@ public:
|
|||
void testIsPeerAvailable();
|
||||
void testActivatePeer();
|
||||
void testCalculateStat();
|
||||
void testAddIncomingPeer();
|
||||
void testReturnPeer();
|
||||
void testOnErasingPeer();
|
||||
};
|
||||
|
||||
|
||||
|
@ -118,13 +124,25 @@ void DefaultPeerStorageTest::testAddPeer() {
|
|||
btContext->getTotalLength()));
|
||||
|
||||
CPPUNIT_ASSERT(ps.addPeer(peer4));
|
||||
// peer3 was deleted.
|
||||
// peer1 was deleted.
|
||||
CPPUNIT_ASSERT_EQUAL(3, ps.countPeer());
|
||||
|
||||
peer4->startBadCondition();
|
||||
|
||||
PeerHandle peer5(new Peer("192.168.0.4", 6889, btContext->getPieceLength(),
|
||||
btContext->getTotalLength()));
|
||||
|
||||
// this returns false, because peer4 in the container has error.
|
||||
CPPUNIT_ASSERT_EQUAL(false, ps.addPeer(peer4));
|
||||
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() {
|
||||
|
@ -194,3 +212,47 @@ void DefaultPeerStorageTest::testActivatePeer() {
|
|||
|
||||
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()
|
||||
{
|
||||
DefaultPeerStorage ps(btContext, option);
|
||||
|
||||
PeerHandle peer1(new Peer("192.168.0.1", 6889, btContext->getPieceLength(),
|
||||
btContext->getTotalLength()));
|
||||
PeerHandle peer2(new Peer("192.168.0.2", 6889, btContext->getPieceLength(),
|
||||
btContext->getTotalLength()));
|
||||
ps.addPeer(peer1);
|
||||
ps.addPeer(peer2);
|
||||
|
||||
PeerHandle peer3(new Peer("192.168.0.3", 6889, btContext->getPieceLength(),
|
||||
btContext->getTotalLength()));
|
||||
|
||||
ps.addIncomingPeer(peer3);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"),
|
||||
ps.getPeers().front()->ipaddr);
|
||||
ps.returnPeer(peer2);
|
||||
CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"),
|
||||
ps.getPeers().front()->ipaddr);
|
||||
|
||||
ps.returnPeer(peer3);
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)0, ps.getIncomingPeers().size());
|
||||
|
||||
}
|
||||
|
||||
void DefaultPeerStorageTest::testOnErasingPeer()
|
||||
{
|
||||
// test this
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
TESTS = aria2c
|
||||
check_PROGRAMS = $(TESTS)
|
||||
aria2c_SOURCES = AllTest.cc\
|
||||
PeerTest.cc\
|
||||
DefaultPeerStorageTest.cc\
|
||||
RequestFactoryTest.cc\
|
||||
NetrcAuthResolverTest.cc\
|
||||
DefaultAuthResolverTest.cc\
|
||||
|
@ -41,13 +43,11 @@ aria2c_SOURCES = AllTest.cc\
|
|||
TrackerWatcherCommandTest.cc\
|
||||
DefaultBtContextTest.cc\
|
||||
DefaultPieceStorageTest.cc\
|
||||
DefaultPeerStorageTest.cc\
|
||||
DefaultBtAnnounceTest.cc\
|
||||
BtRegistryTest.cc\
|
||||
DefaultBtMessageDispatcherTest.cc\
|
||||
MockPeerStorage.h\
|
||||
DefaultBtRequestFactoryTest.cc\
|
||||
PeerTest.cc\
|
||||
BtAllowedFastMessageTest.cc\
|
||||
BtBitfieldMessageTest.cc\
|
||||
BtCancelMessageTest.cc\
|
||||
|
|
|
@ -57,7 +57,8 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
|||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
am__EXEEXT_1 = aria2c$(EXEEXT)
|
||||
am_aria2c_OBJECTS = AllTest.$(OBJEXT) RequestFactoryTest.$(OBJEXT) \
|
||||
am_aria2c_OBJECTS = AllTest.$(OBJEXT) PeerTest.$(OBJEXT) \
|
||||
DefaultPeerStorageTest.$(OBJEXT) RequestFactoryTest.$(OBJEXT) \
|
||||
NetrcAuthResolverTest.$(OBJEXT) \
|
||||
DefaultAuthResolverTest.$(OBJEXT) RequestTest.$(OBJEXT) \
|
||||
HttpRequestTest.$(OBJEXT) UtilTest.$(OBJEXT) \
|
||||
|
@ -80,10 +81,9 @@ am_aria2c_OBJECTS = AllTest.$(OBJEXT) RequestFactoryTest.$(OBJEXT) \
|
|||
AnnounceListTest.$(OBJEXT) TrackerWatcherCommandTest.$(OBJEXT) \
|
||||
DefaultBtContextTest.$(OBJEXT) \
|
||||
DefaultPieceStorageTest.$(OBJEXT) \
|
||||
DefaultPeerStorageTest.$(OBJEXT) \
|
||||
DefaultBtAnnounceTest.$(OBJEXT) BtRegistryTest.$(OBJEXT) \
|
||||
DefaultBtMessageDispatcherTest.$(OBJEXT) \
|
||||
DefaultBtRequestFactoryTest.$(OBJEXT) PeerTest.$(OBJEXT) \
|
||||
DefaultBtRequestFactoryTest.$(OBJEXT) \
|
||||
BtAllowedFastMessageTest.$(OBJEXT) \
|
||||
BtBitfieldMessageTest.$(OBJEXT) BtCancelMessageTest.$(OBJEXT) \
|
||||
BtChokeMessageTest.$(OBJEXT) BtHaveAllMessageTest.$(OBJEXT) \
|
||||
|
@ -262,6 +262,8 @@ sysconfdir = @sysconfdir@
|
|||
target_alias = @target_alias@
|
||||
TESTS = aria2c
|
||||
aria2c_SOURCES = AllTest.cc\
|
||||
PeerTest.cc\
|
||||
DefaultPeerStorageTest.cc\
|
||||
RequestFactoryTest.cc\
|
||||
NetrcAuthResolverTest.cc\
|
||||
DefaultAuthResolverTest.cc\
|
||||
|
@ -302,13 +304,11 @@ aria2c_SOURCES = AllTest.cc\
|
|||
TrackerWatcherCommandTest.cc\
|
||||
DefaultBtContextTest.cc\
|
||||
DefaultPieceStorageTest.cc\
|
||||
DefaultPeerStorageTest.cc\
|
||||
DefaultBtAnnounceTest.cc\
|
||||
BtRegistryTest.cc\
|
||||
DefaultBtMessageDispatcherTest.cc\
|
||||
MockPeerStorage.h\
|
||||
DefaultBtRequestFactoryTest.cc\
|
||||
PeerTest.cc\
|
||||
BtAllowedFastMessageTest.cc\
|
||||
BtBitfieldMessageTest.cc\
|
||||
BtCancelMessageTest.cc\
|
||||
|
|
Loading…
Reference in New Issue