diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 189a78c1e..f7cac8cc5 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -423,8 +423,8 @@ class MySQL_HostGroups_Manager { HostGroup_Server_Mapping(MySQL_HostGroups_Manager* hgm) : readonly_flag(1), myHGM(hgm) { } ~HostGroup_Server_Mapping() = default; - // Note: copy, remove, clear method also makes changes to MyHostGroups - void copy(Type dest_type, Type src_type, bool update_if_exists = true); + // Note: copy_if_not_exists, remove, clear method also makes changes to MyHostGroups + void copy_if_not_exists(Type dest_type, Type src_type); void remove(Type type, size_t index); void clear(Type type); // @@ -439,11 +439,6 @@ class MySQL_HostGroups_Manager { mapping[type].push_back(node); } - inline - void set(Type type, const std::vector& nodes) { - mapping[type] = nodes; - } - inline void set_readonly_flag(int val) { readonly_flag = val; @@ -455,7 +450,6 @@ class MySQL_HostGroups_Manager { } private: - unsigned int get_hostgroup_id(Type type, size_t index) const; unsigned int get_hostgroup_id(Type type, const Node& node) const; MySrvC* insert_HGM(unsigned int hostgroup_id, const MySrvC* srv); void remove_HGM(MySrvC* srv); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index f08a0d984..59590d2c9 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -4572,6 +4572,14 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re free(query); } +/** + * @brief New implementation of the read_only_action method that does not depend on the admin table. + * The method checks each server in the provided list and adjusts the servers according to their corresponding read_only value. + * If any change has occured, checksum is calculated. + * + * @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) { std::string hostname; @@ -4606,11 +4614,11 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listcopy(HostGroup_Server_Mapping::Type::WRITER, HostGroup_Server_Mapping::Type::READER); + host_server_mapping->copy_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(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER, false); + host_server_mapping->copy_if_not_exists(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER); } else { // server can only be a writer host_server_mapping->clear(HostGroup_Server_Mapping::Type::READER); @@ -4623,22 +4631,19 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listget_readonly_flag() != 0) { // it is the first time that we detect RO on this server + const std::vector& reader_map = host_server_mapping->get(HostGroup_Server_Mapping::Type::READER); - if (act == false) { - const std::vector& reader_map = host_server_mapping->get(HostGroup_Server_Mapping::Type::READER); - - for (const auto& reader_node : reader_map) { - for (const auto& writer_node : writer_map) { + for (const auto& reader_node : reader_map) { + for (const auto& writer_node : writer_map) { - if (reader_node.writer_hostgroup_id == writer_node.writer_hostgroup_id) { - goto __writer_found; - } + if (reader_node.writer_hostgroup_id == writer_node.writer_hostgroup_id) { + goto __writer_found; } - act = true; - break; - __writer_found: - continue; } + act = true; + break; + __writer_found: + continue; } if (act == false) { @@ -4654,11 +4659,11 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listcopy(HostGroup_Server_Mapping::Type::WRITER, HostGroup_Server_Mapping::Type::READER); + host_server_mapping->copy_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(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER, false); + host_server_mapping->copy_if_not_exists(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER); } else { // server can only be a writer host_server_mapping->clear(HostGroup_Server_Mapping::Type::READER); @@ -4670,7 +4675,7 @@ void MySQL_HostGroups_Manager::read_only_action_v2(const std::listcopy(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER, false); + host_server_mapping->copy_if_not_exists(HostGroup_Server_Mapping::Type::READER, HostGroup_Server_Mapping::Type::WRITER); // clearing all writer nodes host_server_mapping->clear(HostGroup_Server_Mapping::Type::WRITER); @@ -7625,7 +7630,7 @@ MySrvC* MySQL_HostGroups_Manager::find_server_in_hg(unsigned int _hid, const std return f_server; } -void MySQL_HostGroups_Manager::HostGroup_Server_Mapping::copy(Type dest_type, Type src_type, bool update_if_exists /*= true*/) { +void MySQL_HostGroups_Manager::HostGroup_Server_Mapping::copy_if_not_exists(Type dest_type, Type src_type) { const std::vector& src_nodes = mapping[src_type]; @@ -7640,15 +7645,6 @@ void MySQL_HostGroups_Manager::HostGroup_Server_Mapping::copy(Type dest_type, Ty if (src_node.reader_hostgroup_id == dest_node.reader_hostgroup_id && src_node.writer_hostgroup_id == dest_node.writer_hostgroup_id) { - - if (update_if_exists) { - MySrvC* new_srv = insert_HGM(get_hostgroup_id(dest_type, dest_node), src_node.srv); - - if (!new_srv) assert(0); - - dest_node.srv = new_srv; - dest_node.server_status = src_node.server_status; - } goto __skip; } } @@ -7703,16 +7699,6 @@ void MySQL_HostGroups_Manager::HostGroup_Server_Mapping::clear(Type type) { mapping[type].clear(); } -unsigned int MySQL_HostGroups_Manager::HostGroup_Server_Mapping::get_hostgroup_id(Type type, size_t index) const { - - if (type == Type::WRITER) - return mapping[Type::WRITER][index].writer_hostgroup_id; - else if (type == Type::READER) - return mapping[Type::READER][index].reader_hostgroup_id; - else - assert(0); -} - unsigned int MySQL_HostGroups_Manager::HostGroup_Server_Mapping::get_hostgroup_id(Type type, const Node& node) const { if (type == Type::WRITER)