10#include <unordered_set>
12#include <userver/cache/cache_statistics.hpp>
13#include <userver/cache/caching_component_base.hpp>
14#include <userver/cache/update_type.hpp>
15#include <userver/components/component_fwd.hpp>
16#include <userver/concurrent/variable.hpp>
17#include <userver/dynamic_config/client/client.hpp>
18#include <userver/dynamic_config/snapshot.hpp>
19#include <userver/dynamic_config/storage/component.hpp>
20#include <userver/dynamic_config/updater/additional_keys_token.hpp>
21#include <userver/dynamic_config/updates_sink/component.hpp>
22#include <userver/engine/mutex.hpp>
23#include <userver/utils/impl/transparent_hash.hpp>
24#include <userver/utils/internal_tag_fwd.hpp>
26USERVER_NAMESPACE_BEGIN
76class DynamicConfigClientUpdater
final
77 :
public CachingComponentBase<dynamic_config::DocsMap> {
83 DynamicConfigClientUpdater(
const ComponentConfig&,
const ComponentContext&);
85 ~DynamicConfigClientUpdater() override;
90 std::vector<std::string> keys);
96 const std::chrono::system_clock::time_point& last_update,
97 const std::chrono::system_clock::time_point& now,
98 cache::UpdateStatisticsScope&) override;
100 void UpdateFull(
const std::vector<std::string>& docs_map_keys,
101 cache::UpdateStatisticsScope&);
103 void UpdateIncremental(
const std::vector<std::string>& docs_map_keys,
104 cache::UpdateStatisticsScope&);
106 dynamic_config::DocsMap MergeDocsMap(
const dynamic_config::DocsMap& current,
107 dynamic_config::DocsMap&& update,
108 const std::vector<std::string>& removed);
109 void StoreIfEnabled();
111 using DocsMapKeys = utils::impl::TransparentSet<std::string>;
112 using AdditionalDocsMapKeys =
113 std::unordered_set<std::shared_ptr<std::vector<std::string>>>;
115 std::vector<std::string> GetDocsMapKeysToFetch(
116 AdditionalDocsMapKeys& additional_docs_map_keys);
118 void UpdateAdditionalKeys(
const std::vector<std::string>& keys);
120 bool IsDuplicate(cache::
UpdateType update_type,
121 const dynamic_config::DocsMap& new_value)
const;
124 const bool load_only_my_values_;
125 const bool store_enabled_;
127 dynamic_config::Client& config_client_;
129 bool is_empty_{
true};
130 dynamic_config::Client::Timestamp server_timestamp_;
132 engine::Mutex update_config_mutex_;
133 DocsMapKeys docs_map_keys_;
134 concurrent::Variable<AdditionalDocsMapKeys> additional_docs_map_keys_;
138inline constexpr bool kHasValidate<DynamicConfigClientUpdater> =
true;