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:251
 
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:331
 
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:69
 
std::chrono::seconds seconds
Definition: authorize_manager.cc:68
 
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:2888
 
struct result result
Definition: result.h:34
 
required string key
Definition: replication_asynchronous_connection_failover.proto:60