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

@ -70,8 +70,13 @@ protected:
* This function is called once per monitor round, and the concrete
* implementation should probe all servers, i.e. call @c update_server_status
* on each server.
*
* The default implementation will:
* - Not call @update_server_status for a server that is in maintenance.
* - Before calling, update the previous status of the server.
* - After the call, update the error count of the server.
*/
virtual void tick() = 0;
virtual void tick();
MXS_MONITOR* m_monitor; /**< The generic monitor structure. */
MXS_MONITORED_SERVER* m_master; /**< Master server */

View File

@ -2635,6 +2635,37 @@ void MonitorInstance::configure(const MXS_CONFIG_PARAMETER* pParams)
{
}
void MonitorInstance::tick()
{
for (MXS_MONITORED_SERVER *pMs = m_monitor->monitored_servers; pMs; pMs = pMs->next)
{
if (!SERVER_IN_MAINT(pMs->server))
{
pMs->mon_prev_status = pMs->server->status;
pMs->pending_status = pMs->server->status;
update_server_status(pMs);
if (mon_status_changed(pMs) || mon_print_fail_status(pMs))
{
MXS_DEBUG("Backend server [%s]:%d state : %s",
pMs->server->address,
pMs->server->port,
STRSRVSTATUS(pMs->server));
}
if (SERVER_IS_DOWN(pMs->server))
{
pMs->mon_err_count += 1;
}
else
{
pMs->mon_err_count = 0;
}
}
}
}
void MonitorInstance::main()
{
load_server_journal(m_monitor, &m_master);

View File

@ -56,13 +56,10 @@ 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);
monitored_server->mon_prev_status = monitored_server->server->status;
/** Try to connect to or ping the database */
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
@ -111,15 +108,6 @@ void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
}
server_transfer_status(monitored_server->server, &temp_server);
}
}
void AuroraMonitor::tick()
{
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
{
update_server_status(ptr);
}
}
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();
};