diff --git a/include/maxscale/server.h b/include/maxscale/server.h index c865fbf05..de46b9a4f 100644 --- a/include/maxscale/server.h +++ b/include/maxscale/server.h @@ -311,6 +311,15 @@ void server_add_parameter(SERVER *server, const char *name, const char *value); */ bool server_remove_parameter(SERVER *server, const char *name); +/** + * @brief Update server parameter + * + * @param server Server to update + * @param name Parameter to update + * @param value New value of parameter + */ +void server_update_parameter(SERVER *server, const char *name, const char *value); + /** * @brief Check if a server points to a local MaxScale service * diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index 54f726b09..b274165de 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -385,14 +385,14 @@ bool runtime_alter_server(SERVER *server, const char *key, const char *value) } else { - if (!server_remove_parameter(server, key) && !value[0]) + if (!value[0] && !server_remove_parameter(server, key)) { // Not a valid parameter } else if (value[0]) { valid = true; - server_add_parameter(server, key, value); + server_update_parameter(server, key, value); /** * It's likely that this parameter is used as a weighting parameter. diff --git a/server/core/server.cc b/server/core/server.cc index 4ec662ae5..1793b9234 100644 --- a/server/core/server.cc +++ b/server/core/server.cc @@ -848,6 +848,27 @@ server_update_credentials(SERVER *server, const char *user, const char *passwd) } } +static SERVER_PARAM* allocate_parameter(const char* name, const char* value) +{ + char *my_name = MXS_STRDUP(name); + char *my_value = MXS_STRDUP(value); + + SERVER_PARAM *param = (SERVER_PARAM *)MXS_MALLOC(sizeof(SERVER_PARAM)); + + if (!my_name || !my_value || !param) + { + MXS_FREE(my_name); + MXS_FREE(my_value); + MXS_FREE(param); + return NULL; + } + + param->active = true; + param->name = my_name; + param->value = my_value; + + return param; +} /** * Add a server parameter to a server. @@ -861,27 +882,15 @@ server_update_credentials(SERVER *server, const char *user, const char *passwd) */ void server_add_parameter(SERVER *server, const char *name, const char *value) { - char *my_name = MXS_STRDUP(name); - char *my_value = MXS_STRDUP(value); + SERVER_PARAM* param = allocate_parameter(name, value); - SERVER_PARAM *param = (SERVER_PARAM *)MXS_MALLOC(sizeof(SERVER_PARAM)); - - if (!my_name || !my_value || !param) + if (param) { - MXS_FREE(my_name); - MXS_FREE(my_value); - MXS_FREE(param); - return; + spinlock_acquire(&server->lock); + param->next = server->parameters; + server->parameters = param; + spinlock_release(&server->lock); } - - param->active = true; - param->name = my_name; - param->value = my_value; - - spinlock_acquire(&server->lock); - param->next = server->parameters; - server->parameters = param; - spinlock_release(&server->lock); } bool server_remove_parameter(SERVER *server, const char *name) @@ -903,6 +912,32 @@ bool server_remove_parameter(SERVER *server, const char *name) return rval; } +void server_update_parameter(SERVER *server, const char *name, const char *value) +{ + SERVER_PARAM* param = allocate_parameter(name, value); + + if (param) + { + spinlock_acquire(&server->lock); + + // Insert new value + param->next = server->parameters; + server->parameters = param; + + // Mark old value, if found, as inactive + for (SERVER_PARAM *p = server->parameters->next; p; p = p->next) + { + if (strcmp(p->name, name) == 0 && p->active) + { + p->active = false; + break; + } + } + + spinlock_release(&server->lock); + } +} + /** * Free a list of server parameters * @param tofree Parameter list to free