From ece53a8ac5f04dc3bcce802b619312834f627580 Mon Sep 17 00:00:00 2001 From: counterpoint Date: Fri, 20 Nov 2015 10:15:13 +0000 Subject: [PATCH] Fix Galera monitor problem with leaving wrong status for significant periods; change warning message from logging as warning instead of notice. --- server/core/server.c | 12 ++++++++++++ server/include/server.h | 1 + server/modules/monitor/galeramon.c | 24 ++++++++++++++---------- server/modules/monitor/mysql_mon.c | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/server/core/server.c b/server/core/server.c index 8623eaa2e..9b8814341 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -686,6 +686,18 @@ server_clear_status(SERVER *server, int bit) server->status &= ~bit; } +/** + * Transfer status bitstring from one server to another + * + * @param dest_server The server to be updated + * @param source_server The server to provide the new bit string + */ +void +server_transfer_status(SERVER *dest_server, SERVER *source_server) +{ + dest_server->status = source_server->status; +} + /** * Add a user name and password to use for monitoring the * state of the server. diff --git a/server/include/server.h b/server/include/server.h index 84151ccad..e53e5eedb 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -202,6 +202,7 @@ extern void dListServers(DCB *); extern char *server_status(SERVER *); extern void server_set_status(SERVER *, int); extern void server_clear_status(SERVER *, int); +extern void server_transfer_status(SERVER *dest_server, SERVER *source_server); extern void serverAddMonUser(SERVER *, char *, char *); extern void serverAddParameter(SERVER *, char *, char *); extern char *serverGetParameter(SERVER *, char *); diff --git a/server/modules/monitor/galeramon.c b/server/modules/monitor/galeramon.c index dbfef270b..38cbf9827 100644 --- a/server/modules/monitor/galeramon.c +++ b/server/modules/monitor/galeramon.c @@ -281,6 +281,7 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database) int isjoined = 0; unsigned long int server_version = 0; char *server_string; + SERVER temp_server; /* Don't even probe server flagged as in maintenance */ if (SERVER_IN_MAINT(database->server)) @@ -289,24 +290,25 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database) /** Store previous status */ database->mon_prev_status = database->server->status; - server_clear_status(database->server, SERVER_RUNNING); + server_transfer_status(&temp_server, database->server); + server_clear_status(&temp_server, SERVER_RUNNING); /* Also clear Joined, M/S and Stickiness bits */ - server_clear_status(database->server, SERVER_JOINED); - server_clear_status(database->server, SERVER_SLAVE); - server_clear_status(database->server, SERVER_MASTER); - server_clear_status(database->server, SERVER_MASTER_STICKINESS); + server_clear_status(&temp_server, SERVER_JOINED); + server_clear_status(&temp_server, SERVER_SLAVE); + server_clear_status(&temp_server, SERVER_MASTER); + server_clear_status(&temp_server, SERVER_MASTER_STICKINESS); connect_result_t rval = mon_connect_to_db(mon, database); if (rval != MONITOR_CONN_OK) { if (mysql_errno(database->con) == ER_ACCESS_DENIED_ERROR) { - server_set_status(database->server, SERVER_AUTH_ERROR); + server_set_status(&temp_server, SERVER_AUTH_ERROR); } else { - server_clear_status(database->server, SERVER_AUTH_ERROR); + server_clear_status(&temp_server, SERVER_AUTH_ERROR); } database->server->node_id = -1; @@ -320,7 +322,7 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database) } /* If we get this far then we have a working connection */ - server_set_status(database->server, SERVER_RUNNING); + server_set_status(&temp_server, SERVER_RUNNING); /* get server version string */ server_string = (char *) mysql_get_server_info(database->con); @@ -404,12 +406,14 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database) if (isjoined) { - server_set_status(database->server, SERVER_JOINED); + server_set_status(&temp_server, SERVER_JOINED); } else { - server_clear_status(database->server, SERVER_JOINED); + server_clear_status(&temp_server, SERVER_JOINED); } + + server_transfer_status(database->server, &temp_server); } /** diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index 2290978aa..886d6f534 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -919,7 +919,7 @@ monitorMain(void *arg) /* log it once */ if (mon_status_changed(ptr)) { - MXS_NOTICE("[mysql_mon]: root server " + MXS_WARNING("[mysql_mon]: root server " "[%s:%i] is no longer Master," " let's use it again even " " if it could be a stale master,"