From 6d78a7656d1f726fafeede2536584c40e4379cb5 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 11 May 2008 08:07:57 +0000 Subject: [PATCH] 2008-05-11 Tatsuhiro Tsujikawa Changed method signature: BNode::findClosestKNodes, BNode:: enumerateBucket, DHTBucket::getGoodNodes, DHTRoutingTable::getClosestKNodes, DHTRoutingTable::getBuckets * src/BNode.cc * src/BNode.h * src/DHTAbstractNodeLookupTask.cc * src/DHTAutoSaveCommand.cc * src/DHTBucket.cc * src/DHTBucket.h * src/DHTBucketRefreshTask.cc * src/DHTFindNodeMessage.cc * src/DHTGetPeersMessage.cc * src/DHTRoutingTable.cc * src/DHTRoutingTable.h * test/BNodeTest.cc * test/DHTBucketTest.cc * test/DHTRoutingTableTest.cc --- ChangeLog | 21 +++++++++++++++++++++ src/BNode.cc | 24 ++++++++++++------------ src/BNode.h | 6 ++++-- src/DHTAbstractNodeLookupTask.cc | 4 +++- src/DHTAutoSaveCommand.cc | 6 ++++-- src/DHTBucket.cc | 5 ++--- src/DHTBucket.h | 2 +- src/DHTBucketRefreshTask.cc | 3 ++- src/DHTFindNodeMessage.cc | 3 ++- src/DHTGetPeersMessage.cc | 3 ++- src/DHTRoutingTable.cc | 9 +++++---- src/DHTRoutingTable.h | 5 +++-- test/BNodeTest.cc | 15 ++++++++++----- test/DHTBucketTest.cc | 3 ++- test/DHTRoutingTableTest.cc | 3 ++- 15 files changed, 75 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6e8dde6..29e6f6cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2008-05-11 Tatsuhiro Tsujikawa + + Changed method signature: + BNode::findClosestKNodes, BNode:: enumerateBucket, + DHTBucket::getGoodNodes, + DHTRoutingTable::getClosestKNodes, DHTRoutingTable::getBuckets + * src/BNode.cc + * src/BNode.h + * src/DHTAbstractNodeLookupTask.cc + * src/DHTAutoSaveCommand.cc + * src/DHTBucket.cc + * src/DHTBucket.h + * src/DHTBucketRefreshTask.cc + * src/DHTFindNodeMessage.cc + * src/DHTGetPeersMessage.cc + * src/DHTRoutingTable.cc + * src/DHTRoutingTable.h + * test/BNodeTest.cc + * test/DHTBucketTest.cc + * test/DHTRoutingTableTest.cc + 2008-05-11 Tatsuhiro Tsujikawa In piece selection functions, Pass std::deque<...> by reference rather diff --git a/src/BNode.cc b/src/BNode.cc index ef8db8d3..018d7574 100644 --- a/src/BNode.cc +++ b/src/BNode.cc @@ -134,27 +134,26 @@ SharedHandle BNode::findBucketFor(BNode* b, const unsigned char* key) } -std::deque > BNode::findClosestKNodes(BNode* b, const unsigned char* key) +void BNode::findClosestKNodes(std::deque >& nodes, + BNode* b, const unsigned char* key) { BNode* bnode = findBNodeFor(b, key); - std::deque > nodes; if(!bnode) { - return nodes; + return; } { SharedHandle bucket = bnode->getBucket(); - std::deque > goodNodes = bucket->getGoodNodes(); - nodes.insert(nodes.end(), goodNodes.begin(), goodNodes.end()); + bucket->getGoodNodes(nodes); } if(nodes.size() >= DHTBucket::K) { - return nodes; + return; } std::deque visited; visited.push_back(bnode); BNode* up = bnode->getUp(); if(!up) { - return nodes; + return; } bool leftFirst = false; if(up->getLeft() == bnode) { @@ -184,7 +183,8 @@ std::deque > BNode::findClosestKNodes(BNode* b, const unsi { SharedHandle bucket = bnode->getBucket(); if(!bucket.isNull()) { - std::deque > goodNodes = bucket->getGoodNodes(); + std::deque > goodNodes; + bucket->getGoodNodes(goodNodes); size_t r = DHTBucket::K-nodes.size(); if(goodNodes.size() <= r) { nodes.insert(nodes.end(), goodNodes.begin(), goodNodes.end()); @@ -194,12 +194,12 @@ std::deque > BNode::findClosestKNodes(BNode* b, const unsi } } } - return nodes; + return; } -std::deque > BNode::enumerateBucket(const BNode* b) +void BNode::enumerateBucket(std::deque >& buckets, + const BNode* b) { - std::deque > buckets; std::deque visited; visited.push_back(b); while(1) { @@ -219,7 +219,7 @@ std::deque > BNode::enumerateBucket(const BNode* b) b = b->getUp(); } } - return buckets; + return; } } // namespace aria2 diff --git a/src/BNode.h b/src/BNode.h index 37d00dea..c8b692df 100644 --- a/src/BNode.h +++ b/src/BNode.h @@ -81,9 +81,11 @@ public: static SharedHandle findBucketFor(BNode* b, const unsigned char* key); - static std::deque > findClosestKNodes(BNode* b, const unsigned char* key); + static void findClosestKNodes(std::deque >& nodes, + BNode* b, const unsigned char* key); - static std::deque > enumerateBucket(const BNode* b); + static void enumerateBucket(std::deque >& buckets, + const BNode* b); }; } // namespace aria2 diff --git a/src/DHTAbstractNodeLookupTask.cc b/src/DHTAbstractNodeLookupTask.cc index 8b372aca..b0025420 100644 --- a/src/DHTAbstractNodeLookupTask.cc +++ b/src/DHTAbstractNodeLookupTask.cc @@ -132,7 +132,9 @@ void DHTAbstractNodeLookupTask::updateBucket() void DHTAbstractNodeLookupTask::startup() { - _entries = toEntries(_routingTable->getClosestKNodes(_targetID)); + std::deque > nodes; + _routingTable->getClosestKNodes(nodes, _targetID); + _entries = toEntries(nodes); if(_entries.empty()) { _finished = true; } else { diff --git a/src/DHTAutoSaveCommand.cc b/src/DHTAutoSaveCommand.cc index 72ae4cbc..3d1ec6f0 100644 --- a/src/DHTAutoSaveCommand.cc +++ b/src/DHTAutoSaveCommand.cc @@ -92,11 +92,13 @@ void DHTAutoSaveCommand::save() } } std::deque > nodes; - std::deque > buckets = _routingTable->getBuckets(); + std::deque > buckets; + _routingTable->getBuckets(buckets); for(std::deque >::const_iterator i = buckets.begin(); i != buckets.end(); ++i) { const SharedHandle& bucket = *i; - std::deque > goodNodes = bucket->getGoodNodes(); + std::deque > goodNodes; + bucket->getGoodNodes(goodNodes); nodes.insert(nodes.end(), goodNodes.begin(), goodNodes.end()); } diff --git a/src/DHTBucket.cc b/src/DHTBucket.cc index f9aee519..ee613799 100644 --- a/src/DHTBucket.cc +++ b/src/DHTBucket.cc @@ -218,12 +218,11 @@ const std::deque >& DHTBucket::getNodes() const return _nodes; } -std::deque > DHTBucket::getGoodNodes() const +void DHTBucket::getGoodNodes(std::deque >& goodNodes) const { - std::deque > goodNodes = _nodes; + goodNodes = _nodes; goodNodes.erase(std::remove_if(goodNodes.begin(), goodNodes.end(), mem_fun_sh(&DHTNode::isBad)), goodNodes.end()); - return goodNodes; } SharedHandle DHTBucket::getNode(const unsigned char* nodeID, const std::string& ipaddr, uint16_t port) const diff --git a/src/DHTBucket.h b/src/DHTBucket.h index c1b2252c..22782b5e 100644 --- a/src/DHTBucket.h +++ b/src/DHTBucket.h @@ -114,7 +114,7 @@ public: const std::deque >& getNodes() const; - std::deque > getGoodNodes() const; + void getGoodNodes(std::deque >& nodes) const; void dropNode(const SharedHandle& node); diff --git a/src/DHTBucketRefreshTask.cc b/src/DHTBucketRefreshTask.cc index add732c3..fdd3281e 100644 --- a/src/DHTBucketRefreshTask.cc +++ b/src/DHTBucketRefreshTask.cc @@ -51,7 +51,8 @@ DHTBucketRefreshTask::~DHTBucketRefreshTask() {} void DHTBucketRefreshTask::startup() { - std::deque > buckets = _routingTable->getBuckets(); + std::deque > buckets; + _routingTable->getBuckets(buckets); for(std::deque >::iterator i = buckets.begin(); i != buckets.end(); ++i) { if(_forceRefresh || (*i)->needsRefresh()) { (*i)->notifyUpdate(); diff --git a/src/DHTFindNodeMessage.cc b/src/DHTFindNodeMessage.cc index 648826e0..951c14e3 100644 --- a/src/DHTFindNodeMessage.cc +++ b/src/DHTFindNodeMessage.cc @@ -58,7 +58,8 @@ DHTFindNodeMessage::~DHTFindNodeMessage() {} void DHTFindNodeMessage::doReceivedAction() { - std::deque > nodes = _routingTable->getClosestKNodes(_targetNodeID); + std::deque > nodes; + _routingTable->getClosestKNodes(nodes, _targetNodeID); SharedHandle reply = _factory->createFindNodeReplyMessage(_remoteNode, nodes, _transactionID); _dispatcher->addMessageToQueue(reply); diff --git a/src/DHTGetPeersMessage.cc b/src/DHTGetPeersMessage.cc index 52122f02..083a6bf0 100644 --- a/src/DHTGetPeersMessage.cc +++ b/src/DHTGetPeersMessage.cc @@ -69,7 +69,8 @@ void DHTGetPeersMessage::doReceivedAction() Peers peers = _peerAnnounceStorage->getPeers(_infoHash); SharedHandle reply; if(peers.empty()) { - std::deque > nodes = _routingTable->getClosestKNodes(_infoHash); + std::deque > nodes; + _routingTable->getClosestKNodes(nodes, _infoHash); reply = _factory->createGetPeersReplyMessage(_remoteNode, nodes, token, _transactionID); diff --git a/src/DHTRoutingTable.cc b/src/DHTRoutingTable.cc index 1e54c319..a74a1c1f 100644 --- a/src/DHTRoutingTable.cc +++ b/src/DHTRoutingTable.cc @@ -108,9 +108,10 @@ bool DHTRoutingTable::addNode(const SharedHandle& node, bool good) return false; } -std::deque > DHTRoutingTable::getClosestKNodes(const unsigned char* key) const +void DHTRoutingTable::getClosestKNodes(std::deque >& nodes, + const unsigned char* key) const { - return BNode::findClosestKNodes(_root, key); + BNode::findClosestKNodes(nodes, _root, key); } size_t DHTRoutingTable::countBucket() const @@ -158,9 +159,9 @@ void DHTRoutingTable::moveBucketTail(const SharedHandle& node) getBucketFor(node)->moveToTail(node); } -std::deque > DHTRoutingTable::getBuckets() const +void DHTRoutingTable::getBuckets(std::deque >& buckets) const { - return BNode::enumerateBucket(_root); + BNode::enumerateBucket(buckets, _root); } void DHTRoutingTable::setTaskQueue(const SharedHandle& taskQueue) diff --git a/src/DHTRoutingTable.h b/src/DHTRoutingTable.h index 21721f98..b8a9b6a3 100644 --- a/src/DHTRoutingTable.h +++ b/src/DHTRoutingTable.h @@ -73,7 +73,8 @@ public: bool addGoodNode(const SharedHandle& node); - std::deque > getClosestKNodes(const unsigned char* key) const; + void getClosestKNodes(std::deque >& nodes, + const unsigned char* key) const; size_t countBucket() const; @@ -91,7 +92,7 @@ public: SharedHandle getNode(const unsigned char* id, const std::string& ipaddr, uint16_t port) const; - std::deque > getBuckets() const; + void getBuckets(std::deque >& buckets) const; void setTaskQueue(const SharedHandle& taskQueue); diff --git a/test/BNodeTest.cc b/test/BNodeTest.cc index 9b353517..7f2b4e9b 100644 --- a/test/BNodeTest.cc +++ b/test/BNodeTest.cc @@ -155,7 +155,8 @@ void BNodeTest::testFindClosestKNodes() { unsigned char targetID[DHT_ID_LENGTH]; memset(targetID, 0x80, DHT_ID_LENGTH); - std::deque > nodes = BNode::findClosestKNodes(bp4, targetID); + std::deque > nodes; + BNode::findClosestKNodes(nodes, bp4, targetID); CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size()); CPPUNIT_ASSERT(bucket4->isInRange(nodes[0])); CPPUNIT_ASSERT(bucket4->isInRange(nodes[1])); @@ -169,7 +170,8 @@ void BNodeTest::testFindClosestKNodes() { unsigned char targetID[DHT_ID_LENGTH]; memset(targetID, 0xf0, DHT_ID_LENGTH); - std::deque > nodes = BNode::findClosestKNodes(bp4, targetID); + std::deque > nodes; + BNode::findClosestKNodes(nodes, bp4, targetID); CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size()); CPPUNIT_ASSERT(bucket1->isInRange(nodes[0])); CPPUNIT_ASSERT(bucket1->isInRange(nodes[1])); @@ -187,7 +189,8 @@ void BNodeTest::testFindClosestKNodes() } unsigned char targetID[DHT_ID_LENGTH]; memset(targetID, 0x80, DHT_ID_LENGTH); - std::deque > nodes = BNode::findClosestKNodes(bp4, targetID); + std::deque > nodes; + BNode::findClosestKNodes(nodes, bp4, targetID); CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size()); for(size_t i = 0; i < DHTBucket::K; ++i) { CPPUNIT_ASSERT(bucket4->isInRange(nodes[i])); @@ -213,7 +216,8 @@ void BNodeTest::testEnumerateBucket() { BNode b(bucket1); - std::deque > buckets = BNode::enumerateBucket(&b); + std::deque > buckets; + BNode::enumerateBucket(buckets, &b); CPPUNIT_ASSERT_EQUAL((size_t)1, buckets.size()); CPPUNIT_ASSERT(bucket1 == buckets[0]); } @@ -240,7 +244,8 @@ void BNodeTest::testEnumerateBucket() bp4->setLeft(bp3); bp4->setRight(b2); - std::deque > buckets = BNode::enumerateBucket(bp4); + std::deque > buckets; + BNode::enumerateBucket(buckets, bp4); CPPUNIT_ASSERT_EQUAL((size_t)5, buckets.size()); CPPUNIT_ASSERT(bucket1 == buckets[0]); CPPUNIT_ASSERT(bucket3 == buckets[1]); diff --git a/test/DHTBucketTest.cc b/test/DHTBucketTest.cc index 17907757..56d75581 100644 --- a/test/DHTBucketTest.cc +++ b/test/DHTBucketTest.cc @@ -333,7 +333,8 @@ void DHTBucketTest::testGetGoodNodes() } nodes[3]->markBad(); nodes[5]->markBad(); - std::deque > goodNodes = bucket.getGoodNodes(); + std::deque > goodNodes; + bucket.getGoodNodes(goodNodes); CPPUNIT_ASSERT_EQUAL((size_t)6, goodNodes.size()); CPPUNIT_ASSERT_EQUAL((uint16_t)6881, goodNodes[0]->getPort()); CPPUNIT_ASSERT_EQUAL((uint16_t)6882, goodNodes[1]->getPort()); diff --git a/test/DHTRoutingTableTest.cc b/test/DHTRoutingTableTest.cc index 0b2e6cd4..717e849d 100644 --- a/test/DHTRoutingTableTest.cc +++ b/test/DHTRoutingTableTest.cc @@ -82,7 +82,8 @@ void DHTRoutingTableTest::testGetClosestKNodes() } { createID(id, 0x80, 0x10); - std::deque > nodes = table.getClosestKNodes(id); + std::deque > nodes; + table.getClosestKNodes(nodes, id); CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size()); for(size_t i = 0; i < nodes.size(); ++i) { CPPUNIT_ASSERT(memcmp(nodes2[0]->getID(), nodes[0]->getID(), DHT_ID_LENGTH) == 0);