diff --git a/src/dht.cpp b/src/dht.cpp index 610db100b472e99b41155e75badaea347330d0cb..46ad883db6ec4af82a01cc58d78b654a4f610eb7 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -350,10 +350,10 @@ Dht::Search::insertNode(std::shared_ptr<Node> node, time_point now, const Blob& bool new_search_node = false; if (!found) { - if (nodes.size()-num_bad_nodes >= SEARCH_NODES) { - if (node->isExpired()) - return false; - if (n == nodes.end()) + // Be more restricitve if there are too many + // good or unknown nodes in this search, + if (nodes.size() - num_bad_nodes - current_get_requests >= SEARCH_NODES) { + if (node->isExpired() or n == nodes.end()) return false; } @@ -363,26 +363,19 @@ Dht::Search::insertNode(std::shared_ptr<Node> node, time_point now, const Blob& current_get_requests = 0; } - //bool synced = isSynced(now); n = nodes.insert(n, SearchNode(node)); node->time = now; new_search_node = true; - /*if (synced) { - n->candidate = true; - //std::cout << "Adding candidate node " << node->id << " to IPv" << (af==AF_INET?'4':'6') << " synced search " << id << std::endl; - }*//* else { - std::cout << "Adding real node " << node->id << " to IPv" << (af==AF_INET?'4':'6') << " synced search " << id << std::endl; - }*/ - while (nodes.size()-num_bad_nodes > SEARCH_NODES) { + + // trim good nodes + while (nodes.size()-num_bad_nodes-current_get_requests > SEARCH_NODES) { if (removeExpiredNode(now)) num_bad_nodes--; auto to_remove = std::find_if(nodes.rbegin(), nodes.rend(), - [&](const SearchNode& n) { return not n.isBad()/* and not (n.getStatus and n.getStatus->pending(now))*/; } + [&](const SearchNode& n) { return not (n.isBad() or (n.getStatus and n.getStatus->pending())); } ); if (to_remove != nodes.rend()) { - if (to_remove->getStatus and to_remove->getStatus->pending()) - current_get_requests--; nodes.erase(std::prev(to_remove.base())); } // else, all nodes are expired. } @@ -629,8 +622,8 @@ Dht::searchStep(std::shared_ptr<Search> sr) i++; } while (sent and sr->current_get_requests < SEARCH_REQUESTS); - DHT_LOG.DEBUG("[search %s IPv%c] step: sent %u requests.", - sr->id.toString().c_str(), sr->af == AF_INET ? '4' : '6', i); + DHT_LOG.DEBUG("[search %s IPv%c] step: sent %u requests (total %u).", + sr->id.toString().c_str(), sr->af == AF_INET ? '4' : '6', i, sr->current_get_requests); auto expiredn = (size_t)std::count_if(sr->nodes.begin(), sr->nodes.end(), [&](const SearchNode& sn) { return sn.candidate or sn.node->isExpired();