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.
This commit is contained in:
Markus Makela
2015-11-16 10:38:55 +02:00
parent ab6dae897d
commit 40dc49c887
3 changed files with 45 additions and 24 deletions

View File

@ -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.
*
@ -321,27 +355,6 @@ filterApply(FILTER_DEF *filter, SESSION *session, DOWNSTREAM *downstream)
{
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];

View File

@ -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);
}

View File

@ -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 *);