Fix monitor creation

When the monitor was created, no parameters were passed to it.
This commit is contained in:
Markus Mäkelä 2019-03-20 18:17:08 +02:00
parent 0f1bc60431
commit c2fc80f122
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
3 changed files with 35 additions and 18 deletions

View File

@ -1219,7 +1219,7 @@ bool runtime_destroy_listener(Service* service, const char* name)
return rval;
}
bool runtime_create_monitor(const char* name, const char* module)
bool runtime_create_monitor(const char* name, const char* module, MXS_CONFIG_PARAMETER* params)
{
std::lock_guard<std::mutex> guard(crt_lock);
bool rval = false;
@ -1235,13 +1235,18 @@ bool runtime_create_monitor(const char* name, const char* module)
}
else if (config_is_valid_name(name, &reason))
{
MXS_CONFIG_PARAMETER params;
MXS_CONFIG_PARAMETER final_params;
bool ok;
tie(ok, params) = load_defaults(module, MODULE_MONITOR, CN_MONITOR);
tie(ok, final_params) = load_defaults(module, MODULE_MONITOR, CN_MONITOR);
if (ok)
{
if ((monitor = MonitorManager::create_monitor(name, module, &params)) == NULL)
if (params)
{
final_params.set_multiple(*params);
}
if ((monitor = MonitorManager::create_monitor(name, module, &final_params)) == NULL)
{
config_runtime_error("Could not create monitor '%s' with module '%s'", name, module);
}
@ -2254,6 +2259,24 @@ static bool validate_monitor_json(json_t* json)
return rval;
}
MXS_CONFIG_PARAMETER extract_parameters(json_t* json)
{
MXS_CONFIG_PARAMETER params;
if (json_t* parameters = mxs_json_pointer(json, MXS_JSON_PTR_PARAMETERS))
{
const char* key;
json_t* value;
json_object_foreach(parameters, key, value)
{
params.set(key, mxs::json_to_string(value));
}
}
return params;
}
Monitor* runtime_create_monitor_from_json(json_t* json)
{
Monitor* rval = NULL;
@ -2263,21 +2286,13 @@ Monitor* runtime_create_monitor_from_json(json_t* json)
{
const char* name = json_string_value(mxs_json_pointer(json, MXS_JSON_PTR_ID));
const char* module = json_string_value(mxs_json_pointer(json, MXS_JSON_PTR_MODULE));
auto params = extract_parameters(json);
if (runtime_create_monitor(name, module))
if (runtime_create_monitor(name, module, &params))
{
rval = MonitorManager::find_monitor(name);
mxb_assert(rval);
if (!runtime_alter_monitor_from_json(rval, json))
{
runtime_destroy_monitor(rval);
rval = NULL;
}
else
{
MonitorManager::start_monitor(rval);
}
MonitorManager::start_monitor(rval);
}
}

View File

@ -217,11 +217,13 @@ bool runtime_destroy_listener(Service* service, const char* name);
/**
* @brief Create a new monitor
*
* @param name Name of the monitor
* @param name Name of the monitor
* @param module Monitor module
* @param params Parameters for the monitor
*
* @return True if new monitor was created and persisted
*/
bool runtime_create_monitor(const char* name, const char* module);
bool runtime_create_monitor(const char* name, const char* module, MXS_CONFIG_PARAMETER* params);
/**
* @brief Create a new filter

View File

@ -1299,7 +1299,7 @@ static void createMonitor(DCB* dcb, const char* name, const char* module)
{
dcb_printf(dcb, "Monitor '%s' already exists\n", name);
}
else if (runtime_create_monitor(name, module))
else if (runtime_create_monitor(name, module, nullptr))
{
dcb_printf(dcb, "Created monitor '%s'\n", name);
}