diff --git a/src/dht.cpp b/src/dht.cpp index a7ccfdc4e4da2cbf4eef147af128761ea088e150..214419703f1726f7a2447d9b81e3c5f489f4edae 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -216,7 +216,6 @@ struct Dht::Get { time_point start; Value::Filter filter; std::shared_ptr<Query> query; - std::set<std::shared_ptr<Query>> pagination_queries; QueryCallback query_cb; GetCallback get_cb; DoneCallback done_cb; @@ -1365,14 +1364,22 @@ Dht::searchStep(std::shared_ptr<Search> sr) if (not (sr->callbacks.empty() and sr->announce.empty())) { // search is synced but some (newer) get operations are not complete // Call callbacks when done + std::vector<Get> completed_gets; for (auto b = sr->callbacks.begin(); b != sr->callbacks.end();) { if (sr->isDone(b->second)) { sr->setDone(b->second); + completed_gets.emplace_back(std::move(b->second)); b = sr->callbacks.erase(b); } else ++b; } + // clear corresponding queries + for (const auto& get : completed_gets) + for (auto& sn : sr->nodes) { + sn.getStatus.erase(get.query); + sn.pagination_queries.erase(get.query); + } /* clearing callbacks for announced values */ sr->checkAnnounced(now); @@ -1725,7 +1732,7 @@ Dht::search(const InfoHash& id, sa_family_t af, GetCallback gcb, QueryCallback q auto now = scheduler.time(); sr->callbacks.insert(std::make_pair<time_point, Get>( std::move(now), - Get { scheduler.time(), f, std::make_shared<Query>(q), {}, + Get { scheduler.time(), f, std::make_shared<Query>(q), qcb ? qcb : QueryCallback {}, gcb ? gcb : GetCallback {}, dcb } ));