MXS-1775 Check connection in MonitorInstance::tick()

Since the connection checking is done in an identical fashion in
all monitors, it can be moved to the base-class.
This commit is contained in:
Johan Wikman
2018-05-24 16:13:00 +03:00
parent a8205824f8
commit 15b1c270a3
7 changed files with 34 additions and 142 deletions

View File

@ -72,8 +72,13 @@ protected:
* on each server.
*
* The default implementation will:
* - Not call @update_server_status for a server that is in maintenance.
* - Not call @c update_server_status for a server that is in maintenance.
* - Before calling, update the previous status of the server.
* - Before calling, update the pending status of the monitored server object
* to the status of the corresponing server object.
* - Ensure that there is a connection to the server. If that fails, then
* the pending status will be updated accordingly and @c update_server_status
* will *not* be called.
* - After the call, update the error count of the server.
*/
virtual void tick();

View File

@ -2644,7 +2644,33 @@ void MonitorInstance::tick()
pMs->mon_prev_status = pMs->server->status;
pMs->pending_status = pMs->server->status;
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, pMs);
if (mon_connection_is_ok(rval))
{
monitor_clear_pending_status(pMs, SERVER_AUTH_ERROR);
monitor_set_pending_status(pMs, SERVER_RUNNING);
update_server_status(pMs);
}
else
{
monitor_clear_pending_status(pMs, SERVER_RUNNING);
if (mysql_errno(pMs->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(pMs, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(pMs, SERVER_AUTH_ERROR);
}
if (mon_status_changed(pMs) && mon_print_fail_status(pMs))
{
mon_log_connect_error(pMs, rval);
}
}
if (mon_status_changed(pMs) || mon_print_fail_status(pMs))
{

View File

@ -56,35 +56,8 @@ void AuroraMonitor::destroy()
*/
void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
monitor_clear_pending_status(monitored_server, SERVER_RUNNING);
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
monitored_server->server->node_id = -1;
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
monitor_set_pending_status(monitored_server, SERVER_RUNNING);
monitor_clear_pending_status(monitored_server, SERVER_MASTER | SERVER_SLAVE);
MYSQL_RES *result;
/** Connection is OK, query for replica status */

View File

@ -262,34 +262,6 @@ static bool using_xtrabackup(MXS_MONITORED_SERVER *database, const char* server_
*/
void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
monitor_clear_pending_status(monitored_server, SERVER_RUNNING);
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
monitored_server->server->node_id = -1;
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
monitor_set_pending_status(monitored_server, SERVER_RUNNING);
MYSQL_ROW row;
MYSQL_RES *result;
char *server_string;

View File

@ -127,34 +127,6 @@ static bool is_slave(MXS_MONITORED_SERVER* server)
void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
monitor_clear_pending_status(monitored_server, SERVER_RUNNING);
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
monitored_server->server->node_id = -1;
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
monitor_set_pending_status(monitored_server, SERVER_RUNNING);
if (is_master(monitored_server))
{
monitor_set_pending_status(monitored_server, SERVER_MASTER);

View File

@ -146,34 +146,6 @@ json_t* MMMonitor::diagnostics_json() const
*/
void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
monitor_clear_pending_status(monitored_server, SERVER_RUNNING);
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
monitored_server->server->node_id = -1;
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
monitor_set_pending_status(monitored_server, SERVER_RUNNING);
MYSQL_ROW row;
MYSQL_RES *result;
int isslave = 0;

View File

@ -129,34 +129,6 @@ static json_t* diagnostics_json(const MXS_MONITOR_INSTANCE *mon)
*/
void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server);
if (!mon_connection_is_ok(rval))
{
monitor_clear_pending_status(monitored_server, SERVER_RUNNING);
if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR)
{
monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
else
{
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
}
monitored_server->server->node_id = -1;
if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server))
{
mon_log_connect_error(monitored_server, rval);
}
return;
}
monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR);
monitor_set_pending_status(monitored_server, SERVER_RUNNING);
MYSQL_ROW row;
MYSQL_RES *result;
int isjoined = 0;