From 2f4722e90d7758409e26d61788a501b05a4b9887 Mon Sep 17 00:00:00 2001 From: gns333 Date: Fri, 25 Dec 2020 12:27:59 +0800 Subject: [PATCH 1/3] Add clear resolved cache --- .../network/protocol/http/policies/async_resolver.hpp | 11 +++++++++-- .../network/protocol/http/policies/sync_resolver.hpp | 10 +++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/boost/network/protocol/http/policies/async_resolver.hpp b/boost/network/protocol/http/policies/async_resolver.hpp index c03cd5a36..5ac1699de 100644 --- a/boost/network/protocol/http/policies/async_resolver.hpp +++ b/boost/network/protocol/http/policies/async_resolver.hpp @@ -36,18 +36,21 @@ struct async_resolver : std::enable_shared_from_this > { typedef std::function resolve_function; + void clear_resolved_cache() { clear_cache_ = true; } + protected: bool cache_resolved_; + bool clear_cache_; endpoint_cache endpoint_cache_; std::shared_ptr service_; std::shared_ptr resolver_strand_; explicit async_resolver(bool cache_resolved) - : cache_resolved_(cache_resolved), endpoint_cache_() {} + : cache_resolved_(cache_resolved), endpoint_cache_(), clear_cache_(false) {} void resolve(resolver_type &resolver_, string_type const &host, std::uint16_t port, resolve_completion_function once_resolved) { - if (cache_resolved_) { + if (cache_resolved_ && !clear_cache_) { typename endpoint_cache::iterator iter = endpoint_cache_.find(boost::to_lower_copy(host)); if (iter != endpoint_cache_.end()) { @@ -74,6 +77,10 @@ struct async_resolver : std::enable_shared_from_this > { typename endpoint_cache::iterator iter; bool inserted = false; if (!ec && cache_resolved_) { + if (clear_cache_) { + clear_cache_ = false; + endpoint_cache_.clear(); + } std::tie(iter, inserted) = endpoint_cache_.insert(std::make_pair( host, std::make_pair(endpoint_iterator, resolver_iterator()))); once_resolved(ec, iter->second); diff --git a/boost/network/protocol/http/policies/sync_resolver.hpp b/boost/network/protocol/http/policies/sync_resolver.hpp index 7c9c2c7f4..65911ebc3 100644 --- a/boost/network/protocol/http/policies/sync_resolver.hpp +++ b/boost/network/protocol/http/policies/sync_resolver.hpp @@ -27,19 +27,27 @@ struct sync_resolver { typedef std::pair resolver_iterator_pair; + void clear_resolved_cache() { clear_cache_ = true; } + protected: typedef typename string::type string_type; typedef std::unordered_map resolved_cache; resolved_cache endpoint_cache_; bool cache_resolved_; + bool clear_cache_; - explicit sync_resolver(bool cache_resolved) : cache_resolved_(cache_resolved) {} + explicit sync_resolver(bool cache_resolved) + : cache_resolved_(cache_resolved), clear_cache_(false) {} resolver_iterator_pair resolve(resolver_type& resolver_, string_type /*unused*/const& hostname, string_type const& port) { if (cache_resolved_) { + if (clear_cache_) { + clear_cache_ = false; + endpoint_cache_.clear(); + } typename resolved_cache::iterator cached_iterator = endpoint_cache_.find(hostname); if (cached_iterator == endpoint_cache_.end()) { From 3207f8238b93442aa6fe81e3e648227a1e030a21 Mon Sep 17 00:00:00 2001 From: gns333 Date: Fri, 25 Dec 2020 16:45:56 +0800 Subject: [PATCH 2/3] Add clear resolved cache --- boost/network/protocol/http/policies/async_resolver.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boost/network/protocol/http/policies/async_resolver.hpp b/boost/network/protocol/http/policies/async_resolver.hpp index 5ac1699de..c81fa322a 100644 --- a/boost/network/protocol/http/policies/async_resolver.hpp +++ b/boost/network/protocol/http/policies/async_resolver.hpp @@ -46,7 +46,7 @@ struct async_resolver : std::enable_shared_from_this > { std::shared_ptr resolver_strand_; explicit async_resolver(bool cache_resolved) - : cache_resolved_(cache_resolved), endpoint_cache_(), clear_cache_(false) {} + : cache_resolved_(cache_resolved), clear_cache_(false), endpoint_cache_() {} void resolve(resolver_type &resolver_, string_type const &host, std::uint16_t port, resolve_completion_function once_resolved) { From a32901b91cf4b03ca66d824c6ba808d31bebf7e6 Mon Sep 17 00:00:00 2001 From: gns333 Date: Mon, 25 Jan 2021 19:59:43 +0800 Subject: [PATCH 3/3] Add clear resolved cache --- boost/network/protocol/http/policies/async_resolver.hpp | 9 ++++----- boost/network/protocol/http/policies/sync_resolver.hpp | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/boost/network/protocol/http/policies/async_resolver.hpp b/boost/network/protocol/http/policies/async_resolver.hpp index c81fa322a..4e508364a 100644 --- a/boost/network/protocol/http/policies/async_resolver.hpp +++ b/boost/network/protocol/http/policies/async_resolver.hpp @@ -36,11 +36,11 @@ struct async_resolver : std::enable_shared_from_this > { typedef std::function resolve_function; - void clear_resolved_cache() { clear_cache_ = true; } + void clear_resolved_cache() { clear_cache_.store(true); } protected: bool cache_resolved_; - bool clear_cache_; + std::atomic clear_cache_; endpoint_cache endpoint_cache_; std::shared_ptr service_; std::shared_ptr resolver_strand_; @@ -50,7 +50,7 @@ struct async_resolver : std::enable_shared_from_this > { void resolve(resolver_type &resolver_, string_type const &host, std::uint16_t port, resolve_completion_function once_resolved) { - if (cache_resolved_ && !clear_cache_) { + if (cache_resolved_ && !clear_cache_.load()) { typename endpoint_cache::iterator iter = endpoint_cache_.find(boost::to_lower_copy(host)); if (iter != endpoint_cache_.end()) { @@ -77,8 +77,7 @@ struct async_resolver : std::enable_shared_from_this > { typename endpoint_cache::iterator iter; bool inserted = false; if (!ec && cache_resolved_) { - if (clear_cache_) { - clear_cache_ = false; + if (clear_cache_.exchange(false)) { endpoint_cache_.clear(); } std::tie(iter, inserted) = endpoint_cache_.insert(std::make_pair( diff --git a/boost/network/protocol/http/policies/sync_resolver.hpp b/boost/network/protocol/http/policies/sync_resolver.hpp index 65911ebc3..09d373b87 100644 --- a/boost/network/protocol/http/policies/sync_resolver.hpp +++ b/boost/network/protocol/http/policies/sync_resolver.hpp @@ -27,7 +27,7 @@ struct sync_resolver { typedef std::pair resolver_iterator_pair; - void clear_resolved_cache() { clear_cache_ = true; } + void clear_resolved_cache() { clear_cache_.store(true); } protected: typedef typename string::type string_type; @@ -35,7 +35,7 @@ struct sync_resolver { resolved_cache; resolved_cache endpoint_cache_; bool cache_resolved_; - bool clear_cache_; + std::atomic clear_cache_; explicit sync_resolver(bool cache_resolved) : cache_resolved_(cache_resolved), clear_cache_(false) {} @@ -44,8 +44,7 @@ struct sync_resolver { string_type /*unused*/const& hostname, string_type const& port) { if (cache_resolved_) { - if (clear_cache_) { - clear_cache_ = false; + if (clear_cache_.exchange(false)) { endpoint_cache_.clear(); } typename resolved_cache::iterator cached_iterator =