diff --git a/include/maxscale/monitor.hh b/include/maxscale/monitor.hh index 650bed9d4..ff81b07c4 100644 --- a/include/maxscale/monitor.hh +++ b/include/maxscale/monitor.hh @@ -33,23 +33,27 @@ public: protected: MonitorInstance(MXS_MONITOR* pMonitor); + const std::string& script() const { return m_script; } + uint64_t events() const { return m_events; } + virtual bool has_sufficient_permissions() const; virtual void configure(const MXS_CONFIG_PARAMETER* pParams); - - virtual void main() = 0; - - static void main(void* pArg); + virtual void tick() = 0; MXS_MONITOR* m_monitor; /**< The generic monitor structure. */ - int32_t m_shutdown; /**< Non-zero if the monitor should shut down. */ - std::string m_script; /**< Launchable script. */ - uint64_t m_events; /**< Enabled monitor events. */ - bool m_checked; /**< Whether server access has been checked. */ MXS_MONITORED_SERVER* m_master; /**< Master server */ private: - int32_t m_status; /**< The current status of the monitor. */ - THREAD m_thread; /**< The thread handle of the monitoring thread. */ + int32_t m_status; /**< The current status of the monitor. */ + THREAD m_thread; /**< The thread handle of the monitoring thread. */ + int32_t m_shutdown; /**< Non-zero if the monitor should shut down. */ + bool m_checked; /**< Whether server access has been checked. */ + std::string m_script; /**< Launchable script. */ + uint64_t m_events; /**< Enabled monitor events. */ + + void main(); + + static void main(void* pArg); }; /** diff --git a/server/core/monitor.cc b/server/core/monitor.cc index 64f8d1af5..d982b106f 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -2508,11 +2508,12 @@ namespace maxscale MonitorInstance::MonitorInstance(MXS_MONITOR* pMonitor) : m_monitor(pMonitor) - , m_shutdown(0) - , m_events(0) , m_master(NULL) , m_status(MXS_MONITOR_STOPPED) , m_thread(0) + , m_shutdown(0) + , m_checked(false) + , m_events(0) { } @@ -2584,6 +2585,47 @@ void MonitorInstance::configure(const MXS_CONFIG_PARAMETER* pParams) { } +void MonitorInstance::main() +{ + atomic_store_int32(&m_status, MXS_MONITOR_RUNNING); + + load_server_journal(m_monitor, &m_master); + + while (!m_shutdown) + { + lock_monitor_servers(m_monitor); + servers_status_pending_to_current(m_monitor); + + tick(); + + /** + * After updating the status of all servers, check if monitor events + * need to be launched. + */ + mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events); + + mon_hangup_failed_servers(m_monitor); + servers_status_current_to_pending(m_monitor); + store_server_journal(m_monitor, m_master); + release_monitor_servers(m_monitor); + + /** Sleep until the next monitoring interval */ + unsigned int ms = 0; + while (ms < m_monitor->interval && !m_shutdown) + { + if (m_monitor->server_pending_changes) + { + // Admin has changed something, skip sleep + break; + } + thread_millisleep(MXS_MON_BASE_INTERVAL_MS); + ms += MXS_MON_BASE_INTERVAL_MS; + } + } + + atomic_store_int32(&m_status, MXS_MONITOR_STOPPED); +} + //static void MonitorInstance::main(void* pArg) { @@ -2591,9 +2633,7 @@ void MonitorInstance::main(void* pArg) if (mysql_thread_init() == 0) { - atomic_store_int32(&pThis->m_status, MXS_MONITOR_RUNNING); - static_cast(pArg)->main(); - atomic_store_int32(&pThis->m_status, MXS_MONITOR_STOPPED); + pThis->main(); mysql_thread_end(); } diff --git a/server/modules/monitor/auroramon/auroramon.cc b/server/modules/monitor/auroramon/auroramon.cc index 54d1f5809..8fdcabe34 100644 --- a/server/modules/monitor/auroramon/auroramon.cc +++ b/server/modules/monitor/auroramon/auroramon.cc @@ -114,48 +114,6 @@ void update_server_status(MXS_MONITOR *monitor, MXS_MONITORED_SERVER *database) } } -/** - * @brief Main monitoring loop - * - * @param arg The MONITOR object for this monitor - */ -void AuroraMonitor::main() -{ - load_server_journal(m_monitor, NULL); - - while (!m_shutdown) - { - lock_monitor_servers(m_monitor); - servers_status_pending_to_current(m_monitor); - - tick(); - - /** - * After updating the status of all servers, check if monitor events - * need to be launched. - */ - mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events); - - mon_hangup_failed_servers(m_monitor); - servers_status_current_to_pending(m_monitor); - store_server_journal(m_monitor, NULL); - release_monitor_servers(m_monitor); - - /** Sleep until the next monitoring interval */ - unsigned int ms = 0; - while (ms < m_monitor->interval && !m_shutdown) - { - if (m_monitor->server_pending_changes) - { - // Admin has changed something, skip sleep - break; - } - thread_millisleep(MXS_MON_BASE_INTERVAL_MS); - ms += MXS_MON_BASE_INTERVAL_MS; - } - } -} - void AuroraMonitor::tick() { for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next) diff --git a/server/modules/monitor/auroramon/auroramon.hh b/server/modules/monitor/auroramon/auroramon.hh index ea99d6c69..ea38edab4 100644 --- a/server/modules/monitor/auroramon/auroramon.hh +++ b/server/modules/monitor/auroramon/auroramon.hh @@ -38,6 +38,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); void tick(); - - void main(); }; diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index 795c097e4..50d50f981 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -204,9 +204,9 @@ json_t* GaleraMonitor::diagnostics_json() const json_object_set_new(rval, "use_priority", json_boolean(m_use_priority)); json_object_set_new(rval, "set_donor_nodes", json_boolean(m_set_donor_nodes)); - if (!m_script.empty()) + if (!script().empty()) { - json_object_set_new(rval, "script", json_string(m_script.c_str())); + json_object_set_new(rval, "script", json_string(script().c_str())); } if (m_cluster_info.c_uuid) @@ -444,50 +444,6 @@ void GaleraMonitor::monitorDatabase(MXS_MONITORED_SERVER *database) } } -/** - * The entry point for the monitoring module thread - * - * @param arg The handle of the monitor - */ -void GaleraMonitor::main() -{ - load_server_journal(m_monitor, NULL); - - while (!m_shutdown) - { - lock_monitor_servers(m_monitor); - servers_status_pending_to_current(m_monitor); - - tick(); - - /** - * After updating the status of all servers, check if monitor events - * need to be launched. - */ - mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events); - - mon_hangup_failed_servers(m_monitor); - - servers_status_current_to_pending(m_monitor); - - store_server_journal(m_monitor, NULL); - release_monitor_servers(m_monitor); - - /** Sleep until the next monitoring interval */ - unsigned int ms = 0; - while (ms < m_monitor->interval && !m_shutdown) - { - if (m_monitor->server_pending_changes) - { - // Admin has changed something, skip sleep - break; - } - thread_millisleep(MXS_MON_BASE_INTERVAL_MS); - ms += MXS_MON_BASE_INTERVAL_MS; - } - } -} - void GaleraMonitor::tick() { int is_cluster = 0; diff --git a/server/modules/monitor/galeramon/galeramon.hh b/server/modules/monitor/galeramon/galeramon.hh index d95afa85a..47cc18fe9 100644 --- a/server/modules/monitor/galeramon/galeramon.hh +++ b/server/modules/monitor/galeramon/galeramon.hh @@ -93,6 +93,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* param); void tick(); - - void main(); }; diff --git a/server/modules/monitor/grmon/grmon.cc b/server/modules/monitor/grmon/grmon.cc index 8fac9c82f..5429e61c6 100644 --- a/server/modules/monitor/grmon/grmon.cc +++ b/server/modules/monitor/grmon/grmon.cc @@ -181,45 +181,6 @@ static void update_server_status(MXS_MONITOR* monitor, MXS_MONITORED_SERVER* ser } } -void GRMon::main() -{ - load_server_journal(m_monitor, NULL); - - while (!m_shutdown) - { - lock_monitor_servers(m_monitor); - servers_status_pending_to_current(m_monitor); - - tick(); - - /** - * After updating the status of all servers, check if monitor events - * need to be launched. - */ - mon_process_state_changes(m_monitor, - m_script.empty() ? NULL : m_script.c_str(), - m_events); - - mon_hangup_failed_servers(m_monitor); - servers_status_current_to_pending(m_monitor); - store_server_journal(m_monitor, NULL); - release_monitor_servers(m_monitor); - - /** Sleep until the next monitoring interval */ - size_t ms = 0; - while (ms < m_monitor->interval && !m_shutdown) - { - if (m_monitor->server_pending_changes) - { - // Admin has changed something, skip sleep - break; - } - thread_millisleep(MXS_MON_BASE_INTERVAL_MS); - ms += MXS_MON_BASE_INTERVAL_MS; - } - } -} - void GRMon::tick() { for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next) diff --git a/server/modules/monitor/grmon/grmon.hh b/server/modules/monitor/grmon/grmon.hh index cdf505a9c..b317e7ec1 100644 --- a/server/modules/monitor/grmon/grmon.hh +++ b/server/modules/monitor/grmon/grmon.hh @@ -38,6 +38,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); void tick(); - - void main(); }; diff --git a/server/modules/monitor/mmmon/mmmon.cc b/server/modules/monitor/mmmon/mmmon.cc index 762b0d9cb..8d7dab94c 100644 --- a/server/modules/monitor/mmmon/mmmon.cc +++ b/server/modules/monitor/mmmon/mmmon.cc @@ -433,48 +433,6 @@ monitorDatabase(MXS_MONITOR* mon, MXS_MONITORED_SERVER *database) } } -/** - * The entry point for the monitoring module thread - * - * @param arg The handle of the monitor - */ -void MMMonitor::main() -{ - load_server_journal(m_monitor, &m_master); - - while (!m_shutdown) - { - lock_monitor_servers(m_monitor); - servers_status_pending_to_current(m_monitor); - - tick(); - - /** - * After updating the status of all servers, check if monitor events - * need to be launched. - */ - mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events); - - mon_hangup_failed_servers(m_monitor); - servers_status_current_to_pending(m_monitor); - store_server_journal(m_monitor, m_master); - release_monitor_servers(m_monitor); - - /** Sleep until the next monitoring interval */ - unsigned int ms = 0; - while (ms < m_monitor->interval && !m_shutdown) - { - if (m_monitor->server_pending_changes) - { - // Admin has changed something, skip sleep - break; - } - thread_millisleep(MXS_MON_BASE_INTERVAL_MS); - ms += MXS_MON_BASE_INTERVAL_MS; - } - } -} - void MMMonitor::tick() { /* start from the first server in the list */ diff --git a/server/modules/monitor/mmmon/mmmon.hh b/server/modules/monitor/mmmon/mmmon.hh index 46cb0e68d..6468f4424 100644 --- a/server/modules/monitor/mmmon/mmmon.hh +++ b/server/modules/monitor/mmmon/mmmon.hh @@ -43,6 +43,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); void tick(); - - void main(); }; diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.cc b/server/modules/monitor/ndbclustermon/ndbclustermon.cc index 049f17bab..af43fcac8 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.cc +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.cc @@ -238,48 +238,6 @@ monitorDatabase(MXS_MONITORED_SERVER *database, char *defaultUser, char *default } } -/** - * The entry point for the monitoring module thread - * - * @param arg The handle of the monitor - */ -void NDBCMonitor::main() -{ - load_server_journal(m_monitor, NULL); - - while (!m_shutdown) - { - lock_monitor_servers(m_monitor); - servers_status_pending_to_current(m_monitor); - - tick(); - - /** - * After updating the status of all servers, check if monitor events - * need to be launched. - */ - mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events); - - mon_hangup_failed_servers(m_monitor); - servers_status_current_to_pending(m_monitor); - store_server_journal(m_monitor, NULL); - release_monitor_servers(m_monitor); - - /** Sleep until the next monitoring interval */ - unsigned int ms = 0; - while (ms < m_monitor->interval && !m_shutdown) - { - if (m_monitor->server_pending_changes) - { - // Admin has changed something, skip sleep - break; - } - thread_millisleep(MXS_MON_BASE_INTERVAL_MS); - ms += MXS_MON_BASE_INTERVAL_MS; - } - } -} - void NDBCMonitor::tick() { MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; diff --git a/server/modules/monitor/ndbclustermon/ndbclustermon.hh b/server/modules/monitor/ndbclustermon/ndbclustermon.hh index cf5216569..c94736ebc 100644 --- a/server/modules/monitor/ndbclustermon/ndbclustermon.hh +++ b/server/modules/monitor/ndbclustermon/ndbclustermon.hh @@ -40,6 +40,4 @@ private: bool has_sufficient_permissions() const; void configure(const MXS_CONFIG_PARAMETER* params); void tick(); - - void main(); };