diff --git a/include/opendht/dht.h b/include/opendht/dht.h index 600e5c246c4d397159311338831857da3b7cce20..fe3e3ef9035da10983018d0719e45b4c46ae8266 100644 --- a/include/opendht/dht.h +++ b/include/opendht/dht.h @@ -245,7 +245,12 @@ public: * This will cause the DHT to assume a public IP address change. * The DHT will recontact neighbor nodes, re-register for listen ops etc. */ - void connectivityChanged(); + void connectivityChanged(sa_family_t); + void connectivityChanged() { + reported_addr.clear(); + connectivityChanged(AF_INET); + connectivityChanged(AF_INET6); + } /** * Get the list of good nodes for local storage saving purposes diff --git a/include/opendht/network_engine.h b/include/opendht/network_engine.h index daa48e3f0d495be89ab68ec9a54ffad20d406078..a24e7ff7033f636c15fd1d15ec44257ac2cecc38 100644 --- a/include/opendht/network_engine.h +++ b/include/opendht/network_engine.h @@ -169,7 +169,7 @@ public: */ void cancelRequest(std::shared_ptr<Request>& req); - void connectivityChanged(); + void connectivityChanged(sa_family_t); private: diff --git a/src/dht.cpp b/src/dht.cpp index 25ff7bfdd1b9a0bb5cff235ffb0907cbecf8e01c..6b719650951580ad7fd61e8a0f26f39f6ce1eee1 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -1412,7 +1412,7 @@ Dht::searchStep(std::shared_ptr<Search> sr) { DHT_LOG.WARN("[search %s IPv%c] expired", sr->id.toString().c_str(), sr->af == AF_INET ? '4' : '6'); sr->expire(); - connectivityChanged(); + connectivityChanged(sr->af); } /* dumpSearch(*sr, std::cout); */ @@ -2321,21 +2321,20 @@ Dht::Storage::expire(const std::map<ValueType::Id, ValueType>& types, time_point } void -Dht::connectivityChanged() +Dht::connectivityChanged(sa_family_t af) { const auto& now = scheduler.time(); scheduler.edit(nextNodesConfirmation, now); - mybucket_grow_time = now; - mybucket6_grow_time = now; - reported_addr.clear(); - network_engine.connectivityChanged(); - auto stop_listen = [&](std::map<InfoHash, std::shared_ptr<Search>> srs) { - for (auto& sp : srs) - for (auto& sn : sp.second->nodes) - sn.listenStatus.clear(); - }; - stop_listen(searches4); - stop_listen(searches6); + auto& bucket_grow_time = (af == AF_INET) ? mybucket_grow_time : mybucket6_grow_time; + bucket_grow_time = now; + reported_addr.erase(std::remove_if(reported_addr.begin(), reported_addr.end(), [&](const ReportedAddr& addr){ + return addr.second.getFamily() == af; + })); + network_engine.connectivityChanged(af); + auto& searches = (af == AF_INET) ? searches4 : searches6; + for (auto& sp : searches) + for (auto& sn : sp.second->nodes) + sn.listenStatus.clear(); } void @@ -2701,8 +2700,8 @@ Dht::neighbourhoodMaintenance(RoutingTable& list) auto n = q->randomNode(); if (n) { - DHT_LOG.DEBUG("[find %s IPv%c] sending find for neighborhood maintenance.", - id.toString().c_str(), q->af == AF_INET6 ? '6' : '4'); + DHT_LOG.DEBUG("[node %s] sending [find %s] for neighborhood maintenance.", + n->toString().c_str(), id.toString().c_str()); /* Since our node-id is the same in both DHTs, it's probably profitable to query both families. */ network_engine.sendFindNode(n, id, network_engine.want(), nullptr, nullptr); diff --git a/src/network_engine.cpp b/src/network_engine.cpp index 60fa56ea259fce23542adb0f4ac73f0e17e0b6e0..abfa056973e99d68b5af8a0356f165131d03248e 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -88,7 +88,7 @@ struct ParsedMessage { Blob nodes4_raw, nodes6_raw; std::vector<std::shared_ptr<Node>> nodes4, nodes6; /* values to store or retreive request */ - std::vector<std::shared_ptr<Value>> values; + std::vector<std::shared_ptr<Value>> values; /* index for fields values */ std::vector<std::shared_ptr<FieldValueIndex>> fields; /** When part of the message header: {index -> (total size, {})} @@ -199,9 +199,9 @@ NetworkEngine::clear() } void -NetworkEngine::connectivityChanged() +NetworkEngine::connectivityChanged(sa_family_t af) { - cache.clearBadNodes(); + cache.clearBadNodes(af); } void