MXS-1775 Provide default implementation for MonitorInstance::tick

This commit is contained in:
Johan Wikman
2018-05-23 16:17:12 +03:00
parent d844293ea1
commit df4e19eb27
10 changed files with 81 additions and 181 deletions

View File

@ -56,70 +56,58 @@ void AuroraMonitor::destroy()
*/
void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
if (!SERVER_IN_MAINT(monitored_server->server))
SERVER temp_server = {};
temp_server.status = monitored_server->server->status;
server_clear_status_nolock(&temp_server,
SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR);
/** Try to connect to or ping the database */
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (mon_connection_is_ok(rval))
{
SERVER temp_server = {};
temp_server.status = monitored_server->server->status;
server_clear_status_nolock(&temp_server,
SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR);
monitored_server->mon_prev_status = monitored_server->server->status;
server_set_status_nolock(&temp_server, SERVER_RUNNING);
MYSQL_RES *result;
/** Try to connect to or ping the database */
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (mon_connection_is_ok(rval))
/** Connection is OK, query for replica status */
if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM "
"information_schema.replica_host_status "
"WHERE session_id = 'MASTER_SESSION_ID'") == 0 &&
(result = mysql_store_result(monitored_server->con)))
{
server_set_status_nolock(&temp_server, SERVER_RUNNING);
MYSQL_RES *result;
ss_dassert(mysql_field_count(monitored_server->con) == 2);
MYSQL_ROW row = mysql_fetch_row(result);
int status = SERVER_SLAVE;
/** Connection is OK, query for replica status */
if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM "
"information_schema.replica_host_status "
"WHERE session_id = 'MASTER_SESSION_ID'") == 0 &&
(result = mysql_store_result(monitored_server->con)))
/** The master will return a row with two identical non-NULL fields */
if (row[0] && row[1] && strcmp(row[0], row[1]) == 0)
{
ss_dassert(mysql_field_count(monitored_server->con) == 2);
MYSQL_ROW row = mysql_fetch_row(result);
int status = SERVER_SLAVE;
/** The master will return a row with two identical non-NULL fields */
if (row[0] && row[1] && strcmp(row[0], row[1]) == 0)
{
status = SERVER_MASTER;
}
server_set_status_nolock(&temp_server, status);
mysql_free_result(result);
}
else
{
mon_report_query_error(monitored_server);
status = SERVER_MASTER;
}
server_set_status_nolock(&temp_server, status);
mysql_free_result(result);
}
else
{
/** Failed to connect to the database */
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
server_set_status_nolock(&temp_server, SERVER_AUTH_ERROR);
}
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
mon_report_query_error(monitored_server);
}
}
else
{
/** Failed to connect to the database */
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
server_set_status_nolock(&temp_server, SERVER_AUTH_ERROR);
}
server_transfer_status(monitored_server->server, &temp_server);
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
}
}
void AuroraMonitor::tick()
{
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
{
update_server_status(ptr);
}
server_transfer_status(monitored_server->server, &temp_server);
}
bool AuroraMonitor::has_sufficient_permissions() const

View File

@ -39,5 +39,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
};

View File

@ -266,15 +266,6 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MYSQL_RES *result;
char *server_string;
/* Don't even probe server flagged as in maintenance */
if (SERVER_IN_MAINT(monitored_server->server))
{
return;
}
/** Store previous status */
monitored_server->mon_prev_status = monitored_server->server->status;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
@ -445,39 +436,10 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
void GaleraMonitor::tick()
{
MonitorInstance::tick();
int is_cluster = 0;
MXS_MONITORED_SERVER* ptr = m_monitor->monitored_servers;
while (ptr)
{
ptr->mon_prev_status = ptr->server->status;
update_server_status(ptr);
/* Log server status change */
if (mon_status_changed(ptr))
{
MXS_DEBUG("Backend server [%s]:%d state : %s",
ptr->server->address,
ptr->server->port,
STRSRVSTATUS(ptr->server));
}
if (SERVER_IS_DOWN(ptr->server))
{
/** Increase this server'e error count */
ptr->mon_err_count += 1;
}
else
{
/** Reset this server's error count */
ptr->mon_err_count = 0;
}
ptr = ptr->next;
}
/* Try to set a Galera cluster based on
* UUID and cluster_size each node reports:
* no multiple clusters UUID are allowed.
@ -496,7 +458,7 @@ void GaleraMonitor::tick()
m_master = set_cluster_master(m_master, candidate_master, m_disableMasterFailback);
ptr = m_monitor->monitored_servers;
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;
while (ptr)
{

View File

@ -127,15 +127,6 @@ static bool is_slave(MXS_MONITORED_SERVER* server)
void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
/* Don't even probe server flagged as in maintenance */
if (SERVER_IN_MAINT(monitored_server->server))
{
return;
}
/** Store previous status */
monitored_server->mon_prev_status = monitored_server->server->status;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
@ -181,14 +172,6 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server)
}
}
void GRMon::tick()
{
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
{
update_server_status(ptr);
}
}
/**
* The module entry point routine. It is this routine that
* must populate the structure that is referred to as the

View File

@ -39,5 +39,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
};

View File

@ -153,14 +153,6 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
unsigned long int server_version = 0;
char *server_string;
/* Don't probe servers in maintenance mode */
if (SERVER_IN_MAINT(monitored_server->server))
{
return;
}
/** Store previous status */
monitored_server->mon_prev_status = monitored_server->server->status;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
@ -433,45 +425,14 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
void MMMonitor::tick()
{
/* start from the first server in the list */
MXS_MONITORED_SERVER* ptr = m_monitor->monitored_servers;
while (ptr)
{
/* copy server status into monitor pending_status */
ptr->pending_status = ptr->server->status;
/* monitor current node */
update_server_status(ptr);
if (mon_status_changed(ptr) ||
mon_print_fail_status(ptr))
{
MXS_DEBUG("Backend server [%s]:%d state : %s",
ptr->server->address,
ptr->server->port,
STRSRVSTATUS(ptr->server));
}
if (SERVER_IS_DOWN(ptr->server))
{
/** Increase this server'e error count */
ptr->mon_err_count += 1;
}
else
{
/** Reset this server's error count */
ptr->mon_err_count = 0;
}
ptr = ptr->next;
}
MonitorInstance::tick();
/* Get Master server pointer */
MXS_MONITORED_SERVER *root_master = get_current_master();
/* Update server status from monitor pending status on that server*/
ptr = m_monitor->monitored_servers;
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;
while (ptr)
{
if (!SERVER_IN_MAINT(ptr->server))

View File

@ -134,12 +134,6 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
int isjoined = 0;
char *server_string;
/* Don't even probe server flagged as in maintenance */
if (SERVER_IN_MAINT(monitored_server->server))
{
return;
}
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
@ -236,24 +230,3 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
monitored_server->server->depth = -1;
}
}
void NDBCMonitor::tick()
{
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;
while (ptr)
{
ptr->mon_prev_status = ptr->server->status;
update_server_status(ptr);
if (ptr->server->status != ptr->mon_prev_status ||
SERVER_IS_DOWN(ptr->server))
{
MXS_DEBUG("Backend server [%s]:%d state : %s",
ptr->server->address,
ptr->server->port,
STRSRVSTATUS(ptr->server));
}
ptr = ptr->next;
}
}

View File

@ -41,5 +41,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
};