From ced063b1a09b8cba4b5a9df49e313a5a947cfd7d Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 24 May 2018 12:35:57 +0300 Subject: [PATCH] MXS-1775 Fix GRMon to update pending_status Instead of continuously updating the status of the server object, the monitor should update the pending_status of the monitor object and then only at the end update the status of the server object. --- server/modules/monitor/grmon/grmon.cc | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index d7ed27206..08d786dbc 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -131,15 +131,15 @@ 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); + 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); } else { - server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); + monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR); } monitored_server->server->node_id = -1; @@ -153,23 +153,25 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) } /* If we get this far then we have a working connection */ - server_set_status_nolock(monitored_server->server, SERVER_RUNNING); + monitor_set_pending_status(monitored_server, SERVER_RUNNING); if (is_master(monitored_server)) { - server_set_status_nolock(monitored_server->server, SERVER_MASTER); - server_clear_status_nolock(monitored_server->server, SERVER_SLAVE); + monitor_set_pending_status(monitored_server, SERVER_MASTER); + monitor_clear_pending_status(monitored_server, SERVER_SLAVE); } else if (is_slave(monitored_server)) { - server_set_status_nolock(monitored_server->server, SERVER_SLAVE); - server_clear_status_nolock(monitored_server->server, SERVER_MASTER); + monitor_set_pending_status(monitored_server, SERVER_SLAVE); + monitor_clear_pending_status(monitored_server, SERVER_MASTER); } else { - 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); } + + monitored_server->server->status = monitored_server->pending_status; } /**