summaryrefslogtreecommitdiff
path: root/src/DHTBucket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/DHTBucket.cc')
-rw-r--r--src/DHTBucket.cc123
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;
}
}