diff --git a/include/maxscale/config.h b/include/maxscale/config.h index 00477f96b..855019036 100644 --- a/include/maxscale/config.h +++ b/include/maxscale/config.h @@ -102,6 +102,7 @@ typedef struct config_context char *object; /**< The name of the object being configured */ CONFIG_PARAMETER *parameters; /**< The list of parameter values */ void *element; /**< The element created from the data */ + bool was_persisted; /**< True if this object was persisted */ struct config_context *next; /**< Next pointer in the linked list */ } CONFIG_CONTEXT; diff --git a/server/core/config.c b/server/core/config.c index 2484c5878..9db93bbcc 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -106,7 +106,7 @@ static const char *config_file = NULL; static GATEWAY_CONF gateway; static FEEDBACK_CONF feedback; char *version_string = NULL; - +static bool is_persisted_config = false; /**< True if a persisted configuration file is being parsed */ static char *service_params[] = { @@ -330,6 +330,7 @@ CONFIG_CONTEXT* config_context_create(const char *section) if (ctx) { ctx->object = MXS_STRDUP_A(section); + ctx->was_persisted = is_persisted_config; ctx->parameters = NULL; ctx->next = NULL; ctx->element = NULL; @@ -649,6 +650,15 @@ config_load_and_process(const char* filename, bool (*process_config)(CONFIG_CONT if (is_directory(persist_cnf) && contains_cnf_files(persist_cnf)) { + /** + * Set the global flag that we are processing a persisted configuration. + * This will tell the modules whether it is OK to completely overwrite + * the persisted configuration when changes are made. + * + * TODO: Figure out a cleaner way to do this + */ + is_persisted_config = true; + MXS_NOTICE("Loading generated configuration files from '%s'", persist_cnf); DUPLICATE_CONTEXT p_dcontext; /** @@ -667,6 +677,7 @@ config_load_and_process(const char* filename, bool (*process_config)(CONFIG_CONT { rval = false; } + is_persisted_config = false; } if (rval) @@ -2966,6 +2977,13 @@ int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* MXS_ERROR("Failed to create monitor '%s'.", obj->object); error_count++; } + + if (obj->was_persisted) + { + /** Not the cleanest way of figuring out whether the configuration + * was stored but it should be OK for now */ + ((MONITOR*)obj->element)->created_online = true; + } } else {