From 7af856508e4c4194674bda27510424baf9ec2689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sat, 15 Oct 2016 19:10:31 -0400 Subject: [PATCH] dht: make connectivityChanged family dependent --- include/opendht/dht.h | 7 ++++++- include/opendht/network_engine.h | 2 +- src/dht.cpp | 29 ++++++++++++++--------------- src/network_engine.cpp | 6 +++--- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/include/opendht/dht.h b/include/opendht/dht.h index 600e5c24..fe3e3ef9 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 daa48e3f..a24e7ff7 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 25ff7bfd..6b719650 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 60fa56ea..abfa0569 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 -- GitLab