* Fixed the functionality of 'mysql-monitor_writer_is_also_reader'

pull/4127/head
Rahim Kanji 3 years ago
parent f35b044a7e
commit 0268495d52

@ -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<hostname_t,port_t,read_only_t>;
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<std::tuple<std::string,int,int>>& mysql_servers);
void read_only_action_v2(const std::list<read_only_server_t>& mysql_servers);
unsigned int get_servers_table_version();
void wait_servers_table_version(unsigned, unsigned);
bool shun_and_killall(char *hostname, int port);

@ -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<std::tuple<std::string,int,int>>& mysql_servers) {
void MySQL_HostGroups_Manager::read_only_action_v2(const std::list<read_only_server_t>& 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<READ_ONLY_SERVER_T::HOSTNAME>(server);
const int port = std::get<READ_ONLY_SERVER_T::PORT>(server);
const int read_only = std::get<READ_ONLY_SERVER_T::READONLY>(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::list<std::tuple<st
proxy_debug(PROXY_DEBUG_MONITOR, 5, "Server '%s:%d' found with 'read_only=0', but not found as writer\n", hostname.c_str(), port);
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_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::list<std::tuple<st
// copy all reader nodes to writer
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_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);
}

Loading…
Cancel
Save