From f600b3a7698f66ede87e2be8d1c51780b8f6aaa2 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 5 Jun 2018 18:47:10 +0300 Subject: [PATCH] MXS-1775 Check disk space in MariaDBMonitor --- include/maxscale/monitor.hh | 18 ++++++++++++++++-- server/core/monitor.cc | 8 ++++---- .../modules/monitor/mariadbmon/mariadbmon.cc | 2 +- .../modules/monitor/mariadbmon/mariadbmon.hh | 1 + .../monitor/mariadbmon/mariadbserver.cc | 14 ++++++++++---- .../monitor/mariadbmon/mariadbserver.hh | 5 +++-- 6 files changed, 35 insertions(+), 13 deletions(-) diff --git a/include/maxscale/monitor.hh b/include/maxscale/monitor.hh index fe31ea853..425d8367e 100644 --- a/include/maxscale/monitor.hh +++ b/include/maxscale/monitor.hh @@ -113,9 +113,23 @@ protected: return atomic_load_int32(&m_shutdown) != 0; } - bool should_check_disk_space(const MXS_MONITORED_SERVER* pMonitored_server) const; + /** + * @brief Should the disk space status be updated. + * + * @param pMonitored_server The monitored server in question. + * + * @return True, if the disk space should be checked, false otherwise. + */ + bool should_update_disk_space_status(const MXS_MONITORED_SERVER* pMonitored_server) const; - void check_disk_space(MXS_MONITORED_SERVER* pMonitored_server); + /** + * @brief Update the disk space status of a server. + * + * After the call, the bit @c SERVER_DISK_SPACE_EXHAUSTED will be set on + * @c pMonitored_server->pending_status if the disk space is exhausted + * or cleared if it is not. + */ + void update_disk_space_status(MXS_MONITORED_SERVER* pMonitored_server); static int64_t get_time_ms(); diff --git a/server/core/monitor.cc b/server/core/monitor.cc index ccfc5b21b..dad67e340 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -2664,7 +2664,7 @@ int64_t MonitorInstance::get_time_ms() return t.tv_sec * 1000 + (t.tv_nsec / 1000000); } -bool MonitorInstance::should_check_disk_space(const MXS_MONITORED_SERVER* pMs) const +bool MonitorInstance::should_update_disk_space_status(const MXS_MONITORED_SERVER* pMs) const { bool should_check = false; @@ -2709,7 +2709,7 @@ bool check_disk_space_exhausted(MXS_MONITORED_SERVER* pMs, } -void MonitorInstance::check_disk_space(MXS_MONITORED_SERVER* pMs) +void MonitorInstance::update_disk_space_status(MXS_MONITORED_SERVER* pMs) { std::map info; @@ -2843,9 +2843,9 @@ void MonitorInstance::tick() monitor_clear_pending_status(pMs, SERVER_AUTH_ERROR); monitor_set_pending_status(pMs, SERVER_RUNNING); - if (should_check_disk_space(pMs)) + if (should_update_disk_space_status(pMs)) { - check_disk_space(pMs); + update_disk_space_status(pMs); } update_server_status(pMs); diff --git a/server/modules/monitor/mariadbmon/mariadbmon.cc b/server/modules/monitor/mariadbmon/mariadbmon.cc index 7d63bdbaf..d6ae19b77 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon.cc +++ b/server/modules/monitor/mariadbmon/mariadbmon.cc @@ -278,7 +278,7 @@ void MariaDBMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server auto i = m_server_info.find(monitored_server); ss_dassert(i != m_server_info.end()); - (*i).second->update_server(m_monitor); + (*i).second->update_server(*this); } void MariaDBMonitor::pre_loop() diff --git a/server/modules/monitor/mariadbmon/mariadbmon.hh b/server/modules/monitor/mariadbmon/mariadbmon.hh index a0197eb29..75d370f5f 100644 --- a/server/modules/monitor/mariadbmon/mariadbmon.hh +++ b/server/modules/monitor/mariadbmon/mariadbmon.hh @@ -99,6 +99,7 @@ public: bool manual_rejoin(SERVER* rejoin_server, json_t** output); protected: + friend class MariaDBServer; void update_server_status(MXS_MONITORED_SERVER* pMonitored_server); void pre_loop(); void tick(); diff --git a/server/modules/monitor/mariadbmon/mariadbserver.cc b/server/modules/monitor/mariadbmon/mariadbserver.cc index 4255e7780..dc488c640 100644 --- a/server/modules/monitor/mariadbmon/mariadbserver.cc +++ b/server/modules/monitor/mariadbmon/mariadbserver.cc @@ -19,6 +19,7 @@ #include #include #include +#include "mariadbmon.hh" using std::string; @@ -697,13 +698,13 @@ bool MariaDBServer::run_sql_from_file(const string& path, json_t** error_out) return !error; } -void MariaDBServer::update_server(MXS_MONITOR* base_monitor) +void MariaDBServer::update_server(MariaDBMonitor& monitor) { /* Monitor current node if not in maintenance. */ bool in_maintenance = m_server_base->pending_status & SERVER_MAINT; if (!in_maintenance) { - monitor_server(base_monitor); + monitor_server(monitor); } /** Increase or reset the error count of the server. */ bool is_running = m_server_base->pending_status & SERVER_RUNNING; @@ -715,10 +716,10 @@ void MariaDBServer::update_server(MXS_MONITOR* base_monitor) * * @param base_monitor The cluster monitor. */ -void MariaDBServer::monitor_server(MXS_MONITOR* base_monitor) +void MariaDBServer::monitor_server(MariaDBMonitor& monitor) { MXS_MONITORED_SERVER* mon_srv = m_server_base; - mxs_connect_result_t rval = mon_ping_or_connect_to_db(base_monitor, mon_srv); + mxs_connect_result_t rval = mon_ping_or_connect_to_db(monitor.m_monitor, mon_srv); MYSQL* conn = mon_srv->con; // mon_ping_or_connect_to_db() may have reallocated the MYSQL struct. if (mon_connection_is_ok(rval)) @@ -751,6 +752,11 @@ void MariaDBServer::monitor_server(MXS_MONITOR* base_monitor) return; } + if (monitor.should_update_disk_space_status(m_server_base)) + { + monitor.update_disk_space_status(m_server_base); + } + string errmsg; bool query_ok = false; /* Query different things depending on server version/type. */ diff --git a/server/modules/monitor/mariadbmon/mariadbserver.hh b/server/modules/monitor/mariadbmon/mariadbserver.hh index 85933d7c6..5616f5bb9 100644 --- a/server/modules/monitor/mariadbmon/mariadbserver.hh +++ b/server/modules/monitor/mariadbmon/mariadbserver.hh @@ -25,6 +25,7 @@ enum print_repl_warnings_t }; class QueryResult; +class MariaDBMonitor; class MariaDBServer; // Server pointer array typedef std::vector ServerArray; @@ -333,7 +334,7 @@ public: * * @param base_monitor The base monitor object monitoring this server. Required for connection settings. */ - void update_server(MXS_MONITOR* base_monitor); + void update_server(MariaDBMonitor& monitor); /** * Clear server pending status flags. @@ -350,7 +351,7 @@ public: void set_status(uint64_t bits); private: - void monitor_server(MXS_MONITOR* base_monitor); + void monitor_server(MariaDBMonitor& monitor); bool update_slave_status(std::string* errmsg_out = NULL); void update_server_info(); };