From df4e19eb27c557a064bcf6c7d5b78a5f77834a98 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Wed, 23 May 2018 16:17:12 +0300 Subject: [PATCH] MXS-1775 Provide default implementation for MonitorInstance::tick --- include/maxscale/monitor.hh | 7 +- server/core/monitor.cc | 31 +++++++ server/modules/monitor/auroramon/auroramon.cc | 90 ++++++++----------- server/modules/monitor/auroramon/auroramon.hh | 1 - server/modules/monitor/galeramon/galeramon.cc | 44 +-------- server/modules/monitor/grmon/grmon.cc | 17 ---- server/modules/monitor/grmon/grmon.hh | 1 - server/modules/monitor/mmmon/mmmon.cc | 43 +-------- .../monitor/ndbclustermon/ndbclustermon.cc | 27 ------ .../monitor/ndbclustermon/ndbclustermon.hh | 1 - 10 files changed, 81 insertions(+), 181 deletions(-) diff --git a/include/maxscale/monitor.hh b/include/maxscale/monitor.hh index 0f816a407..32d01d761 100644 --- a/include/maxscale/monitor.hh +++ b/include/maxscale/monitor.hh @@ -70,8 +70,13 @@ protected: * This function is called once per monitor round, and the concrete * implementation should probe all servers, i.e. call @c update_server_status * on each server. + * + * The default implementation will: + * - Not call @update_server_status for a server that is in maintenance. + * - Before calling, update the previous status of the server. + * - After the call, update the error count of the server. */ - virtual void tick() = 0; + virtual void tick(); MXS_MONITOR* m_monitor; /**< The generic monitor structure. */ MXS_MONITORED_SERVER* m_master; /**< Master server */ diff --git a/server/core/monitor.cc b/server/core/monitor.cc index c37d10611..1bdc20fc4 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -2635,6 +2635,37 @@ void MonitorInstance::configure(const MXS_CONFIG_PARAMETER* pParams) { } +void MonitorInstance::tick() +{ + for (MXS_MONITORED_SERVER *pMs = m_monitor->monitored_servers; pMs; pMs = pMs->next) + { + if (!SERVER_IN_MAINT(pMs->server)) + { + pMs->mon_prev_status = pMs->server->status; + pMs->pending_status = pMs->server->status; + + update_server_status(pMs); + + if (mon_status_changed(pMs) || mon_print_fail_status(pMs)) + { + MXS_DEBUG("Backend server [%s]:%d state : %s", + pMs->server->address, + pMs->server->port, + STRSRVSTATUS(pMs->server)); + } + + if (SERVER_IS_DOWN(pMs->server)) + { + pMs->mon_err_count += 1; + } + else + { + pMs->mon_err_count = 0; + } + } + } +} + void MonitorInstance::main() { load_server_journal(m_monitor, &m_master); diff --git a/server/modules/monitor/auroramon/auroramon.cc b/server/modules/monitor/auroramon/auroramon.cc index e1f582638..dc3e7391d 100644 --- a/server/modules/monitor/auroramon/auroramon.cc +++ b/server/modules/monitor/auroramon/auroramon.cc @@ -56,70 +56,58 @@ void AuroraMonitor::destroy() */ void AuroraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - if (!SERVER_IN_MAINT(monitored_server->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 temp_server = {}; - temp_server.status = monitored_server->server->status; - server_clear_status_nolock(&temp_server, - SERVER_RUNNING | SERVER_MASTER | SERVER_SLAVE | SERVER_AUTH_ERROR); - monitored_server->mon_prev_status = monitored_server->server->status; + server_set_status_nolock(&temp_server, SERVER_RUNNING); + MYSQL_RES *result; - /** 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)) + /** 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))) { - server_set_status_nolock(&temp_server, SERVER_RUNNING); - MYSQL_RES *result; + ss_dassert(mysql_field_count(monitored_server->con) == 2); + MYSQL_ROW row = mysql_fetch_row(result); + int status = SERVER_SLAVE; - /** 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))) + /** The master will return a row with two identical non-NULL fields */ + if (row[0] && row[1] && strcmp(row[0], row[1]) == 0) { - 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); + status = SERVER_MASTER; } + + server_set_status_nolock(&temp_server, status); + mysql_free_result(result); } else { - /** 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); - } - - if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) - { - mon_log_connect_error(monitored_server, rval); - } + mon_report_query_error(monitored_server); + } + } + else + { + /** 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_transfer_status(monitored_server->server, &temp_server); + if (mon_status_changed(monitored_server) && mon_print_fail_status(monitored_server)) + { + mon_log_connect_error(monitored_server, rval); + } } -} -void AuroraMonitor::tick() -{ - for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next) - { - update_server_status(ptr); - } + server_transfer_status(monitored_server->server, &temp_server); } bool AuroraMonitor::has_sufficient_permissions() const diff --git a/server/modules/monitor/auroramon/auroramon.hh b/server/modules/monitor/auroramon/auroramon.hh index e7c895417..c62b724c4 100644 --- a/server/modules/monitor/auroramon/auroramon.hh +++ b/server/modules/monitor/auroramon/auroramon.hh @@ -39,5 +39,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); - void tick(); }; diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index 4fd75b8c8..b11e30f7a 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -266,15 +266,6 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) MYSQL_RES *result; char *server_string; - /* Don't even probe server flagged as in maintenance */ - if (SERVER_IN_MAINT(monitored_server->server)) - { - return; - } - - /** Store previous status */ - monitored_server->mon_prev_status = monitored_server->server->status; - mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) { @@ -445,39 +436,10 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) void GaleraMonitor::tick() { + MonitorInstance::tick(); + int is_cluster = 0; - MXS_MONITORED_SERVER* ptr = m_monitor->monitored_servers; - while (ptr) - { - ptr->mon_prev_status = ptr->server->status; - - update_server_status(ptr); - - /* Log server status change */ - if (mon_status_changed(ptr)) - { - MXS_DEBUG("Backend server [%s]:%d state : %s", - ptr->server->address, - ptr->server->port, - STRSRVSTATUS(ptr->server)); - } - - if (SERVER_IS_DOWN(ptr->server)) - { - /** Increase this server'e error count */ - ptr->mon_err_count += 1; - - } - else - { - /** Reset this server's error count */ - ptr->mon_err_count = 0; - } - - ptr = ptr->next; - } - /* Try to set a Galera cluster based on * UUID and cluster_size each node reports: * no multiple clusters UUID are allowed. @@ -496,7 +458,7 @@ void GaleraMonitor::tick() m_master = set_cluster_master(m_master, candidate_master, m_disableMasterFailback); - ptr = m_monitor->monitored_servers; + MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; while (ptr) { diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index 926c994f9..36eb200e7 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -127,15 +127,6 @@ static bool is_slave(MXS_MONITORED_SERVER* server) void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) { - /* Don't even probe server flagged as in maintenance */ - if (SERVER_IN_MAINT(monitored_server->server)) - { - return; - } - - /** Store previous status */ - monitored_server->mon_prev_status = monitored_server->server->status; - mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) @@ -181,14 +172,6 @@ void GRMon::update_server_status(MXS_MONITORED_SERVER* monitored_server) } } -void GRMon::tick() -{ - for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next) - { - update_server_status(ptr); - } -} - /** * The module entry point routine. It is this routine that * must populate the structure that is referred to as the diff --git a/server/modules/monitor/grmon/grmon.hh b/server/modules/monitor/grmon/grmon.hh index c7ed5225a..bdd28cc65 100644 --- a/server/modules/monitor/grmon/grmon.hh +++ b/server/modules/monitor/grmon/grmon.hh @@ -39,5 +39,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); - void tick(); }; diff --git a/server/modules/monitor/mmmon/mmmon.cc b/server/modules/monitor/mmmon/mmmon.cc index 7279c909c..df505bb52 100644 --- a/server/modules/monitor/mmmon/mmmon.cc +++ b/server/modules/monitor/mmmon/mmmon.cc @@ -153,14 +153,6 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) unsigned long int server_version = 0; char *server_string; - /* Don't probe servers in maintenance mode */ - if (SERVER_IN_MAINT(monitored_server->server)) - { - return; - } - - /** Store previous status */ - monitored_server->mon_prev_status = monitored_server->server->status; mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) @@ -433,45 +425,14 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) void MMMonitor::tick() { - /* start from the first server in the list */ - MXS_MONITORED_SERVER* ptr = m_monitor->monitored_servers; - - while (ptr) - { - /* copy server status into monitor pending_status */ - ptr->pending_status = ptr->server->status; - - /* monitor current node */ - update_server_status(ptr); - - if (mon_status_changed(ptr) || - mon_print_fail_status(ptr)) - { - MXS_DEBUG("Backend server [%s]:%d state : %s", - ptr->server->address, - ptr->server->port, - STRSRVSTATUS(ptr->server)); - } - if (SERVER_IS_DOWN(ptr->server)) - { - /** Increase this server'e error count */ - ptr->mon_err_count += 1; - } - else - { - /** Reset this server's error count */ - ptr->mon_err_count = 0; - } - - ptr = ptr->next; - } + MonitorInstance::tick(); /* Get Master server pointer */ MXS_MONITORED_SERVER *root_master = get_current_master(); /* Update server status from monitor pending status on that server*/ - ptr = m_monitor->monitored_servers; + MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; while (ptr) { if (!SERVER_IN_MAINT(ptr->server)) diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.cc b/server/modules/monitor/ndbclustermon/ndbclustermon.cc index a515eff49..fcb6d62b8 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.cc +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.cc @@ -134,12 +134,6 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) int isjoined = 0; char *server_string; - /* Don't even probe server flagged as in maintenance */ - if (SERVER_IN_MAINT(monitored_server->server)) - { - return; - } - mxs_connect_result_t rval = mon_ping_or_connect_to_db(m_monitor, monitored_server); if (!mon_connection_is_ok(rval)) { @@ -236,24 +230,3 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server) monitored_server->server->depth = -1; } } - -void NDBCMonitor::tick() -{ - MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; - while (ptr) - { - ptr->mon_prev_status = ptr->server->status; - update_server_status(ptr); - - if (ptr->server->status != ptr->mon_prev_status || - SERVER_IS_DOWN(ptr->server)) - { - MXS_DEBUG("Backend server [%s]:%d state : %s", - ptr->server->address, - ptr->server->port, - STRSRVSTATUS(ptr->server)); - } - - ptr = ptr->next; - } -} diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.hh b/server/modules/monitor/ndbclustermon/ndbclustermon.hh index fb488a7c0..369b27bcc 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.hh +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.hh @@ -41,5 +41,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); - void tick(); };