MXS-2314 Prevent removal of servers from clustered services
If the servers of a service are defined by a monitor, then it must not be possible to dynamically add or remove servers from the service.
This commit is contained in:
@ -141,16 +141,26 @@ bool runtime_link_server(Server* server, const char* target)
|
|||||||
|
|
||||||
if (service)
|
if (service)
|
||||||
{
|
{
|
||||||
if (serviceAddBackend(service, server))
|
if (!service->uses_cluster())
|
||||||
{
|
{
|
||||||
service_serialize(service);
|
if (serviceAddBackend(service, server))
|
||||||
rval = true;
|
{
|
||||||
|
service_serialize(service);
|
||||||
|
rval = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
config_runtime_error("Service '%s' already uses server '%s'",
|
||||||
|
service->name,
|
||||||
|
server->name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
config_runtime_error("Service '%s' already uses server '%s'",
|
config_runtime_error("The servers of the service '%s' are defined by the monitor '%s'. "
|
||||||
|
"Servers cannot explicitly be added to the service.",
|
||||||
service->name,
|
service->name,
|
||||||
server->name());
|
service->m_monitor->m_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (monitor)
|
else if (monitor)
|
||||||
@ -185,21 +195,34 @@ bool runtime_unlink_server(Server* server, const char* target)
|
|||||||
|
|
||||||
if (service || monitor)
|
if (service || monitor)
|
||||||
{
|
{
|
||||||
rval = true;
|
|
||||||
|
|
||||||
if (service)
|
if (service)
|
||||||
{
|
{
|
||||||
serviceRemoveBackend(service, server);
|
if (!service->uses_cluster())
|
||||||
service_serialize(service);
|
{
|
||||||
|
serviceRemoveBackend(service, server);
|
||||||
|
service_serialize(service);
|
||||||
|
rval = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
config_runtime_error("The servers of the service '%s' are defined by the monitor '%s'. "
|
||||||
|
"Servers cannot explicitly be removed from the service.",
|
||||||
|
service->name,
|
||||||
|
service->m_monitor->m_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (monitor)
|
else if (monitor)
|
||||||
{
|
{
|
||||||
monitor_remove_server(monitor, server);
|
monitor_remove_server(monitor, server);
|
||||||
monitor_serialize(monitor);
|
monitor_serialize(monitor);
|
||||||
|
rval = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* type = service ? "service" : "monitor";
|
if (rval)
|
||||||
MXS_NOTICE("Removed server '%s' from %s '%s'", server->name(), type, target);
|
{
|
||||||
|
const char* type = service ? "service" : "monitor";
|
||||||
|
MXS_NOTICE("Removed server '%s' from %s '%s'", server->name(), type, target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
|
@ -108,6 +108,11 @@ public:
|
|||||||
// TODO: Make this private.
|
// TODO: Make this private.
|
||||||
Monitor* m_monitor { nullptr }; /**< A possibly associated monitor */
|
Monitor* m_monitor { nullptr }; /**< A possibly associated monitor */
|
||||||
|
|
||||||
|
bool uses_cluster() const
|
||||||
|
{
|
||||||
|
return m_monitor != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FilterList m_filters; /**< Ordered list of filters */
|
FilterList m_filters; /**< Ordered list of filters */
|
||||||
std::string m_name; /**< Name of the service */
|
std::string m_name; /**< Name of the service */
|
||||||
|
Reference in New Issue
Block a user