MXS-1703 Add and use convenience functions for common macros/fields

Also add debug assert to MariaDBServer ctor.
This commit is contained in:
Esa Korhonen 2018-04-12 16:57:07 +03:00
parent f7cc2aed5a
commit 4d6239635e
4 changed files with 90 additions and 39 deletions

View File

@ -47,10 +47,8 @@ bool MariaDBMonitor::manual_switchover(SERVER* new_master, SERVER* current_maste
{
bool switched = do_switchover(&found_curr_master, &found_new_master, error_out);
const char AUTOSELECT[] = "<autoselect>";
const char* curr_master_name = found_curr_master ?
found_curr_master->server_base->server->unique_name : AUTOSELECT;
const char* new_master_name = found_new_master ?
found_new_master->server_base->server->unique_name : AUTOSELECT;
const char* curr_master_name = found_curr_master ? found_curr_master->name() : AUTOSELECT;
const char* new_master_name = found_new_master ? found_new_master->name() : AUTOSELECT;
if (switched)
{
@ -131,7 +129,6 @@ bool MariaDBMonitor::manual_rejoin(SERVER* rejoin_server, json_t** output)
MXS_MONITORED_SERVER* mon_slave_cand = mon_get_monitored_server(m_monitor_base, rejoin_server);
if (mon_slave_cand)
{
const char* master_name = m_master->server_base->server->unique_name;
MariaDBServer* slave_cand = get_server_info(mon_slave_cand);
if (server_is_rejoin_suspect(slave_cand, m_master, output))
@ -155,13 +152,14 @@ bool MariaDBMonitor::manual_rejoin(SERVER* rejoin_server, json_t** output)
else
{
PRINT_MXS_JSON_ERROR(output, "Server '%s' cannot replicate from cluster master '%s' "
"or it could not be queried.", rejoin_serv_name, master_name);
"or it could not be queried.", rejoin_serv_name,
m_master->name());
}
}
else
{
PRINT_MXS_JSON_ERROR(output, "Cluster master '%s' gtid info could not be updated.",
master_name);
m_master->name());
}
}
}
@ -346,7 +344,7 @@ uint32_t MariaDBMonitor::do_rejoin(const ServerArray& joinable_servers)
for (auto iter = joinable_servers.begin(); iter != joinable_servers.end(); iter++)
{
MariaDBServer* joinable = *iter;
const char* name = joinable->server_base->server->unique_name;
const char* name = joinable->name();
bool op_success;
if (joinable->n_slaves_configured == 0)
@ -377,7 +375,7 @@ uint32_t MariaDBMonitor::do_rejoin(const ServerArray& joinable_servers)
*/
bool MariaDBMonitor::cluster_can_be_joined()
{
return (m_master != NULL && SERVER_IS_MASTER(m_master->server_base->server) && m_master_gtid_domain >= 0);
return (m_master != NULL && m_master->is_master() && m_master_gtid_domain >= 0);
}
/**
@ -486,8 +484,7 @@ bool MariaDBMonitor::server_is_rejoin_suspect(MariaDBServer* rejoin_cand, MariaD
json_t** output)
{
bool is_suspect = false;
auto rejoin_mon_serv = rejoin_cand->server_base;
if (!SERVER_IS_MASTER(rejoin_mon_serv->server) && SERVER_IS_RUNNING(rejoin_mon_serv->server))
if (rejoin_cand->is_running() && !rejoin_cand->is_master())
{
SlaveStatusInfo* slave_status = &rejoin_cand->slave_status;
// Has no slave connection, yet is not a master.
@ -515,8 +512,7 @@ bool MariaDBMonitor::server_is_rejoin_suspect(MariaDBServer* rejoin_cand, MariaD
}
else if (output != NULL)
{
PRINT_MXS_JSON_ERROR(output, "Server '%s' is master or not running.",
rejoin_mon_serv->server->unique_name);
PRINT_MXS_JSON_ERROR(output, "Server '%s' is master or not running.", rejoin_cand->name());
}
return is_suspect;
}
@ -540,7 +536,7 @@ bool MariaDBMonitor::do_switchover(MariaDBServer** current_master, MariaDBServer
if (*current_master == NULL)
{
// Autoselect current master.
if (m_master && SERVER_IS_MASTER(m_master->server_base->server))
if (m_master && m_master->is_master())
{
demotion_target = m_master;
*current_master = demotion_target;
@ -690,13 +686,12 @@ bool MariaDBMonitor::do_switchover(MariaDBServer** current_master, MariaDBServer
const char QUERY_UNDO[] = "SET GLOBAL read_only=0;";
if (mxs_mysql_query(demotion_target->server_base->con, QUERY_UNDO) == 0)
{
PRINT_MXS_JSON_ERROR(err_out, "read_only disabled on server %s.",
demotion_target->server_base->server->unique_name);
PRINT_MXS_JSON_ERROR(err_out, "read_only disabled on server %s.", demotion_target->name());
}
else
{
PRINT_MXS_JSON_ERROR(err_out, "Could not disable read_only on server %s: '%s'.",
demotion_target->server_base->server->unique_name,
demotion_target->name(),
mysql_error(demotion_target->server_base->con));
}
@ -1041,8 +1036,7 @@ bool MariaDBMonitor::wait_cluster_stabilization(MariaDBServer* new_master, const
if (!slave->slave_status.last_error.empty())
{
// IO or SQL error on slave, replication is a fail
MXS_WARNING("Slave '%s' cannot start replication: '%s'.",
slave->server_base->server->unique_name,
MXS_WARNING("Slave '%s' cannot start replication: '%s'.", slave->name(),
slave->slave_status.last_error.c_str());
wait_list.erase(wait_list.begin() + i);
repl_fails++;
@ -1183,7 +1177,7 @@ MariaDBServer* MariaDBMonitor::select_new_master(ServerArray* slaves_out, json_t
valid_but_excluded.push_back(cand);
const char CANNOT_SELECT[] = "Promotion candidate '%s' is excluded from new "
"master selection.";
MXS_INFO(CANNOT_SELECT, cand->server_base->server->unique_name);
MXS_INFO(CANNOT_SELECT, cand->name());
}
else if (cand->check_replication_settings())
{
@ -1212,7 +1206,7 @@ MariaDBServer* MariaDBMonitor::select_new_master(ServerArray* slaves_out, json_t
for (auto iter = valid_but_excluded.begin(); iter != valid_but_excluded.end(); iter++)
{
MariaDBServer* excluded_info = *iter;
const char* excluded_name = (*iter)->server_base->server->unique_name;
const char* excluded_name = (*iter)->name();
if (current_best == NULL)
{
const char EXCLUDED_ONLY_CAND[] = "Server '%s' is a viable choice for new master, "
@ -1458,8 +1452,7 @@ bool MariaDBMonitor::can_replicate_from(MariaDBServer* slave_cand, MariaDBServer
bool MariaDBMonitor::mon_process_failover(bool* cluster_modified_out)
{
ss_dassert(*cluster_modified_out == false);
if (config_get_global_options()->passive ||
(m_master && SERVER_IS_MASTER(m_master->server_base->server)))
if (config_get_global_options()->passive || (m_master && m_master->is_master()))
{
return true;
}
@ -1692,7 +1685,7 @@ bool MariaDBMonitor::switchover_check(SERVER* new_master, SERVER* current_master
bool gtid_ok = true;
for (auto iter = m_servers.begin(); iter != m_servers.end(); iter++)
{
if (SERVER_IS_SLAVE((*iter)->server_base->server) && !uses_gtid((*iter)->server_base, error_out))
if ((*iter)->is_slave() && !uses_gtid((*iter)->server_base, error_out))
{
gtid_ok = false;
}

View File

@ -407,7 +407,7 @@ void MariaDBMonitor::main_loop()
// Use the information to find the so far best master server.
root_master = find_root_master();
if (m_master != NULL && SERVER_IS_MASTER(m_master->server_base->server))
if (m_master != NULL && m_master->is_master())
{
// Update cluster-wide values dependant on the current master.
update_gtid_domain();
@ -451,7 +451,7 @@ void MariaDBMonitor::main_loop()
}
}
if (root_master && SERVER_IS_MASTER(root_master->server_base->server))
if (root_master && root_master->is_master())
{
SERVER* root_master_server = root_master->server_base->server;
// Clear slave and stale slave status bits from current master
@ -492,8 +492,7 @@ void MariaDBMonitor::main_loop()
/* Generate the replication heartbeat event by performing an update */
if (m_detect_replication_lag && root_master &&
(SERVER_IS_MASTER(root_master->server_base->server) ||
SERVER_IS_RELAY_SERVER(root_master->server_base->server)))
(root_master->is_master() || SERVER_IS_RELAY_SERVER(root_master->server_base->server)))
{
measure_replication_lag(root_master);
}
@ -618,8 +617,7 @@ void MariaDBMonitor::handle_auto_failover(bool* failover_performed)
disable_setting(CN_AUTO_FAILOVER);
}
// If master seems to be down, check if slaves are receiving events.
else if (m_verify_master_failure && m_master &&
SERVER_IS_DOWN(m_master->server_base->server) && slave_receiving_events())
else if (m_verify_master_failure && m_master && m_master->is_down() && slave_receiving_events())
{
MXS_INFO("Master failure not yet confirmed by slaves, delaying failover.");
}
@ -688,8 +686,7 @@ void MariaDBMonitor::handle_auto_rejoin()
}
else
{
MXS_ERROR("Query error to master '%s' prevented a possible rejoin operation.",
m_master->server_base->server->unique_name);
MXS_ERROR("Query error to master '%s' prevented a possible rejoin operation.", m_master->name());
}
}
@ -1116,7 +1113,7 @@ string monitored_servers_to_string(const ServerArray& servers)
for (size_t i = 0; i < array_size; i++)
{
rval += separator;
rval += servers[i]->server_base->server->unique_name;
rval += servers[i]->name();
separator = ",";
}
}
@ -1132,7 +1129,7 @@ string get_connection_errors(const ServerArray& servers)
{
const char* error = mysql_error((*iter)->server_base->con);
ss_dassert(*error); // Every connection should have an error.
rval += separator + (*iter)->server_base->server->unique_name + ": '" + error + "'";
rval += separator + (*iter)->name() + ": '" + error + "'";
separator = ", ";
}
return rval;

View File

@ -42,7 +42,9 @@ MariaDBServer::MariaDBServer(MXS_MONITORED_SERVER* monitored_server)
, heartbeat_period(0)
, latest_event(0)
, gtid_domain_id(-1)
{}
{
ss_dassert(monitored_server);
}
int64_t MariaDBServer::relay_log_events()
{
@ -323,7 +325,7 @@ void MariaDBServer::read_server_variables()
bool MariaDBServer::check_replication_settings(print_repl_warnings_t print_warnings)
{
bool rval = true;
const char* servername = server_base->server->unique_name;
const char* servername = name();
if (rpl_settings.log_bin == false)
{
if (print_warnings == WARNINGS_ON)
@ -395,16 +397,40 @@ bool MariaDBServer::wait_until_gtid(const GtidList& target, int timeout, json_t*
if (error)
{
PRINT_MXS_JSON_ERROR(err_out, "Failed to update gtid on server '%s' while waiting for catchup.",
server_base->server->unique_name);
name());
}
else if (!gtid_reached)
{
PRINT_MXS_JSON_ERROR(err_out, "Slave catchup timed out on slave '%s'.",
server_base->server->unique_name);
PRINT_MXS_JSON_ERROR(err_out, "Slave catchup timed out on slave '%s'.", name());
}
return gtid_reached;
}
bool MariaDBServer::is_master() const
{
return SERVER_IS_MASTER(server_base->server);
}
bool MariaDBServer::is_slave() const
{
return SERVER_IS_SLAVE(server_base->server);
}
bool MariaDBServer::is_running() const
{
return SERVER_IS_RUNNING(server_base->server);
}
bool MariaDBServer::is_down() const
{
return SERVER_IS_DOWN(server_base->server);
}
const char* MariaDBServer::name() const
{
return server_base->server->unique_name;
}
QueryResult::QueryResult(MYSQL_RES* resultset)
: m_resultset(resultset)
, m_columns(-1)

View File

@ -161,6 +161,41 @@ public:
* @return True, if target gtid was reached within allotted time
*/
bool wait_until_gtid(const GtidList& target, int timeout, json_t** err_out);
/**
* Convenience method for SERVER_IS_MASTER
*
* @return True if server is a master
*/
bool is_master() const;
/**
* Convenience method for SERVER_IS_SLAVE
*
* @return True if server is a slave
*/
bool is_slave() const;
/**
* Convenience method for SERVER_IS_RUNNING
*
* @return True if server is running
*/
bool is_running() const;
/**
* Convenience method for SERVER_IS_DOWN
*
* @return True if server is down
*/
bool is_down() const;
/**
* Returns the server name.
*
* @return Server unique name
*/
const char* name() const;
};
/**