2009-10-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Removed peerStorage from DHTPeerAnnounceEntry. It is unlikely to
	receive get_peers request for torrent which the client is now
	downloading.
	* src/BtSetup.cc
	* src/DHTPeerAnnounceEntry.cc
	* src/DHTPeerAnnounceEntry.h
	* src/DHTPeerAnnounceStorage.cc
	* src/DHTPeerAnnounceStorage.h
	* src/RequestGroup.cc
	* test/DHTPeerAnnounceEntryTest.cc
	* test/DHTPeerAnnounceStorageTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-10-31 11:54:54 +00:00
parent 0dcb41da49
commit 20c8ce4128
9 changed files with 16 additions and 125 deletions

View File

@ -1,3 +1,17 @@
2009-10-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Removed peerStorage from DHTPeerAnnounceEntry. It is unlikely to
receive get_peers request for torrent which the client is now
downloading.
* src/BtSetup.cc
* src/DHTPeerAnnounceEntry.cc
* src/DHTPeerAnnounceEntry.h
* src/DHTPeerAnnounceStorage.cc
* src/DHTPeerAnnounceStorage.h
* src/RequestGroup.cc
* test/DHTPeerAnnounceEntryTest.cc
* test/DHTPeerAnnounceStorageTest.cc
2009-10-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-10-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that in Windows environment new blank line is Fixed the bug that in Windows environment new blank line is

View File

@ -112,8 +112,6 @@ void BtSetup::setup(std::deque<Command*>& commands,
} }
if(torrentAttrs[bittorrent::PRIVATE].i() == 0 && DHTSetup::initialized()) { if(torrentAttrs[bittorrent::PRIVATE].i() == 0 && DHTSetup::initialized()) {
DHTRegistry::_peerAnnounceStorage->addPeerAnnounce
(torrentAttrs[bittorrent::INFO_HASH].uc(), peerStorage);
DHTGetPeersCommand* command = DHTGetPeersCommand* command =
new DHTGetPeersCommand(e->newCUID(), requestGroup, e); new DHTGetPeersCommand(e->newCUID(), requestGroup, e);
command->setTaskQueue(DHTRegistry::_taskQueue); command->setTaskQueue(DHTRegistry::_taskQueue);

View File

@ -38,7 +38,6 @@
#include <algorithm> #include <algorithm>
#include "Peer.h" #include "Peer.h"
#include "PeerStorage.h"
namespace aria2 { namespace aria2 {
@ -60,17 +59,6 @@ void DHTPeerAnnounceEntry::addPeerAddrEntry(const PeerAddrEntry& entry)
notifyUpdate(); notifyUpdate();
} }
void DHTPeerAnnounceEntry::clearLocal()
{
_peerStorage.reset();
}
void DHTPeerAnnounceEntry::setPeerStorage
(const SharedHandle<PeerStorage>& peerStorage)
{
_peerStorage = peerStorage;
}
size_t DHTPeerAnnounceEntry::countPeerAddrEntry() const size_t DHTPeerAnnounceEntry::countPeerAddrEntry() const
{ {
return _peerAddrEntries.size(); return _peerAddrEntries.size();
@ -100,7 +88,7 @@ void DHTPeerAnnounceEntry::removeStalePeerAddrEntry(time_t timeout)
bool DHTPeerAnnounceEntry::empty() const bool DHTPeerAnnounceEntry::empty() const
{ {
return _peerAddrEntries.empty() && _peerStorage.isNull(); return _peerAddrEntries.empty();
} }
void DHTPeerAnnounceEntry::getPeers(std::deque<SharedHandle<Peer> >& peers) const void DHTPeerAnnounceEntry::getPeers(std::deque<SharedHandle<Peer> >& peers) const
@ -110,9 +98,6 @@ void DHTPeerAnnounceEntry::getPeers(std::deque<SharedHandle<Peer> >& peers) cons
SharedHandle<Peer> peer(new Peer((*i).getIPAddress(), (*i).getPort())); SharedHandle<Peer> peer(new Peer((*i).getIPAddress(), (*i).getPort()));
peers.push_back(peer); peers.push_back(peer);
} }
if(!_peerStorage.isNull()) {
_peerStorage->getActivePeers(peers);
}
} }
void DHTPeerAnnounceEntry::notifyUpdate() void DHTPeerAnnounceEntry::notifyUpdate()

View File

@ -47,7 +47,6 @@
namespace aria2 { namespace aria2 {
class Peer; class Peer;
class PeerStorage;
class DHTPeerAnnounceEntry { class DHTPeerAnnounceEntry {
private: private:
@ -55,8 +54,6 @@ private:
std::deque<PeerAddrEntry> _peerAddrEntries; std::deque<PeerAddrEntry> _peerAddrEntries;
SharedHandle<PeerStorage> _peerStorage;
Time _lastUpdated; Time _lastUpdated;
public: public:
DHTPeerAnnounceEntry(const unsigned char* infoHash); DHTPeerAnnounceEntry(const unsigned char* infoHash);
@ -67,10 +64,6 @@ public:
// if it already exists, update "Last Updated" property. // if it already exists, update "Last Updated" property.
void addPeerAddrEntry(const PeerAddrEntry& entry); void addPeerAddrEntry(const PeerAddrEntry& entry);
void clearLocal();
void setPeerStorage(const SharedHandle<PeerStorage>& peerStorage);
size_t countPeerAddrEntry() const; size_t countPeerAddrEntry() const;
const std::deque<PeerAddrEntry>& getPeerAddrEntries() const const std::deque<PeerAddrEntry>& getPeerAddrEntries() const

View File

@ -39,7 +39,6 @@
#include "DHTPeerAnnounceEntry.h" #include "DHTPeerAnnounceEntry.h"
#include "Peer.h" #include "Peer.h"
#include "PeerStorage.h"
#include "DHTConstants.h" #include "DHTConstants.h"
#include "DHTTaskQueue.h" #include "DHTTaskQueue.h"
#include "DHTTaskFactory.h" #include "DHTTaskFactory.h"
@ -92,34 +91,6 @@ DHTPeerAnnounceStorage::addPeerAnnounce(const unsigned char* infoHash,
getPeerAnnounceEntry(infoHash)->addPeerAddrEntry(PeerAddrEntry(ipaddr, port)); getPeerAnnounceEntry(infoHash)->addPeerAddrEntry(PeerAddrEntry(ipaddr, port));
} }
// add peer announce as localhost downloading the content
void DHTPeerAnnounceStorage::addPeerAnnounce
(const unsigned char* infoHash, const SharedHandle<PeerStorage>& peerStorage)
{
_logger->debug("Adding localhost to peer announce list: infoHash=%s",
util::toHex(infoHash, DHT_ID_LENGTH).c_str());
SharedHandle<DHTPeerAnnounceEntry> entry =
getPeerAnnounceEntry(infoHash);
entry->setPeerStorage(peerStorage);
}
void DHTPeerAnnounceStorage::removeLocalPeerAnnounce
(const unsigned char* infoHash)
{
SharedHandle<DHTPeerAnnounceEntry> entry(new DHTPeerAnnounceEntry(infoHash));
std::deque<SharedHandle<DHTPeerAnnounceEntry> >::iterator i =
std::lower_bound(_entries.begin(), _entries.end(), entry, InfoHashLess());
if(i != _entries.end() &&
memcmp(infoHash, (*i)->getInfoHash(), DHT_ID_LENGTH) == 0) {
(*i)->clearLocal();
if((*i)->empty()) {
_entries.erase(i);
}
}
}
bool DHTPeerAnnounceStorage::contains(const unsigned char* infoHash) const bool DHTPeerAnnounceStorage::contains(const unsigned char* infoHash) const
{ {
SharedHandle<DHTPeerAnnounceEntry> entry(new DHTPeerAnnounceEntry(infoHash)); SharedHandle<DHTPeerAnnounceEntry> entry(new DHTPeerAnnounceEntry(infoHash));

View File

@ -41,7 +41,6 @@
namespace aria2 { namespace aria2 {
class PeerStorage;
class Peer; class Peer;
class DHTPeerAnnounceEntry; class DHTPeerAnnounceEntry;
class DHTTaskQueue; class DHTTaskQueue;
@ -67,14 +66,6 @@ public:
void addPeerAnnounce(const unsigned char* infoHash, void addPeerAnnounce(const unsigned char* infoHash,
const std::string& ipaddr, uint16_t port); const std::string& ipaddr, uint16_t port);
// add peer announce as localhost downloading the content
void addPeerAnnounce(const unsigned char* infoHash,
const SharedHandle<PeerStorage>& peerStorage);
// Call DHTPeerAnnounceEntry::clearLocal() for infoHash if found.
// If DHTPeerAnnounceEntry is empty, it is erased.
void removeLocalPeerAnnounce(const unsigned char* infoHash);
bool contains(const unsigned char* infoHash) const; bool contains(const unsigned char* infoHash) const;
void getPeers(std::deque<SharedHandle<Peer> >& peers, void getPeers(std::deque<SharedHandle<Peer> >& peers,

View File

@ -764,10 +764,6 @@ void RequestGroup::releaseRuntimeResource(DownloadEngine* e)
if(!contextInReg.isNull() && if(!contextInReg.isNull() &&
contextInReg->getOwnerRequestGroup()->getGID() == _gid) { contextInReg->getOwnerRequestGroup()->getGID() == _gid) {
btRegistry->remove(infoHash); btRegistry->remove(infoHash);
if(!DHTRegistry::_peerAnnounceStorage.isNull()) {
DHTRegistry::_peerAnnounceStorage->removeLocalPeerAnnounce
(torrentAttrs[bittorrent::INFO_HASH].uc());
}
} }
} }
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT

View File

@ -6,8 +6,8 @@
#include "Exception.h" #include "Exception.h"
#include "util.h" #include "util.h"
#include "MockPeerStorage.h"
#include "FileEntry.h" #include "FileEntry.h"
#include "Peer.h"
namespace aria2 { namespace aria2 {
@ -59,11 +59,6 @@ void DHTPeerAnnounceEntryTest::testEmpty()
entry.addPeerAddrEntry(PeerAddrEntry("192.168.0.1", 6881)); entry.addPeerAddrEntry(PeerAddrEntry("192.168.0.1", 6881));
CPPUNIT_ASSERT(!entry.empty()); CPPUNIT_ASSERT(!entry.empty());
} }
{
DHTPeerAnnounceEntry entry(infohash);
entry.setPeerStorage(SharedHandle<PeerStorage>(new MockPeerStorage()));
CPPUNIT_ASSERT(!entry.empty());
}
{ {
DHTPeerAnnounceEntry entry(infohash); DHTPeerAnnounceEntry entry(infohash);
CPPUNIT_ASSERT(entry.empty()); CPPUNIT_ASSERT(entry.empty());
@ -92,16 +87,6 @@ void DHTPeerAnnounceEntryTest::testGetPeers()
unsigned char infohash[DHT_ID_LENGTH]; unsigned char infohash[DHT_ID_LENGTH];
memset(infohash, 0xff, DHT_ID_LENGTH); memset(infohash, 0xff, DHT_ID_LENGTH);
SharedHandle<MockPeerStorage> peerStorage(new MockPeerStorage());
{
SharedHandle<Peer> activePeers[2];
activePeers[0].reset(new Peer("192.168.0.3", 6883));
activePeers[1].reset(new Peer("192.168.0.4", 6884));
peerStorage->setActivePeers(std::deque<SharedHandle<Peer> >(&activePeers[0],
&activePeers[2]));
}
DHTPeerAnnounceEntry entry(infohash); DHTPeerAnnounceEntry entry(infohash);
{ {
std::deque<SharedHandle<Peer> > peers; std::deque<SharedHandle<Peer> > peers;
@ -121,20 +106,6 @@ void DHTPeerAnnounceEntryTest::testGetPeers()
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), peers[1]->ipaddr); CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), peers[1]->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6882, peers[1]->port); CPPUNIT_ASSERT_EQUAL((uint16_t)6882, peers[1]->port);
} }
entry.setPeerStorage(peerStorage);
{
std::deque<SharedHandle<Peer> > peers;
entry.getPeers(peers);
CPPUNIT_ASSERT_EQUAL((size_t)4, peers.size());
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peers[0]->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6881, peers[0]->port);
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), peers[1]->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6882, peers[1]->port);
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.3"), peers[2]->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6883, peers[2]->port);
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.4"), peers[3]->ipaddr);
CPPUNIT_ASSERT_EQUAL((uint16_t)6884, peers[3]->port);
}
} }
} // namespace aria2 } // namespace aria2

View File

@ -7,7 +7,6 @@
#include "Exception.h" #include "Exception.h"
#include "util.h" #include "util.h"
#include "DownloadContext.h" #include "DownloadContext.h"
#include "MockPeerStorage.h"
#include "DHTConstants.h" #include "DHTConstants.h"
#include "Peer.h" #include "Peer.h"
#include "FileEntry.h" #include "FileEntry.h"
@ -19,11 +18,9 @@ class DHTPeerAnnounceStorageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(DHTPeerAnnounceStorageTest); CPPUNIT_TEST_SUITE(DHTPeerAnnounceStorageTest);
CPPUNIT_TEST(testAddAnnounce); CPPUNIT_TEST(testAddAnnounce);
CPPUNIT_TEST(testRemovePeerAnnounce);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void testAddAnnounce(); void testAddAnnounce();
void testRemovePeerAnnounce();
}; };
@ -61,29 +58,4 @@ static SharedHandle<DownloadContext> createDownloadContext
return dctx; return dctx;
} }
void DHTPeerAnnounceStorageTest::testRemovePeerAnnounce()
{
unsigned char infoHash1[DHT_ID_LENGTH];
memset(infoHash1, 0xff, DHT_ID_LENGTH);
unsigned char infoHash2[DHT_ID_LENGTH];
memset(infoHash2, 0xf0, DHT_ID_LENGTH);
DHTPeerAnnounceStorage storage;
SharedHandle<DownloadContext> ctx1 = createDownloadContext(infoHash1);
SharedHandle<DownloadContext> ctx2 = createDownloadContext(infoHash2);
SharedHandle<MockPeerStorage> peerStorage1(new MockPeerStorage());
SharedHandle<MockPeerStorage> peerStorage2(new MockPeerStorage());
storage.addPeerAnnounce(infoHash1, "192.168.0.1", 6881);
storage.addPeerAnnounce(infoHash1, peerStorage1);
storage.addPeerAnnounce(infoHash2, peerStorage2);
storage.removeLocalPeerAnnounce(bittorrent::getInfoHash(ctx2));
CPPUNIT_ASSERT(!storage.contains(infoHash2));
storage.removeLocalPeerAnnounce(bittorrent::getInfoHash(ctx1));
CPPUNIT_ASSERT(storage.contains(infoHash1));
}
} // namespace aria2 } // namespace aria2