Allow module specific monitor parameters to be altered
Module specific parameters can now be altered at runtime. This allows both the removal and addition of arbitrary monitor parameters.
This commit is contained in:
@ -1070,7 +1070,7 @@ return_p2:
|
||||
* Free a configuration parameter
|
||||
* @param p1 Parameter to free
|
||||
*/
|
||||
void free_config_parameter(CONFIG_PARAMETER* p1)
|
||||
void config_parameter_free(CONFIG_PARAMETER* p1)
|
||||
{
|
||||
while (p1)
|
||||
{
|
||||
@ -1089,7 +1089,7 @@ void config_context_free(CONFIG_CONTEXT *context)
|
||||
while (context)
|
||||
{
|
||||
obj = context->next;
|
||||
free_config_parameter(context->parameters);
|
||||
config_parameter_free(context->parameters);
|
||||
MXS_FREE(context->object);
|
||||
MXS_FREE(context);
|
||||
context = obj;
|
||||
|
@ -361,8 +361,27 @@ bool runtime_alter_monitor(MONITOR *monitor, char *key, char *value)
|
||||
monitorSetNetworkTimeout(monitor, MONITOR_READ_TIMEOUT, ival);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/** We're modifying module specific parameters and we need to stop the monitor */
|
||||
monitorStop(monitor);
|
||||
|
||||
if (valid)
|
||||
if (monitorRemoveParameter(monitor, key) || value[0])
|
||||
{
|
||||
/** Either we're removing an existing parameter or adding a new one */
|
||||
valid = true;
|
||||
|
||||
if (value[0])
|
||||
{
|
||||
CONFIG_PARAMETER p = {.name = key, .value = value};
|
||||
monitorAddParameters(monitor, &p);
|
||||
}
|
||||
}
|
||||
|
||||
monitorStart(monitor, monitor->parameters);
|
||||
}
|
||||
|
||||
if (valid && monitor->created_online)
|
||||
{
|
||||
monitor_serialize(monitor);
|
||||
}
|
||||
@ -497,9 +516,15 @@ bool runtime_create_monitor(const char *name, const char *module)
|
||||
bool rval = false;
|
||||
MONITOR *monitor = monitor_alloc((char*)name, (char*)module);
|
||||
|
||||
if (monitor && monitor_serialize(monitor))
|
||||
if (monitor)
|
||||
{
|
||||
rval = true;
|
||||
/** Mark that this monitor was created after MaxScale was started */
|
||||
monitor->created_online = true;
|
||||
|
||||
if (monitor_serialize(monitor))
|
||||
{
|
||||
rval = true;
|
||||
}
|
||||
}
|
||||
|
||||
spinlock_release(&crt_lock);
|
||||
|
@ -104,6 +104,7 @@ monitor_alloc(char *name, char *module)
|
||||
mon->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
|
||||
mon->interval = MONITOR_INTERVAL;
|
||||
mon->parameters = NULL;
|
||||
mon->created_online = false;
|
||||
spinlock_init(&mon->lock);
|
||||
spinlock_acquire(&monLock);
|
||||
mon->next = allMonitors;
|
||||
@ -144,7 +145,7 @@ monitor_free(MONITOR *mon)
|
||||
}
|
||||
}
|
||||
spinlock_release(&monLock);
|
||||
free_config_parameter(mon->parameters);
|
||||
config_parameter_free(mon->parameters);
|
||||
monitor_server_free_all(mon->databases);
|
||||
MXS_FREE(mon->name);
|
||||
MXS_FREE(mon->module_name);
|
||||
@ -767,6 +768,32 @@ void monitorAddParameters(MONITOR *monitor, CONFIG_PARAMETER *params)
|
||||
}
|
||||
}
|
||||
|
||||
bool monitorRemoveParameter(MONITOR *monitor, const char *key)
|
||||
{
|
||||
CONFIG_PARAMETER *prev = NULL;
|
||||
|
||||
for (CONFIG_PARAMETER *p = monitor->parameters; p; p = p->next)
|
||||
{
|
||||
if (strcmp(p->name, key) == 0)
|
||||
{
|
||||
if (p == monitor->parameters)
|
||||
{
|
||||
monitor->parameters = monitor->parameters->next;
|
||||
p->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
prev->next = p->next;
|
||||
p->next = NULL;
|
||||
}
|
||||
config_parameter_free(p);
|
||||
return true;
|
||||
}
|
||||
prev = p;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a pending status bit in the monitor server
|
||||
*
|
||||
|
@ -665,7 +665,7 @@ void service_free(SERVICE *service)
|
||||
MXS_FREE(service->credentials.name);
|
||||
MXS_FREE(service->credentials.authdata);
|
||||
|
||||
free_config_parameter(service->svc_config_param);
|
||||
config_parameter_free(service->svc_config_param);
|
||||
serviceClearRouterOptions(service);
|
||||
|
||||
MXS_FREE(service);
|
||||
|
@ -1290,6 +1290,13 @@ static void alterMonitor(DCB *dcb, MONITOR *monitor, char *v1, char *v2, char *v
|
||||
{
|
||||
dcb_printf(dcb, "Error: Bad key-value parameter: %s=%s\n", key, value);
|
||||
}
|
||||
else if (!monitor->created_online)
|
||||
{
|
||||
dcb_printf(dcb, "Warning: Altered monitor '%s' which is in the "
|
||||
"main\nconfiguration file. These changes will not be "
|
||||
"persisted and need\nto be manually added or set again"
|
||||
"after a restart.\n", monitor->name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1316,9 +1323,8 @@ struct subcommand alteroptions[] =
|
||||
"monitor", 2, 12, alterMonitor,
|
||||
"Alter monitor parameters",
|
||||
"Usage: alter monitor NAME KEY=VALUE ...\n"
|
||||
"This will alter an existing parameter of a monitor. The accepted values\n"
|
||||
"for KEY are: 'user', 'password', 'monitor_interval',\n"
|
||||
"'backend_connect_timeout', 'backend_write_timeout', 'backend_read_timeout'\n"
|
||||
"This will alter an existing parameter of a monitor. To remove parameters,\n"
|
||||
"pass an empty value for a key e.g. 'maxadmin alter monitor my-monitor my-key='\n"
|
||||
"A maximum of 11 parameters can be changed at one time",
|
||||
{ARG_TYPE_MONITOR, ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING,
|
||||
ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING, ARG_TYPE_STRING,
|
||||
|
Reference in New Issue
Block a user