Fix removal of last server from monitor
If the last server was removed, the parameter would be rejected due to it being empty. To remove the parameter, the MonitorManager::reconfigure_monitor should be used. Also fixed the unnecessary serialization after a failure to remove server from a monitor and the fact that some errors were logged instead of written to the caller of the command.
This commit is contained in:
@ -198,37 +198,25 @@ bool runtime_remove_server(Monitor* mon, Server* server)
|
|||||||
|
|
||||||
if (MonitorManager::server_is_monitored(server) != mon)
|
if (MonitorManager::server_is_monitored(server) != mon)
|
||||||
{
|
{
|
||||||
MXS_ERROR("Server '%s' is not monitored by '%s'.", server->name(), mon->m_name);
|
config_runtime_error("Server '%s' is not monitored by '%s'.", server->name(), mon->m_name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Construct the new list. The removed value could be anywhere.
|
MonitorStop stop(mon);
|
||||||
string serverlist = mon->parameters.get_string(CN_SERVERS);
|
|
||||||
auto names = config_break_list_string(serverlist);
|
|
||||||
bool found = false;
|
|
||||||
for (auto iter = names.begin(); iter != names.end(); ++iter)
|
|
||||||
{
|
|
||||||
if (*iter == server->name())
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
names.erase(iter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found)
|
// Construct the new server list
|
||||||
|
auto params = mon->parameters;
|
||||||
|
auto names = config_break_list_string(params.get_string(CN_SERVERS));
|
||||||
|
names.erase(std::remove(names.begin(), names.end(), server->name()));
|
||||||
|
std::string servers = mxb::join(names, ",");
|
||||||
|
params.set(CN_SERVERS, servers);
|
||||||
|
|
||||||
|
if (MonitorManager::reconfigure_monitor(mon, params))
|
||||||
{
|
{
|
||||||
// Rebuild the string.
|
rval = MonitorManager::monitor_serialize(mon);
|
||||||
string new_list;
|
|
||||||
string separator;
|
|
||||||
for (auto name : names)
|
|
||||||
{
|
|
||||||
new_list += separator + name;
|
|
||||||
separator = ", ";
|
|
||||||
}
|
|
||||||
rval = runtime_alter_monitor(mon, CN_SERVERS, new_list.c_str());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,9 +302,10 @@ bool runtime_unlink_server(Server* server, const char* target)
|
|||||||
}
|
}
|
||||||
else if (monitor)
|
else if (monitor)
|
||||||
{
|
{
|
||||||
runtime_remove_server(monitor, server);
|
if ((rval = runtime_remove_server(monitor, server)))
|
||||||
MonitorManager::monitor_serialize(monitor);
|
{
|
||||||
rval = true;
|
MonitorManager::monitor_serialize(monitor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rval)
|
if (rval)
|
||||||
|
|||||||
Reference in New Issue
Block a user