From df4454027a95b0f93b3df0ab6ff78b892a76317c Mon Sep 17 00:00:00 2001 From: Esa Korhonen Date: Wed, 9 May 2018 14:53:41 +0300 Subject: [PATCH] Clean up monitor initialization and destruction Since monitors are now freed at MaxScale exit, the server data should be freed. Also, gtid domain variables are now initialized with a common constant. --- .../mariadbmon/cluster_manipulation.cc | 6 +-- .../modules/monitor/mariadbmon/mariadbmon.cc | 46 ++++++++++++------- .../modules/monitor/mariadbmon/mariadbmon.hh | 3 +- .../monitor/mariadbmon/mariadbmon_common.cc | 2 + .../monitor/mariadbmon/mariadbmon_common.hh | 1 + .../monitor/mariadbmon/mariadbserver.cc | 2 +- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/server/modules/monitor/mariadbmon/cluster_manipulation.cc b/server/modules/monitor/mariadbmon/cluster_manipulation.cc index bbf5136fa..ccd98742a 100644 --- a/server/modules/monitor/mariadbmon/cluster_manipulation.cc +++ b/server/modules/monitor/mariadbmon/cluster_manipulation.cc @@ -354,7 +354,7 @@ uint32_t MariaDBMonitor::do_rejoin(const ServerArray& joinable_servers, json_t** */ bool MariaDBMonitor::cluster_can_be_joined() { - return (m_master != NULL && m_master->is_master() && m_master_gtid_domain >= 0); + return (m_master != NULL && m_master->is_master() && m_master_gtid_domain != GTID_DOMAIN_UNKNOWN); } /** @@ -503,7 +503,7 @@ bool MariaDBMonitor::do_switchover(MariaDBServer** current_master, MariaDBServer demotion_target = *current_master; } - if (m_master_gtid_domain < 0) + if (m_master_gtid_domain == GTID_DOMAIN_UNKNOWN) { PRINT_MXS_JSON_ERROR(err_out, "Cluster gtid domain is unknown. Cannot switchover."); return false; @@ -657,7 +657,7 @@ bool MariaDBMonitor::do_switchover(MariaDBServer** current_master, MariaDBServer bool MariaDBMonitor::do_failover(json_t** err_out) { // Topology has already been tested to be simple. - if (m_master_gtid_domain < 0) + if (m_master_gtid_domain == GTID_DOMAIN_UNKNOWN) { PRINT_MXS_JSON_ERROR(err_out, "Cluster gtid domain is unknown. Cannot failover."); return false; diff --git a/server/modules/monitor/mariadbmon/mariadbmon.cc b/server/modules/monitor/mariadbmon/mariadbmon.cc index a6eef8101..8bc53a727 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon.cc +++ b/server/modules/monitor/mariadbmon/mariadbmon.cc @@ -56,31 +56,29 @@ const int PORT_UNKNOWN = 0; MariaDBMonitor::MariaDBMonitor(MXS_MONITOR* monitor_base) : m_monitor_base(monitor_base) , m_id(config_get_global_options()->id) - , m_master_gtid_domain(-1) + , m_master_gtid_domain(GTID_DOMAIN_UNKNOWN) , m_external_master_port(PORT_UNKNOWN) , m_warn_set_standalone_master(true) {} MariaDBMonitor::~MariaDBMonitor() -{} +{ + clear_server_info(); +} /** - * Initialize the server info hashtable. + * Reset and initialize server arrays and related data. */ -void MariaDBMonitor::init_server_info() +void MariaDBMonitor::reset_server_info() { // If this monitor is being restarted, the server data needs to be freed. - for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++) - { - delete *iter; - } - m_servers.clear(); + clear_server_info(); + + // Next, initialize the data. for (auto mon_server = m_monitor_base->monitored_servers; mon_server; mon_server = mon_server->next) { m_servers.push_back(new MariaDBServer(mon_server)); } - - m_server_info.clear(); for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++) { auto mon_server = (*iter)->m_server_base; @@ -90,6 +88,22 @@ void MariaDBMonitor::init_server_info() } } +void MariaDBMonitor::clear_server_info() +{ + for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++) + { + delete *iter; + } + // All MariaDBServer*:s are now invalid, as well as any dependant data. + m_servers.clear(); + m_server_info.clear(); + m_excluded_servers.clear(); + m_master = NULL; + m_master_gtid_domain = GTID_DOMAIN_UNKNOWN; + m_external_master_host.clear(); + m_external_master_port = PORT_UNKNOWN; +} + /** * Get monitor-specific server info for the monitored server. * @@ -136,12 +150,10 @@ MariaDBMonitor* MariaDBMonitor::create(MXS_MONITOR *monitor) bool MariaDBMonitor::start(const MXS_CONFIG_PARAMETER* params) { bool error = false; - - /* Always reset these values. The server dependent values must be reset as servers could have been - * added and removed. */ m_keep_running = true; - m_master = NULL; - init_server_info(); + /* Reset all monitored state info. The server dependent values must be reset as servers could have been + * added, removed and modified. */ + reset_server_info(); if (!load_config_params(params)) { @@ -477,7 +489,7 @@ void MariaDBMonitor::main_loop() void MariaDBMonitor::update_gtid_domain() { int64_t domain = m_master->m_gtid_domain_id; - if (m_master_gtid_domain >= 0 && domain != m_master_gtid_domain) + if (m_master_gtid_domain != GTID_DOMAIN_UNKNOWN && domain != m_master_gtid_domain) { MXS_NOTICE("Gtid domain id of master has changed: %" PRId64 " -> %" PRId64 ".", m_master_gtid_domain, domain); diff --git a/server/modules/monitor/mariadbmon/mariadbmon.hh b/server/modules/monitor/mariadbmon/mariadbmon.hh index 5030f55dd..243667a4e 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon.hh +++ b/server/modules/monitor/mariadbmon/mariadbmon.hh @@ -173,7 +173,8 @@ private: // Base methods MariaDBMonitor(MXS_MONITOR* monitor_base); ~MariaDBMonitor(); - void init_server_info(); + void reset_server_info(); + void clear_server_info(); bool load_config_params(const MXS_CONFIG_PARAMETER* params); bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params); MariaDBServer* get_server_info(MXS_MONITORED_SERVER* db); diff --git a/server/modules/monitor/mariadbmon/mariadbmon_common.cc b/server/modules/monitor/mariadbmon/mariadbmon_common.cc index 97b10a1a5..a1309d783 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon_common.cc +++ b/server/modules/monitor/mariadbmon/mariadbmon_common.cc @@ -15,3 +15,5 @@ /** Server id default value */ const int64_t SERVER_ID_UNKNOWN = -1; +/** Default gtid domain */ +const int64_t GTID_DOMAIN_UNKNOWN = -1; \ No newline at end of file diff --git a/server/modules/monitor/mariadbmon/mariadbmon_common.hh b/server/modules/monitor/mariadbmon/mariadbmon_common.hh index 2703ffbd3..5633fe28a 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon_common.hh +++ b/server/modules/monitor/mariadbmon/mariadbmon_common.hh @@ -33,3 +33,4 @@ } while (false) extern const int64_t SERVER_ID_UNKNOWN; +extern const int64_t GTID_DOMAIN_UNKNOWN; \ No newline at end of file diff --git a/server/modules/monitor/mariadbmon/mariadbserver.cc b/server/modules/monitor/mariadbmon/mariadbserver.cc index 8e1321863..bcd23ec4f 100644 --- a/server/modules/monitor/mariadbmon/mariadbserver.cc +++ b/server/modules/monitor/mariadbmon/mariadbserver.cc @@ -49,7 +49,7 @@ MariaDBServer::MariaDBServer(MXS_MONITORED_SERVER* monitored_server) , m_n_slave_heartbeats(0) , m_heartbeat_period(0) , m_latest_event(0) - , m_gtid_domain_id(-1) + , m_gtid_domain_id(GTID_DOMAIN_UNKNOWN) { ss_dassert(monitored_server); }