diff --git a/server/core/internal/service.hh b/server/core/internal/service.hh index 01e1c3083..cd97ca864 100644 --- a/server/core/internal/service.hh +++ b/server/core/internal/service.hh @@ -417,5 +417,13 @@ json_t* service_relations_to_filter(const SFilterDef& filter, const char* host); */ void service_add_server(Monitor* pMonitor, SERVER* pServer); +/** + * @brief Remove server from all services associated with a monitor + * + * @param monitor A monitor. + * @param server A server. + */ +void service_remove_server(Monitor* pMonitor, SERVER* pServer); + std::unique_ptr serviceGetList(void); std::unique_ptr serviceGetListenerList(void); diff --git a/server/core/monitor.cc b/server/core/monitor.cc index 11128d071..48138cefc 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -384,6 +384,8 @@ bool monitor_add_server(Monitor* mon, SERVER* server) mon->m_servers.push_back(db); } + service_add_server(mon, server); + if (old_state == MONITOR_STATE_RUNNING) { MonitorManager::monitor_start(mon, mon->parameters); @@ -450,6 +452,8 @@ void monitor_remove_server(Monitor* mon, SERVER* server) if (ptr) { monitor_server_free(ptr); + + service_remove_server(mon, server); } if (old_state == MONITOR_STATE_RUNNING) diff --git a/server/core/service.cc b/server/core/service.cc index 1ab504507..d7b3d5548 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -161,6 +161,19 @@ void service_add_server(Monitor* pMonitor, SERVER* pServer) } } +void service_remove_server(Monitor* pMonitor, SERVER* pServer) +{ + LockGuard guard(this_unit.lock); + + for (Service* pService : this_unit.services) + { + if (pService->m_monitor == pMonitor) + { + serviceRemoveBackend(pService, pServer); + } + } +} + Service::Service(const std::string& service_name, const std::string& router_name, MXS_CONFIG_PARAMETER* params)