From 9dc6004329e2a93e294ce4335d49f8ac4c1e5445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Wed, 19 Oct 2016 13:58:18 -0400 Subject: [PATCH] network engine: cancel request when clearing listen status --- src/dht.cpp | 14 +++++++++++--- src/network_engine.cpp | 7 +++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/dht.cpp b/src/dht.cpp index 9b1092f0..5c1eab8b 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -1890,8 +1890,13 @@ Dht::cancelListen(const InfoHash& id, size_t token) for (auto& ls : sn.listenStatus) network_engine.cancelRequest(ls.second); sn.listenStatus.clear(); - } else if (query) - sn.listenStatus.erase(query); + } else if (query) { + auto it = sn.listenStatus.find(query); + if (it != sn.listenStatus.end()) { + network_engine.cancelRequest(it->second); + sn.listenStatus.erase(it); + } + } } s->listeners.erase(af_token); } @@ -2350,8 +2355,11 @@ Dht::connectivityChanged(sa_family_t af) network_engine.connectivityChanged(af); auto& searches = (af == AF_INET) ? searches4 : searches6; for (auto& sp : searches) - for (auto& sn : sp.second->nodes) + for (auto& sn : sp.second->nodes) { + for (auto& ls : sn.listenStatus) + network_engine.cancelRequest(ls.second); sn.listenStatus.clear(); + } reported_addr.erase(std::remove_if(reported_addr.begin(), reported_addr.end(), [&](const ReportedAddr& addr){ return addr.second.getFamily() == af; }), reported_addr.end()); diff --git a/src/network_engine.cpp b/src/network_engine.cpp index 18ce38c0..f042b45d 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -250,9 +250,12 @@ NetworkEngine::sendRequest(std::shared_ptr<Request>& request) { request->start = scheduler.time(); auto e = requests.emplace(request->tid, request); - if (!e.second) { + if (not e.second) { + // Should not happen ! + // Try to handle this scenario as well as we can + e.first->second->setExpired(); + e.first->second = request; DHT_LOG_ERR("Request already existed (tid: %d)!", request->tid); - return; } request->node->requested(request); requestStep(request); -- GitLab