MXS-304: Support hierarchical reload

'reload config' now also processes all configuration files
of a hierarchy.
This commit is contained in:
Johan Wikman
2016-10-31 12:39:30 +02:00
parent 60f0c2ecaa
commit 8c20ad5cd0
2 changed files with 56 additions and 54 deletions

View File

@ -153,7 +153,7 @@ bool config_load(const char *);
unsigned int config_nbpolls(); unsigned int config_nbpolls();
double config_percentage_value(const char *str); double config_percentage_value(const char *str);
unsigned int config_pollsleep(); unsigned int config_pollsleep();
int config_reload(); bool config_reload();
bool config_set_qualified_param(CONFIG_PARAMETER* param, bool config_set_qualified_param(CONFIG_PARAMETER* param,
void* val, void* val,
config_param_type_t type); config_param_type_t type);

View File

@ -77,8 +77,8 @@ static bool duplicate_context_init(DUPLICATE_CONTEXT* context);
static void duplicate_context_finish(DUPLICATE_CONTEXT* context); static void duplicate_context_finish(DUPLICATE_CONTEXT* context);
extern int setipaddress(struct in_addr *, char *); extern int setipaddress(struct in_addr *, char *);
static bool process_config_context(CONFIG_CONTEXT *); static bool process_config_context(CONFIG_CONTEXT *);
static int process_config_update(CONFIG_CONTEXT *); static bool process_config_update(CONFIG_CONTEXT *);
static void free_config_context(CONFIG_CONTEXT *); static void free_config_context(CONFIG_CONTEXT *);
static char *config_get_value(CONFIG_PARAMETER *, const char *); static char *config_get_value(CONFIG_PARAMETER *, const char *);
static char *config_get_password(CONFIG_PARAMETER *); static char *config_get_password(CONFIG_PARAMETER *);
@ -541,26 +541,22 @@ static bool config_load_dir(const char *dir, DUPLICATE_CONTEXT *dcontext, CONFIG
} }
/** /**
* @brief Load the configuration file for the MaxScale * @brief Load the specified configuration file for MaxScale
* *
* This function will parse the configuration file, check for duplicate sections, * This function will parse the configuration file, check for duplicate sections,
* validate the module parameters and finally turn it into a set of objects. * validate the module parameters and finally turn it into a set of objects.
* *
* @param filename The filename of the configuration file * @param filename The filename of the configuration file
* @param process_config The function using which the successfully loaded
* configuration should be processed.
*
* @return True on success, false on fatal error * @return True on success, false on fatal error
*/ */
bool static bool
config_load(const char *filename) config_load_and_process(const char* filename, bool (*process_config)(CONFIG_CONTEXT*))
{ {
bool rval = false; bool rval = false;
/* Temporary - should use configuration values and test return value (bool) */
dcb_pre_alloc(1000);
session_pre_alloc(250);
global_defaults();
feedback_defaults();
DUPLICATE_CONTEXT dcontext; DUPLICATE_CONTEXT dcontext;
if (duplicate_context_init(&dcontext)) if (duplicate_context_init(&dcontext))
@ -605,9 +601,8 @@ config_load(const char *filename)
if (rval) if (rval)
{ {
if (check_config_objects(ccontext.next) && process_config_context(ccontext.next)) if (check_config_objects(ccontext.next) && process_config(ccontext.next))
{ {
config_file = filename;
rval = true; rval = true;
} }
} }
@ -620,55 +615,62 @@ config_load(const char *filename)
return rval; return rval;
} }
/**
* @brief Load the configuration file for the MaxScale
*
* @param filename The filename of the configuration file
* @return True on success, false on fatal error
*/
bool
config_load(const char *filename)
{
ss_dassert(!config_file);
/* Temporary - should use configuration values and test return value (bool) */
dcb_pre_alloc(1000);
session_pre_alloc(250);
global_defaults();
feedback_defaults();
bool rval = config_load_and_process(filename, process_config_context);
if (rval)
{
config_file = filename;
}
return rval;
}
/** /**
* Reload the configuration file for the MaxScale * Reload the configuration file for the MaxScale
* *
* @return A zero return indicates a fatal error reading the configuration * @return True on success, false on fatal error.
*/ */
int bool
config_reload() config_reload()
{ {
int rval = 0; bool rval = false;
if (config_file) if (config_file)
{ {
return 0; if (gateway.version_string)
{
MXS_FREE(gateway.version_string);
}
global_defaults();
feedback_defaults();
rval = config_load_and_process(config_file, process_config_update);
} }
else
DUPLICATE_CONTEXT dcontext;
if (!duplicate_context_init(&dcontext))
{ {
return 0; MXS_ERROR("config_reload() called without the configuration having "
"been loaded first.");
} }
bool duplicates = config_has_duplicate_sections(config_file, &dcontext);
duplicate_context_finish(&dcontext);
if (duplicates)
{
return 0;
}
if (gateway.version_string)
{
MXS_FREE(gateway.version_string);
}
global_defaults();
CONFIG_CONTEXT config;
config.object = "";
config.next = NULL;
if (ini_parse(config_file, ini_handler, &config) < 0)
{
return 0;
}
rval = process_config_update(config.next);
free_config_context(config.next);
return rval; return rval;
} }
@ -1574,7 +1576,7 @@ feedback_defaults()
* *
* @param context The configuration data * @param context The configuration data
*/ */
static int static bool
process_config_update(CONFIG_CONTEXT *context) process_config_update(CONFIG_CONTEXT *context)
{ {
CONFIG_CONTEXT *obj; CONFIG_CONTEXT *obj;
@ -1816,7 +1818,7 @@ process_config_update(CONFIG_CONTEXT *context)
obj = obj->next; obj = obj->next;
} }
return 1; return true;
} }
/** /**