From 8d1b8a1774fc5bfbeb5b9e589c8e38f43d8e187e Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 24 May 2018 10:55:20 +0300 Subject: [PATCH] MXS-1775 Handle connection error the same way All monitors (but for MariaDBMon) now handle connection errors in the same manner. An exception is MMMon that modifies both the server status and the monitor status. However, in fact, all other monitors do it the wrong way and update the server status directly instead of only the monitor status that then at the end of the loop should be copied to the server status. --- server/modules/monitor/auroramon/auroramon.cc | 9 ++++++++- server/modules/monitor/galeramon/galeramon.cc | 5 +++-- server/modules/monitor/grmon/grmon.cc | 4 ++-- server/modules/monitor/mmmon/mmmon.cc | 20 +++++++++---------- .../monitor/ndbclustermon/ndbclustermon.cc | 4 ++++ 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/server/modules/monitor/auroramon/auroramon.cc b/server/modules/monitor/auroramon/auroramon.cc index 62ce45f35..45bc70748 100644 --- a/server/modules/monitor/auroramon/auroramon.cc +++ b/server/modules/monitor/auroramon/auroramon.cc @@ -60,11 +60,18 @@ void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) if (!mon_connection_is_ok(rval)) { - /** Failed to connect to the database */ + server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); + if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR) { server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); } + else + { + server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); + } + + monitored_server->server->node_id = -1; if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) { diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index d37548cd7..510940161 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -263,8 +263,11 @@ 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)) { + server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); + if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR) { server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); @@ -276,8 +279,6 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) monitored_server->server->node_id = -1; - server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); - if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) { mon_log_connect_error(monitored_server, rval); diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index 8efe1f12f..d7ed27206 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -131,6 +131,8 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) if (!mon_connection_is_ok(rval)) { + server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); + if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR) { server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); @@ -142,8 +144,6 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) monitored_server->server->node_id = -1; - server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); - if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) { mon_log_connect_error(monitored_server, rval); diff --git a/server/modules/monitor/mmmon/mmmon.cc b/server/modules/monitor/mmmon/mmmon.cc index cba8eaeac..e8c5137e6 100644 --- a/server/modules/monitor/mmmon/mmmon.cc +++ b/server/modules/monitor/mmmon/mmmon.cc @@ -150,23 +150,21 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) if (!mon_connection_is_ok(rval)) { + server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); + monitor_clear_pending_status(monitored_server, SERVER_RUNNING); + if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR) { server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); monitor_set_pending_status(monitored_server, SERVER_AUTH_ERROR); } - server_clear_status_nolock(monitored_server->server, SERVER_RUNNING); - monitor_clear_pending_status(monitored_server, SERVER_RUNNING); + else + { + server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); + monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR); + } - /* Also clear M/S state in both server and monitor server pending struct */ - server_clear_status_nolock(monitored_server->server, SERVER_SLAVE); - server_clear_status_nolock(monitored_server->server, SERVER_MASTER); - monitor_clear_pending_status(monitored_server, SERVER_SLAVE); - monitor_clear_pending_status(monitored_server, SERVER_MASTER); - - /* Clean addition status too */ - server_clear_status_nolock(monitored_server->server, SERVER_STALE_STATUS); - monitor_clear_pending_status(monitored_server, SERVER_STALE_STATUS); + monitored_server->server->node_id = -1; if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) { diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.cc b/server/modules/monitor/ndbclustermon/ndbclustermon.cc index d6b841f43..909c59b22 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.cc +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.cc @@ -139,6 +139,10 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); } + else + { + server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); + } monitored_server->server->node_id = -1;