From 41d26b5b73e410cb635691f62a82d7645ea99259 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Tue, 17 Nov 2015 06:06:56 +0200 Subject: [PATCH] Failure to load filters is now a configuration error When a filter module is not found or the instance creation fails, this is considered a fatal error and MaxScale will not start. If a failure occurs when the configuration is being reloaded, the service will not use filters and an error will be logged. --- server/core/config.c | 11 ++++- server/core/service.c | 96 ++++++++++++++++++++++++---------------- server/include/service.h | 2 +- 3 files changed, 69 insertions(+), 40 deletions(-) diff --git a/server/core/config.c b/server/core/config.c index 0596cd6bd..bbde33d69 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -1028,7 +1028,10 @@ process_config_context(CONFIG_CONTEXT *context) if (filters && obj->element) { - serviceSetFilters(obj->element, filters); + if (!serviceSetFilters(obj->element, filters)) + { + error_count++; + } } } else if (!strcmp(type, "listener")) @@ -2141,7 +2144,11 @@ process_config_update(CONFIG_CONTEXT *context) } if (filters && obj->element) { - serviceSetFilters(obj->element, filters); + if (!serviceSetFilters(obj->element, filters)) + { + MXS_ERROR("Failed to set service filters for '%s'. This " + "service will not use filters.", obj->object); + } } } else if (!strcmp(type, "listener")) diff --git a/server/core/service.c b/server/core/service.c index f97393cd0..89c5f21ec 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1069,49 +1069,71 @@ char *ptr; * * @param service The service itself * @param filters ASCII string of filters to use + * @return True if loading and creating all filters was successful. False if a + * filter module was not found or the instance creation failed. */ -void +bool serviceSetFilters(SERVICE *service, char *filters) { -FILTER_DEF **flist; -char *ptr, *brkt; -int n = 0; + FILTER_DEF **flist; + char *ptr, *brkt; + int n = 0; + bool rval = true; - if ((flist = (FILTER_DEF **)malloc(sizeof(FILTER_DEF *))) == NULL) - { - MXS_ERROR("Out of memory adding filters to service.\n"); - return; - } - ptr = strtok_r(filters, "|", &brkt); - while (ptr) - { - n++; - if ((flist = (FILTER_DEF **)realloc(flist, - (n + 1) * sizeof(FILTER_DEF *))) == NULL) - { - MXS_ERROR("Out of memory adding filters to service."); - return; - } - char *filter_name = trim(ptr); - if ((flist[n-1] = filter_find(filter_name)) == NULL) - { - MXS_WARNING("Unable to find filter '%s' for service '%s'\n", - filter_name, service->name); - n--; - } - else if (!filter_load(flist[n - 1])) - { - MXS_ERROR("Failed to load filter '%s' for service '%s'.", - filter_name, service->name); - n--; - } + if ((flist = (FILTER_DEF **) malloc(sizeof(FILTER_DEF *))) == NULL) + { + MXS_ERROR("Out of memory adding filters to service.\n"); + return false; + } + ptr = strtok_r(filters, "|", &brkt); + while (ptr) + { + n++; + FILTER_DEF **tmp; + if ((tmp = (FILTER_DEF **) realloc(flist, + (n + 1) * sizeof(FILTER_DEF *))) == NULL) + { + MXS_ERROR("Out of memory adding filters to service."); + rval = false; + break; + } - flist[n] = NULL; - ptr = strtok_r(NULL, "|", &brkt); - } + flist = tmp; + char *filter_name = trim(ptr); - service->filters = flist; - service->n_filters = n; + if ((flist[n - 1] = filter_find(filter_name))) + { + if (!filter_load(flist[n - 1])) + { + MXS_ERROR("Failed to load filter '%s' for service '%s'.", + filter_name, service->name); + rval = false; + break; + } + } + else + { + MXS_WARNING("Unable to find filter '%s' for service '%s'\n", + filter_name, service->name); + rval = false; + break; + } + + flist[n] = NULL; + ptr = strtok_r(NULL, "|", &brkt); + } + + if (rval) + { + service->filters = flist; + service->n_filters = n; + } + else + { + free(flist); + } + + return rval; } /** diff --git a/server/include/service.h b/server/include/service.h index da72a781a..c91270851 100644 --- a/server/include/service.h +++ b/server/include/service.h @@ -219,7 +219,7 @@ extern int serviceStop(SERVICE *); extern int serviceRestart(SERVICE *); extern int serviceSetUser(SERVICE *, char *, char *); extern int serviceGetUser(SERVICE *, char **, char **); -extern void serviceSetFilters(SERVICE *, char *); +extern bool serviceSetFilters(SERVICE *, char *); extern int serviceSetSSL(SERVICE *service, char* action); extern int serviceInitSSL(SERVICE* service); extern int serviceSetSSLVersion(SERVICE *service, char* version);