diff options
Diffstat (limited to 'src/DHTBucket.cc')
| -rw-r--r-- | src/DHTBucket.cc | 123 |
1 files changed, 60 insertions, 63 deletions
diff --git a/src/DHTBucket.cc b/src/DHTBucket.cc index 808b63b2..9650dcf3 100644 --- a/src/DHTBucket.cc +++ b/src/DHTBucket.cc @@ -51,22 +51,19 @@ namespace aria2 { -DHTBucket::DHTBucket -(size_t prefixLength, - const unsigned char* max, const unsigned char* min, - const std::shared_ptr<DHTNode>& localNode) - : prefixLength_(prefixLength), - localNode_(localNode), - lastUpdated_(global::wallclock()) +DHTBucket::DHTBucket(size_t prefixLength, const unsigned char* max, + const unsigned char* min, + const std::shared_ptr<DHTNode>& localNode) + : prefixLength_(prefixLength), + localNode_(localNode), + lastUpdated_(global::wallclock()) { memcpy(max_, max, DHT_ID_LENGTH); memcpy(min_, min, DHT_ID_LENGTH); } DHTBucket::DHTBucket(const std::shared_ptr<DHTNode>& localNode) - : prefixLength_(0), - localNode_(localNode), - lastUpdated_(global::wallclock()) + : prefixLength_(0), localNode_(localNode), lastUpdated_(global::wallclock()) { memset(max_, 0xffu, DHT_ID_LENGTH); memset(min_, 0, DHT_ID_LENGTH); @@ -76,12 +73,13 @@ DHTBucket::~DHTBucket() {} void DHTBucket::getRandomNodeID(unsigned char* nodeID) const { - if(prefixLength_ == 0) { + if (prefixLength_ == 0) { util::generateRandomKey(nodeID); - } else { - size_t lastByteIndex = (prefixLength_-1)/8; + } + else { + size_t lastByteIndex = (prefixLength_ - 1) / 8; util::generateRandomKey(nodeID); - memcpy(nodeID, min_, lastByteIndex+1); + memcpy(nodeID, min_, lastByteIndex + 1); } } @@ -96,36 +94,36 @@ bool DHTBucket::isInRange(const unsigned char* nodeID) const } // Returns true if nodeID is in [min, max] (inclusive). -bool DHTBucket::isInRange(const unsigned char* nodeID, - const unsigned char* max, +bool DHTBucket::isInRange(const unsigned char* nodeID, const unsigned char* max, const unsigned char* min) const { - return - !std::lexicographical_compare(&nodeID[0], &nodeID[DHT_ID_LENGTH], - &min[0], &min[DHT_ID_LENGTH]) && - !std::lexicographical_compare(&max[0], &max[DHT_ID_LENGTH], - &nodeID[0], &nodeID[DHT_ID_LENGTH]); + return !std::lexicographical_compare(&nodeID[0], &nodeID[DHT_ID_LENGTH], + &min[0], &min[DHT_ID_LENGTH]) && + !std::lexicographical_compare(&max[0], &max[DHT_ID_LENGTH], &nodeID[0], + &nodeID[DHT_ID_LENGTH]); } bool DHTBucket::addNode(const std::shared_ptr<DHTNode>& node) { notifyUpdate(); - auto itr = - std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr == nodes_.end()) { - if(nodes_.size() < K) { + auto itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); + if (itr == nodes_.end()) { + if (nodes_.size() < K) { nodes_.push_back(node); return true; - } else { - if(nodes_.front()->isBad()) { + } + else { + if (nodes_.front()->isBad()) { nodes_.erase(nodes_.begin()); nodes_.push_back(node); return true; - } else { + } + else { return false; } } - } else { + } + else { nodes_.erase(itr); nodes_.push_back(node); return true; @@ -136,17 +134,16 @@ void DHTBucket::cacheNode(const std::shared_ptr<DHTNode>& node) { // cachedNodes_ are sorted by last time seen cachedNodes_.push_front(node); - if(cachedNodes_.size() > CACHE_SIZE) { + if (cachedNodes_.size() > CACHE_SIZE) { cachedNodes_.resize(CACHE_SIZE, std::shared_ptr<DHTNode>()); } } void DHTBucket::dropNode(const std::shared_ptr<DHTNode>& node) { - if(!cachedNodes_.empty()) { - auto itr = - std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr != nodes_.end()) { + if (!cachedNodes_.empty()) { + auto itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); + if (itr != nodes_.end()) { nodes_.erase(itr); nodes_.push_back(cachedNodes_.front()); cachedNodes_.erase(cachedNodes_.begin()); @@ -156,9 +153,8 @@ void DHTBucket::dropNode(const std::shared_ptr<DHTNode>& node) void DHTBucket::moveToHead(const std::shared_ptr<DHTNode>& node) { - auto itr = - std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr != nodes_.end()) { + auto itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); + if (itr != nodes_.end()) { nodes_.erase(itr); nodes_.push_front(node); } @@ -166,9 +162,8 @@ void DHTBucket::moveToHead(const std::shared_ptr<DHTNode>& node) void DHTBucket::moveToTail(const std::shared_ptr<DHTNode>& node) { - auto itr = - std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr != nodes_.end()) { + auto itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); + if (itr != nodes_.end()) { nodes_.erase(itr); nodes_.push_back(node); } @@ -176,7 +171,7 @@ void DHTBucket::moveToTail(const std::shared_ptr<DHTNode>& node) bool DHTBucket::splitAllowed() const { - return prefixLength_ < DHT_ID_LENGTH*8-1 && isInRange(localNode_); + return prefixLength_ < DHT_ID_LENGTH * 8 - 1 && isInRange(localNode_); } std::unique_ptr<DHTBucket> DHTBucket::split() @@ -195,10 +190,11 @@ std::unique_ptr<DHTBucket> DHTBucket::split() auto rBucket = make_unique<DHTBucket>(prefixLength_, rMax, rMin, localNode_); std::deque<std::shared_ptr<DHTNode>> lNodes; - for(auto & elem : nodes_) { - if(rBucket->isInRange(elem)) { + for (auto& elem : nodes_) { + if (rBucket->isInRange(elem)) { assert(rBucket->addNode(elem)); - } else { + } + else { lNodes.push_back(elem); } } @@ -215,8 +211,8 @@ std::unique_ptr<DHTBucket> DHTBucket::split() return rBucket; } -void DHTBucket::getGoodNodes -(std::vector<std::shared_ptr<DHTNode> >& goodNodes) const +void DHTBucket::getGoodNodes( + std::vector<std::shared_ptr<DHTNode>>& goodNodes) const { goodNodes.insert(goodNodes.end(), nodes_.begin(), nodes_.end()); goodNodes.erase(std::remove_if(goodNodes.begin(), goodNodes.end(), @@ -224,17 +220,19 @@ void DHTBucket::getGoodNodes goodNodes.end()); } -std::shared_ptr<DHTNode> DHTBucket::getNode(const unsigned char* nodeID, const std::string& ipaddr, uint16_t port) const +std::shared_ptr<DHTNode> DHTBucket::getNode(const unsigned char* nodeID, + const std::string& ipaddr, + uint16_t port) const { auto node = std::make_shared<DHTNode>(nodeID); node->setIPAddress(ipaddr); node->setPort(port); - auto itr = - std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr == nodes_.end() || - (*itr)->getIPAddress() != ipaddr || (*itr)->getPort() != port) { + auto itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); + if (itr == nodes_.end() || (*itr)->getIPAddress() != ipaddr || + (*itr)->getPort() != port) { return nullptr; - } else { + } + else { return *itr; } } @@ -242,19 +240,17 @@ std::shared_ptr<DHTNode> DHTBucket::getNode(const unsigned char* nodeID, const s bool DHTBucket::operator==(const DHTBucket& bucket) const { return memcmp(max_, bucket.max_, DHT_ID_LENGTH) == 0 && - memcmp(min_, bucket.min_, DHT_ID_LENGTH) == 0; + memcmp(min_, bucket.min_, DHT_ID_LENGTH) == 0; } bool DHTBucket::needsRefresh() const { return nodes_.size() < K || - lastUpdated_.difference(global::wallclock()) >= DHT_BUCKET_REFRESH_INTERVAL; + lastUpdated_.difference(global::wallclock()) >= + DHT_BUCKET_REFRESH_INTERVAL; } -void DHTBucket::notifyUpdate() -{ - lastUpdated_ = global::wallclock(); -} +void DHTBucket::notifyUpdate() { lastUpdated_ = global::wallclock(); } namespace { class FindQuestionableNode { @@ -268,16 +264,17 @@ public: bool DHTBucket::containsQuestionableNode() const { - return std::find_if(nodes_.begin(), nodes_.end(), FindQuestionableNode()) != nodes_.end(); + return std::find_if(nodes_.begin(), nodes_.end(), FindQuestionableNode()) != + nodes_.end(); } std::shared_ptr<DHTNode> DHTBucket::getLRUQuestionableNode() const { - auto i = - std::find_if(nodes_.begin(), nodes_.end(), FindQuestionableNode()); - if(i == nodes_.end()) { + auto i = std::find_if(nodes_.begin(), nodes_.end(), FindQuestionableNode()); + if (i == nodes_.end()) { return nullptr; - } else { + } + else { return *i; } } |
