diff --git a/include/opendht/dht.h b/include/opendht/dht.h index c6c5a08d4f0f08bcb7ed5f7eb7257baaea4c7760..5cb75adfffc7900575551c76102c937da6912a57 100644 --- a/include/opendht/dht.h +++ b/include/opendht/dht.h @@ -560,6 +560,9 @@ private: listenStatus.request_time + Node::MAX_RESPONSE_TIME ); } + bool isBad(const time_point& now) const { + return !node || node->isExpired(now) || candidate; + } std::shared_ptr<Node> node {}; diff --git a/src/dht.cpp b/src/dht.cpp index 991cbbb4b8829341ebd6c1db8f6f52bd4e7bf8d8..7550046d6632ad65fffdfb95da213bb27869bb50 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -857,14 +857,15 @@ Dht::Search::insertNode(std::shared_ptr<Node> node, time_point now, const Blob& }*//* else { std::cout << "Adding real node " << node->id << " to IPv" << (af==AF_INET?'4':'6') << " synced search " << id << std::endl; }*/ - if (nodes.size()-num_bad_nodes > SEARCH_NODES) { - removeExpiredNode(now); + while (nodes.size()-num_bad_nodes > SEARCH_NODES) { + if (removeExpiredNode(now)) + num_bad_nodes--; - auto farthest_not_expired_node = std::find_if(nodes.rbegin(), nodes.rend(), - [=](const SearchNode& n) { return n.node->isGood(now) or n.candidate; } + auto farthest_not_bad_node = std::find_if(nodes.rbegin(), nodes.rend(), + [&](const SearchNode& n) { return not n.isBad(now); } ); - if (farthest_not_expired_node != nodes.rend()) { - nodes.erase(std::prev(farthest_not_expired_node.base())); + if (farthest_not_bad_node != nodes.rend()) { + nodes.erase(std::prev(farthest_not_bad_node.base())); } // else, all nodes are expired. } expired = false; @@ -1160,7 +1161,7 @@ Dht::Search::isSynced(time_point now) const unsigned Dht::Search::getNumberOfBadNodes(time_point now) { return std::count_if(nodes.begin(), nodes.end(), [=](const SearchNode& sn) { - return sn.candidate or sn.node->isExpired(now); + return sn.isBad(now); }); } @@ -1350,6 +1351,7 @@ Dht::bootstrapSearch(Dht::Search& sr) } if (sr.nodes.size() < SEARCH_NODES) sr.insertBucket(*list.findBucket(myid), now); + sr.refill_time = now; } unsigned