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:
@ -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];
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 *);
|
||||
|
Reference in New Issue
Block a user