From 5196371762954f1f99c94de63e13319060f459c1 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 24 May 2018 10:18:53 +0300 Subject: [PATCH] MXS-1775 Use same arrangement in update_server_status All monitors (but possible for MariaDBMon) now handle the connecting to the server in the same way, that is, if the connecting fails, then the status is updated and we return. --- server/modules/monitor/auroramon/auroramon.cc | 74 +++++++++---------- server/modules/monitor/galeramon/galeramon.cc | 8 +- server/modules/monitor/grmon/grmon.cc | 10 +-- server/modules/monitor/mmmon/mmmon.cc | 23 +++--- .../monitor/ndbclustermon/ndbclustermon.cc | 12 +-- 5 files changed, 64 insertions(+), 63 deletions(-) diff --git a/server/modules/monitor/auroramon/auroramon.cc b/server/modules/monitor/auroramon/auroramon.cc index dc3e7391d..62ce45f35 100644 --- a/server/modules/monitor/auroramon/auroramon.cc +++ b/server/modules/monitor/auroramon/auroramon.cc @@ -56,55 +56,55 @@ void AuroraMonitor::destroy() */ void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - SERVER temp_server = {}; - temp_server.status = monitored_server->server->status; - server_clear_status_nolock(&temp_server, - SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR); - - /** Try to connect to or ping the database */ mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); - if (mon_connection_is_ok(rval)) - { - server_set_status_nolock(&temp_server, SERVER_RUNNING); - MYSQL_RES *result; - - /** Connection is OK, query for replica status */ - if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM " - "information_schema.replica_host_status " - "WHERE session_id = 'MASTER_SESSION_ID'") == 0 && - (result = mysql_store_result(monitored_server->con))) - { - ss_dassert(mysql_field_count(monitored_server->con) == 2); - MYSQL_ROW row = mysql_fetch_row(result); - int status = SERVER_SLAVE; - - /** The master will return a row with two identical non-NULL fields */ - if (row[0] && row[1] && strcmp(row[0], row[1]) == 0) - { - status = SERVER_MASTER; - } - - server_set_status_nolock(&temp_server, status); - mysql_free_result(result); - } - else - { - mon_report_query_error(monitored_server); - } - } - else + if (!mon_connection_is_ok(rval)) { /** Failed to connect to the database */ if (mysql_errno(monitored_server->con) == ER_ACCESS_DENIED_ERROR) { - server_set_status_nolock(&temp_server, SERVER_AUTH_ERROR); + server_set_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); } if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) { mon_log_connect_error(monitored_server, rval); } + + return; + } + + SERVER temp_server = {}; + temp_server.status = monitored_server->server->status; + server_clear_status_nolock(&temp_server, + SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR); + + + server_set_status_nolock(&temp_server, SERVER_RUNNING); + MYSQL_RES *result; + + /** Connection is OK, query for replica status */ + if (mxs_mysql_query(monitored_server->con, "SELECT @@aurora_server_id, server_id FROM " + "information_schema.replica_host_status " + "WHERE session_id = 'MASTER_SESSION_ID'") == 0 && + (result = mysql_store_result(monitored_server->con))) + { + ss_dassert(mysql_field_count(monitored_server->con) == 2); + MYSQL_ROW row = mysql_fetch_row(result); + int status = SERVER_SLAVE; + + /** The master will return a row with two identical non-NULL fields */ + if (row[0] && row[1] && strcmp(row[0], row[1]) == 0) + { + status = SERVER_MASTER; + } + + server_set_status_nolock(&temp_server, status); + mysql_free_result(result); + } + else + { + mon_report_query_error(monitored_server); } server_transfer_status(monitored_server->server, &temp_server); diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index b11e30f7a..d37548cd7 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -262,10 +262,6 @@ static bool using_xtrabackup(MXS_MONITORED_SERVER *database, const char* server_ */ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - MYSQL_ROW row; - MYSQL_RES *result; - char *server_string; - mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) { @@ -290,6 +286,10 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) return; } + MYSQL_ROW row; + MYSQL_RES *result; + char *server_string; + /* If we get this far then we have a working connection */ server_set_status_nolock(monitored_server->server, SERVER_RUNNING); diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index 36eb200e7..8efe1f12f 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -148,12 +148,12 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) { mon_log_connect_error(monitored_server, rval); } + + return; } - else - { - /* If we get this far then we have a working connection */ - server_set_status_nolock(monitored_server->server, SERVER_RUNNING); - } + + /* If we get this far then we have a working connection */ + server_set_status_nolock(monitored_server->server, SERVER_RUNNING); if (is_master(monitored_server)) { diff --git a/server/modules/monitor/mmmon/mmmon.cc b/server/modules/monitor/mmmon/mmmon.cc index df505bb52..cba8eaeac 100644 --- a/server/modules/monitor/mmmon/mmmon.cc +++ b/server/modules/monitor/mmmon/mmmon.cc @@ -146,13 +146,6 @@ json_t* MMMonitor::diagnostics_json() const */ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - MYSQL_ROW row; - MYSQL_RES *result; - int isslave = 0; - int ismaster = 0; - unsigned long int server_version = 0; - char *server_string; - mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) @@ -179,13 +172,19 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { mon_log_connect_error(monitored_server, rval); } + return; } - else - { - server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); - monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR); - } + + server_clear_status_nolock(monitored_server->server, SERVER_AUTH_ERROR); + monitor_clear_pending_status(monitored_server, SERVER_AUTH_ERROR); + + MYSQL_ROW row; + MYSQL_RES *result; + int isslave = 0; + int ismaster = 0; + unsigned long int server_version = 0; + char *server_string; /* Store current status in both server and monitor server pending struct */ server_set_status_nolock(monitored_server->server, SERVER_RUNNING); diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.cc b/server/modules/monitor/ndbclustermon/ndbclustermon.cc index fcb6d62b8..d6b841f43 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.cc +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.cc @@ -129,12 +129,8 @@ static json_t* diagnostics_json(const MXS_MONITOR_INSTANCE *mon) */ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - MYSQL_ROW row; - MYSQL_RES *result; - int isjoined = 0; - char *server_string; - 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); @@ -150,6 +146,7 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { mon_log_connect_error(monitored_server, rval); } + return; } @@ -157,6 +154,11 @@ void NDBCMonitor::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); + MYSQL_ROW row; + MYSQL_RES *result; + int isjoined = 0; + char *server_string; + /* get server version string */ mxs_mysql_set_server_version(monitored_server->con, monitored_server->server); server_string = monitored_server->server->version_string;