From 40dc49c8873241edc5da633c15c6880079d9877c Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Mon, 16 Nov 2015 10:38:55 +0200 Subject: [PATCH] Filters are now loaded and created at startup Previously filter instances were created when the first session was made. This caused filter configuration errors to be noticed only after MaxScale was successfully started. Now filters are loaded and the instance is created when a service applies its filters. --- server/core/filter.c | 57 +++++++++++++++++++++++++---------------- server/core/service.c | 11 ++++++-- server/include/filter.h | 1 + 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/server/core/filter.c b/server/core/filter.c index aef124331..837e204c9 100644 --- a/server/core/filter.c +++ b/server/core/filter.c @@ -304,6 +304,40 @@ int i; spinlock_release(&filter->spin); } +/** + * Load a filter module for use and create an instance of it for a service. + * @param filter Filter definition + * @return True if module was successfully loaded, false if an error occurred + */ +bool filter_load(FILTER_DEF* filter) +{ + bool rval = false; + if (filter) + { + if (filter->obj == NULL) + { + /* Filter not yet loaded */ + if ((filter->obj = load_module(filter->module, MODULE_FILTER)) == NULL) + { + MXS_ERROR("Failed to load filter module '%s'.", filter->module); + return false; + } + } + + if ((filter->filter = (filter->obj->createInstance)(filter->options, + filter->parameters))) + { + rval = true; + } + else + { + MXS_ERROR("Failed to create filter '%s' instance.", filter->name); + } + + } + return rval; +} + /** * Connect the downstream filter chain for a filter. * @@ -319,29 +353,8 @@ int i; DOWNSTREAM * filterApply(FILTER_DEF *filter, SESSION *session, DOWNSTREAM *downstream) { -DOWNSTREAM *me; + DOWNSTREAM *me; - if (filter == NULL) - return NULL; - - if (filter->obj == NULL) - { - /* Filter not yet loaded */ - if ((filter->obj = load_module(filter->module, - MODULE_FILTER)) == NULL) - { - return NULL; - } - } - - if (filter->filter == NULL) - { - if ((filter->filter = (filter->obj->createInstance)(filter->options, - filter->parameters)) == NULL) - { - return NULL; - } - } if ((me = (DOWNSTREAM *)calloc(1, sizeof(DOWNSTREAM))) == NULL) { char errbuf[STRERROR_BUFLEN]; diff --git a/server/core/service.c b/server/core/service.c index e22484c99..4f2453a90 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1092,12 +1092,19 @@ int n = 0; MXS_ERROR("Out of memory adding filters to service."); return; } - if ((flist[n-1] = filter_find(trim(ptr))) == NULL) + 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", - trim(ptr), service->name); + 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); + } + flist[n] = NULL; ptr = strtok_r(NULL, "|", &brkt); } diff --git a/server/include/filter.h b/server/include/filter.h index ad0b9a21a..853e1628c 100644 --- a/server/include/filter.h +++ b/server/include/filter.h @@ -107,6 +107,7 @@ typedef struct filter_def { FILTER_DEF *filter_alloc(char *, char *); void filter_free(FILTER_DEF *); +bool filter_load(FILTER_DEF* filter); FILTER_DEF *filter_find(char *); void filterAddOption(FILTER_DEF *, char *); void filterAddParameter(FILTER_DEF *, char *, char *);