diff --git a/include/maxscale/monitor.hh b/include/maxscale/monitor.hh index 32d01d761..f7fba458a 100644 --- a/include/maxscale/monitor.hh +++ b/include/maxscale/monitor.hh @@ -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(); diff --git a/server/core/monitor.cc b/server/core/monitor.cc index 1bdc20fc4..5cbd6ce2a 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -2644,7 +2644,33 @@ void MonitorInstance::tick() pMs->mon_prev_status = pMs->server->status; pMs->pending_status = pMs->server->status; - update_server_status(pMs); + 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)) { diff --git a/server/modules/monitor/auroramon/auroramon.cc b/server/modules/monitor/auroramon/auroramon.cc index 2825e1a11..bc8b10ba1 100644 --- a/server/modules/monitor/auroramon/auroramon.cc +++ b/server/modules/monitor/auroramon/auroramon.cc @@ -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 */ diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index e8304a9a2..e8635908a 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -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; diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index 0ad63b7b1..32321730d 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -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); diff --git a/server/modules/monitor/mmmon/mmmon.cc b/server/modules/monitor/mmmon/mmmon.cc index 1d5bcdb7b..04b202c5f 100644 --- a/server/modules/monitor/mmmon/mmmon.cc +++ b/server/modules/monitor/mmmon/mmmon.cc @@ -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; diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.cc b/server/modules/monitor/ndbclustermon/ndbclustermon.cc index 69925ed2e..98b4aa1e0 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.cc +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.cc @@ -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;