diff --git a/src/dht.cpp b/src/dht.cpp index 9b1092f0bbaf9a4a6a50c656fc2b633074a9962c..5c1eab8b3a2ee5c254ad728cd3ee81491512de8d 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 18ce38c0f6060c153cf03213942dbe0c2d4829b5..f042b45d486188842497f5713cb39c21ff0862ef 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);