diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 00ec96778..45ca58133 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -378,6 +378,23 @@ struct hg_metrics_map_idx { }; }; +/** + * @brief Required server info for the read_only Monitoring actions. + */ +using hostname_t = std::string; +using port_t = int; +using read_only_t = int; + +using read_only_server_t = std::tuple; + +enum READ_ONLY_SERVER_T { + HOSTNAME = 0, + PORT, + READONLY, + __SIZE +}; +// + class MySQL_HostGroups_Manager { private: SQLite3DB *admindb; @@ -748,7 +765,7 @@ class MySQL_HostGroups_Manager { void replication_lag_action_inner(MyHGC *, char*, unsigned int, int); void replication_lag_action(int, char*, unsigned int, int); void read_only_action(char *hostname, int port, int read_only); - void read_only_action_v2(const std::list>& mysql_servers); + void read_only_action_v2(const std::list& mysql_servers); unsigned int get_servers_table_version(); void wait_servers_table_version(unsigned, unsigned); bool shun_and_killall(char *hostname, int port); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 6f9c1a654..1495c397f 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -4584,18 +4584,17 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re * @param mysql_servers List of servers having hostname, port and read only value. * */ -void MySQL_HostGroups_Manager::read_only_action_v2(const std::list>& mysql_servers) { +void MySQL_HostGroups_Manager::read_only_action_v2(const std::list& mysql_servers) { - std::string hostname; - int port = -1; - int read_only = -1; bool update_mysql_servers_table = false; unsigned long long curtime1 = monotonic_time(); wrlock(); for (const auto& server : mysql_servers) { bool is_writer = false; - std::tie(hostname, port, read_only) = server; + const std::string& hostname = std::get(server); + const int port = std::get(server); + const int read_only = std::get(server); const std::string& srv_id = hostname + ":::" + std::to_string(port); auto itr = hostgroup_server_mapping.find(srv_id); @@ -4622,11 +4621,8 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listcopy_if_not_exists(HostGroup_Server_Mapping::Type::WRITER, HostGroup_Server_Mapping::Type::READER); - if (mysql_thread___monitor_writer_is_also_reader) { - // server is also a reader, we copy all nodes from writer to reader (previous reader nodes will be reused) - host_server_mapping->copy_if_not_exists(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER); - } else { - // server can only be a writer + if (mysql_thread___monitor_writer_is_also_reader == false) { + // remove node from reader host_server_mapping->clear(HostGroup_Server_Mapping::Type::READER); } @@ -4671,11 +4667,8 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listcopy_if_not_exists(HostGroup_Server_Mapping::Type::WRITER, HostGroup_Server_Mapping::Type::READER); - if (mysql_thread___monitor_writer_is_also_reader) { - // server is also a reader, we copy all nodes from writer to reader (previous reader nodes will be reused) - host_server_mapping->copy_if_not_exists(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER); - } else { - // server can only be a writer + if (mysql_thread___monitor_writer_is_also_reader == false) { + // remove node from reader host_server_mapping->clear(HostGroup_Server_Mapping::Type::READER); }