diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index e0da08d49..0acb9b454 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -760,21 +760,14 @@ bool do_alter_monitor(Monitor* monitor, const char* key, const char* value) bool runtime_alter_monitor(Monitor* monitor, const char* key, const char* value) { - // If the monitor is already stopped, don't stop/start it. - bool was_running = (monitor->state() == MONITOR_STATE_RUNNING); - if (was_running) - { - MonitorManager::stop_monitor(monitor); - } + MonitorStop stop(monitor); bool success = do_alter_monitor(monitor, key, value); + if (success) { MonitorManager::monitor_serialize(monitor); } - if (was_running) - { - MonitorManager::start_monitor(monitor); - } + return success; } diff --git a/server/core/internal/monitor.hh b/server/core/internal/monitor.hh index 1c5d9c543..a0cd9d0f2 100644 --- a/server/core/internal/monitor.hh +++ b/server/core/internal/monitor.hh @@ -178,3 +178,28 @@ public: */ static void debug_wait_one_tick(); }; + +// RAII helper class for temprarily stopping monitors +class MonitorStop +{ +public: + MonitorStop(mxs::Monitor* monitor) + : m_monitor(monitor->state() == MONITOR_STATE_RUNNING ? monitor : nullptr) + { + if (m_monitor) + { + MonitorManager::stop_monitor(m_monitor); + } + } + + ~MonitorStop() + { + if (m_monitor) + { + MonitorManager::start_monitor(m_monitor); + } + } + +private: + mxs::Monitor* m_monitor; +};