From 669c08210e0847db5c7b24f450c4160a550fd9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20D=C3=A9saulniers?= Date: Mon, 22 Aug 2016 18:17:53 -0400 Subject: [PATCH] dht: erase find node request status when done This was memory leak and produced inconsistency in SearchNode::canGet timings. --- src/dht.cpp | 10 +++++++++- src/network_engine.cpp | 5 ++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/dht.cpp b/src/dht.cpp index 2ae8eb0d..d300639e 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -957,7 +957,15 @@ Dht::searchSendGetValues(std::shared_ptr sr, SearchNode* pn, bool update n->getStatus[query] = network_engine.sendFindNode(n->node, sr->id, -1, - std::bind(&Dht::searchNodeGetDone, this, _1, _2, ws, query), + [this,ws,query](const Request& status, NetworkEngine::RequestAnswer&& answer) { + if (auto sr = ws.lock()) { + if (auto sn = sr->getNode(status.node)) { + sn->getStatus.erase(query); + } + } + searchNodeGetDone(status, std::forward(answer), ws, query); + }, + /* std::bind(&Dht::searchNodeGetDone, this, _1, _2, ws, query), */ std::bind(&Dht::searchNodeGetExpired, this, _1, _2, ws, query)); } else { if (query and not query->select.getSelection().empty()) { diff --git a/src/network_engine.cpp b/src/network_engine.cpp index 674c78f6..f973b985 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -182,9 +182,8 @@ NetworkEngine::sendRequest(std::shared_ptr& request) { request->start = scheduler.time(); auto e = requests.emplace(request->tid, request); - if (!e.second) { - DHT_LOG.ERR("Request already existed !"); - } + if (!e.second) + DHT_LOG.ERR("Request already existed (tid: %d)!", request->tid); request->node->requested(request); requestStep(request); }