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.
This commit is contained in:
Esa Korhonen
2018-05-09 14:53:41 +03:00
parent 75eded4b89
commit df4454027a
6 changed files with 38 additions and 22 deletions

View File

@ -354,7 +354,7 @@ uint32_t MariaDBMonitor::do_rejoin(const ServerArray& joinable_servers, json_t**
*/ */
bool MariaDBMonitor::cluster_can_be_joined() 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; 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."); PRINT_MXS_JSON_ERROR(err_out, "Cluster gtid domain is unknown. Cannot switchover.");
return false; return false;
@ -657,7 +657,7 @@ bool MariaDBMonitor::do_switchover(MariaDBServer** current_master, MariaDBServer
bool MariaDBMonitor::do_failover(json_t** err_out) bool MariaDBMonitor::do_failover(json_t** err_out)
{ {
// Topology has already been tested to be simple. // 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."); PRINT_MXS_JSON_ERROR(err_out, "Cluster gtid domain is unknown. Cannot failover.");
return false; return false;

View File

@ -56,31 +56,29 @@ const int PORT_UNKNOWN = 0;
MariaDBMonitor::MariaDBMonitor(MXS_MONITOR* monitor_base) MariaDBMonitor::MariaDBMonitor(MXS_MONITOR* monitor_base)
: m_monitor_base(monitor_base) : m_monitor_base(monitor_base)
, m_id(config_get_global_options()->id) , 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_external_master_port(PORT_UNKNOWN)
, m_warn_set_standalone_master(true) , m_warn_set_standalone_master(true)
{} {}
MariaDBMonitor::~MariaDBMonitor() 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. // If this monitor is being restarted, the server data needs to be freed.
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++) clear_server_info();
{
delete *iter; // Next, initialize the data.
}
m_servers.clear();
for (auto mon_server = m_monitor_base->monitored_servers; mon_server; mon_server = mon_server->next) 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_servers.push_back(new MariaDBServer(mon_server));
} }
m_server_info.clear();
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++) for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
{ {
auto mon_server = (*iter)->m_server_base; 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. * 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 MariaDBMonitor::start(const MXS_CONFIG_PARAMETER* params)
{ {
bool error = false; 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_keep_running = true;
m_master = NULL; /* Reset all monitored state info. The server dependent values must be reset as servers could have been
init_server_info(); * added, removed and modified. */
reset_server_info();
if (!load_config_params(params)) if (!load_config_params(params))
{ {
@ -477,7 +489,7 @@ void MariaDBMonitor::main_loop()
void MariaDBMonitor::update_gtid_domain() void MariaDBMonitor::update_gtid_domain()
{ {
int64_t domain = m_master->m_gtid_domain_id; 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 ".", MXS_NOTICE("Gtid domain id of master has changed: %" PRId64 " -> %" PRId64 ".",
m_master_gtid_domain, domain); m_master_gtid_domain, domain);

View File

@ -173,7 +173,8 @@ private:
// Base methods // Base methods
MariaDBMonitor(MXS_MONITOR* monitor_base); MariaDBMonitor(MXS_MONITOR* monitor_base);
~MariaDBMonitor(); ~MariaDBMonitor();
void init_server_info(); void reset_server_info();
void clear_server_info();
bool load_config_params(const MXS_CONFIG_PARAMETER* params); bool load_config_params(const MXS_CONFIG_PARAMETER* params);
bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params); bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params);
MariaDBServer* get_server_info(MXS_MONITORED_SERVER* db); MariaDBServer* get_server_info(MXS_MONITORED_SERVER* db);

View File

@ -15,3 +15,5 @@
/** Server id default value */ /** Server id default value */
const int64_t SERVER_ID_UNKNOWN = -1; const int64_t SERVER_ID_UNKNOWN = -1;
/** Default gtid domain */
const int64_t GTID_DOMAIN_UNKNOWN = -1;

View File

@ -33,3 +33,4 @@
} while (false) } while (false)
extern const int64_t SERVER_ID_UNKNOWN; extern const int64_t SERVER_ID_UNKNOWN;
extern const int64_t GTID_DOMAIN_UNKNOWN;

View File

@ -49,7 +49,7 @@ MariaDBServer::MariaDBServer(MXS_MONITORED_SERVER* monitored_server)
, m_n_slave_heartbeats(0) , m_n_slave_heartbeats(0)
, m_heartbeat_period(0) , m_heartbeat_period(0)
, m_latest_event(0) , m_latest_event(0)
, m_gtid_domain_id(-1) , m_gtid_domain_id(GTID_DOMAIN_UNKNOWN)
{ {
ss_dassert(monitored_server); ss_dassert(monitored_server);
} }