Fix Galera monitor problem with leaving wrong status for significant periods; change warning message from logging as warning instead of notice.

This commit is contained in:
counterpoint
2015-11-20 10:15:13 +00:00
parent b7ce68aa1c
commit ece53a8ac5
4 changed files with 28 additions and 11 deletions

View File

@ -686,6 +686,18 @@ server_clear_status(SERVER *server, int bit)
server->status &= ~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 * Add a user name and password to use for monitoring the
* state of the server. * state of the server.

View File

@ -202,6 +202,7 @@ extern void dListServers(DCB *);
extern char *server_status(SERVER *); extern char *server_status(SERVER *);
extern void server_set_status(SERVER *, int); extern void server_set_status(SERVER *, int);
extern void server_clear_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 serverAddMonUser(SERVER *, char *, char *);
extern void serverAddParameter(SERVER *, char *, char *); extern void serverAddParameter(SERVER *, char *, char *);
extern char *serverGetParameter(SERVER *, char *); extern char *serverGetParameter(SERVER *, char *);

View File

@ -281,6 +281,7 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database)
int isjoined = 0; int isjoined = 0;
unsigned long int server_version = 0; unsigned long int server_version = 0;
char *server_string; char *server_string;
SERVER temp_server;
/* Don't even probe server flagged as in maintenance */ /* Don't even probe server flagged as in maintenance */
if (SERVER_IN_MAINT(database->server)) if (SERVER_IN_MAINT(database->server))
@ -289,24 +290,25 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database)
/** Store previous status */ /** Store previous status */
database->mon_prev_status = database->server->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 */ /* Also clear Joined, M/S and Stickiness bits */
server_clear_status(database->server, SERVER_JOINED); server_clear_status(&temp_server, SERVER_JOINED);
server_clear_status(database->server, SERVER_SLAVE); server_clear_status(&temp_server, SERVER_SLAVE);
server_clear_status(database->server, SERVER_MASTER); server_clear_status(&temp_server, SERVER_MASTER);
server_clear_status(database->server, SERVER_MASTER_STICKINESS); server_clear_status(&temp_server, SERVER_MASTER_STICKINESS);
connect_result_t rval = mon_connect_to_db(mon, database); connect_result_t rval = mon_connect_to_db(mon, database);
if (rval != MONITOR_CONN_OK) if (rval != MONITOR_CONN_OK)
{ {
if (mysql_errno(database->con) == ER_ACCESS_DENIED_ERROR) 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 else
{ {
server_clear_status(database->server, SERVER_AUTH_ERROR); server_clear_status(&temp_server, SERVER_AUTH_ERROR);
} }
database->server->node_id = -1; 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 */ /* 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 */ /* get server version string */
server_string = (char *) mysql_get_server_info(database->con); server_string = (char *) mysql_get_server_info(database->con);
@ -404,12 +406,14 @@ monitorDatabase(MONITOR *mon, MONITOR_SERVERS *database)
if (isjoined) if (isjoined)
{ {
server_set_status(database->server, SERVER_JOINED); server_set_status(&temp_server, SERVER_JOINED);
} }
else else
{ {
server_clear_status(database->server, SERVER_JOINED); server_clear_status(&temp_server, SERVER_JOINED);
} }
server_transfer_status(database->server, &temp_server);
} }
/** /**

View File

@ -919,7 +919,7 @@ monitorMain(void *arg)
/* log it once */ /* log it once */
if (mon_status_changed(ptr)) if (mon_status_changed(ptr))
{ {
MXS_NOTICE("[mysql_mon]: root server " MXS_WARNING("[mysql_mon]: root server "
"[%s:%i] is no longer Master," "[%s:%i] is no longer Master,"
" let's use it again even " " let's use it again even "
" if it could be a stale master," " if it could be a stale master,"