26#ifndef ROUTER_SRC_MYSQL_REST_SERVICE_SRC_MRS_GTID_MANAGER_H_
27#define ROUTER_SRC_MYSQL_REST_SERVICE_SRC_MRS_GTID_MANAGER_H_
33#include <shared_mutex>
52 using clock = std::chrono::steady_clock;
60 bool needs_refresh{
false};
64 uint64_t initial_size_{0};
65 bool requested_initialization_{
false};
66 bool requested_update_{
false};
69 auto it = all_sets.find(uid);
70 if (it == all_sets.end())
return false;
78 return std::accumulate(
79 all_sets.begin(), all_sets.end(), 0,
80 [](
auto v,
auto &kv) { return v + kv.second.size(); });
89 enable_ = cnf.enable.value_or(
true);
91 refresh_after_ = cnf.refresh_after;
105 if (!enable_)
return GtidAction::k_not_found;
110 auto ctxt = get_context(addr);
112 if (!ctxt->requested_initialization_) {
113 ctxt->requested_initialization_ =
true;
114 return GtidAction::k_needs_update;
117 if (!ctxt->requested_update_) {
118 if (needs_update(ctxt.get())) {
119 ctxt->requested_update_ =
true;
120 return GtidAction::k_needs_update;
124 auto l = std::shared_lock<std::shared_mutex>(ctxt->mutex_gtid_access_);
126 if (!ctxt->get_gtidset_by_gtid_uid(gtid.
get_uid(), &
set))
127 return GtidAction::k_not_found;
129 return set->contains(gtid) ? GtidAction::k_is_on_server
130 : GtidAction::k_not_found;
134 if (!enable_)
return;
140 auto ctxt = get_context(addr);
141 auto l = std::unique_lock<std::shared_mutex>(ctxt->mutex_gtid_access_);
143 if (!ctxt->get_gtidset_by_gtid_uid(gtid.
get_uid(), &
set)) {
149 if (!
set->try_merge(gtid))
set->insert(gtid);
153 if (!enable_)
return false;
155 auto ctxt = get_context(addr);
156 return needs_update(ctxt.get());
160 const std::vector<GtidSet> &sets) {
161 if (!enable_)
return;
165 auto ctxt = get_context(addr);
166 auto l = std::unique_lock<std::shared_mutex>(ctxt->mutex_gtid_access_);
168 ctxt->all_sets.clear();
169 for (
auto &
set : sets) {
170 ctxt->all_sets[
set.get_uid()] =
set;
173 ctxt->needs_refresh =
false;
174 ctxt->last_update = std::chrono::steady_clock::now();
175 ctxt->initial_size_ = ctxt->calculate_gtid_items();
176 ctxt->requested_update_ =
false;
179 ctxt->requested_initialization_ =
true;
186 std::optional<duration>
d;
193 template <
typename ValueType,
bool default_value = false>
195 const static std::map<std::string, bool> allowed_values{
196 {
"true",
true}, {
"false",
false}, {
"1",
true}, {
"0",
false}};
197 auto it = allowed_values.find(
value);
198 if (it != allowed_values.end()) {
202 return default_value;
205 template <
typename ValueType>
207 return std::stoull(
value.c_str());
210 template <
typename ValueType>
213 if (
key ==
"gtid.cache.enable") {
215 }
else if (
key ==
"gtid.cache.refreshRate") {
217 }
else if (
key ==
"gtid.cache.refreshWhenIncreasesBy") {
218 result_.refresh_after =
to_uint(vt);
222 template <
typename ValueType>
224 const auto &
key = get_current_key();
225 if (is_object_path()) {
226 handle_object_value(
key, vt);
231 handle_value(std::string{v, v_len});
236 handle_value(std::string{v, v_len});
248 return helper::json::text_to_handler<ParseGtidOptions>(
options);
252 if (refresh_after_.has_value()) {
253 if (refresh_after_.value() <
258 if (!refresh_timeout_.count())
return false;
260 return refresh_timeout_ < (clock::now() - ctxt->
last_update);
265 std::shared_ptr<AddressContext>
result;
266 auto l = std::unique_lock(mutex_address_container_);
268 auto it = address_context_.find(addr);
269 if (it != address_context_.end()) {
272 result = std::make_shared<AddressContext>();
273 result->last_update = clock::now();
274 address_context_[addr] =
result;
282 std::optional<uint64_t> refresh_after_{};
284 std::map<mysql_harness::Destination, std::shared_ptr<AddressContext>>
This class is a adapter for Reader from RapidJson.
Definition: rapid_json_to_struct.h:51
typename Parent::Ch Ch
Definition: rapid_json_to_struct.h:60
Definition: gtid_manager.h:58
std::shared_mutex mutex_gtid_access_
Definition: gtid_manager.h:63
std::map< Uid, GtidSet > all_sets
Definition: gtid_manager.h:62
clock::time_point last_update
Definition: gtid_manager.h:61
bool get_gtidset_by_gtid_uid(const Uid &uid, GtidSet **set)
Definition: gtid_manager.h:68
uint64_t initial_size_
Definition: gtid_manager.h:64
uint64_t calculate_gtid_items() const
Definition: gtid_manager.h:77
Definition: gtid_manager.h:183
std::optional< uint64_t > refresh_after
Definition: gtid_manager.h:187
std::optional< bool > enable
Definition: gtid_manager.h:185
std::optional< duration > d
Definition: gtid_manager.h:186
Definition: gtid_manager.h:191
bool RawNumber(const Ch *v, rapidjson::SizeType v_len, bool) override
enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length)
Definition: gtid_manager.h:235
bool Bool(bool v) override
Definition: gtid_manager.h:240
bool to_bool(const ValueType &value)
Definition: gtid_manager.h:194
void handle_value(const ValueType &vt)
Definition: gtid_manager.h:223
bool String(const Ch *v, rapidjson::SizeType v_len, bool) override
Definition: gtid_manager.h:230
void handle_object_value(const std::string &key, const ValueType &vt)
Definition: gtid_manager.h:211
uint64_t to_uint(const ValueType &value)
Definition: gtid_manager.h:206
Definition: gtid_manager.h:50
std::mutex mutex_address_container_
Definition: gtid_manager.h:283
GtidAction is_executed_on_server(const mysql_harness::Destination &addr, const Gtid >id)
Definition: gtid_manager.h:103
void reinitialize(const mysql_harness::Destination &addr, const std::vector< GtidSet > &sets)
Definition: gtid_manager.h:159
std::map< mysql_harness::Destination, std::shared_ptr< AddressContext > > address_context_
Definition: gtid_manager.h:285
GtidOptions parse_json_options(const std::string &options)
Definition: gtid_manager.h:247
std::shared_ptr< AddressContext > get_context(const mysql_harness::Destination &addr)
Definition: gtid_manager.h:263
void remember(const mysql_harness::Destination &addr, const Gtid >id)
Definition: gtid_manager.h:133
bool needs_update(AddressContext *ctxt)
Definition: gtid_manager.h:251
std::chrono::steady_clock clock
Definition: gtid_manager.h:52
bool needs_update(const mysql_harness::Destination &addr)
Definition: gtid_manager.h:152
clock::duration duration
Definition: gtid_manager.h:53
GtidManager()
Definition: gtid_manager.h:85
void configure(const std::string &json_config)
Definition: gtid_manager.h:87
const GTIDuuid & get_uid() const
Definition: gtid.h:421
Definition: destination.h:95
uint to_uint(enum_sp_type val)
Definition: sql_lex.h:250
static std::string to_string(const LEX_STRING &str)
Definition: lex_string.h:50
Logging interface for using and extending the logging subsystem.
#define IMPORT_LOG_FUNCTIONS()
convenience macro to avoid common boilerplate
Definition: logging.h:323
borrowable::session_track::Gtid< true > Gtid
Definition: classic_protocol_session_track.h:290
CacheOptions parse_json_options(const std::string &options)
Definition: mysql_cache_manager.cc:96
std::optional< bool > to_bool(const std::string &value)
Definition: jvalue.cc:38
std::string to_string(const DummyType &)
Definition: to_string.h:38
const std::string k_true
Definition: to_string.h:34
const std::string k_false
Definition: to_string.h:35
std::chrono::minutes minutes
Definition: authorize_manager.cc:70
std::chrono::seconds seconds
Definition: authorize_manager.cc:69
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
inner::GTIDuuid GTIDuuid
Definition: gtid.h:433
Definition: authorize_manager.h:48
GtidAction
Definition: gtid_manager.h:48
Definition: options.cc:57
typedef::std::uint64_t SizeType
Definition: my_rapidjson_size_t.h:39
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2884
struct result result
Definition: result.h:34
required string key
Definition: replication_asynchronous_connection_failover.proto:60