diff --git a/include/maxscale/filter.h b/include/maxscale/filter.h index 1eabbe326..27a1ef8f6 100644 --- a/include/maxscale/filter.h +++ b/include/maxscale/filter.h @@ -83,6 +83,7 @@ typedef struct filter_object int (*clientReply)(FILTER *instance, void *fsession, GWBUF *queue); void (*diagnostics)(FILTER *instance, void *fsession, DCB *dcb); uint64_t (*getCapabilities)(void); + void (*destroyInstance)(FILTER *instance); } FILTER_OBJECT; /** diff --git a/server/core/service.c b/server/core/service.c index 785d03f40..6f2de2811 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1833,6 +1833,18 @@ void service_shutdown() { svc->router->destroyInstance(svc->router_instance); } + if (svc->n_filters) + { + FILTER_DEF **filters = svc->filters; + for (int i=0; i < svc->n_filters; i++) + { + if (filters[i]->obj->destroyInstance) + { + /* Call destroyInstance hook for filters */ + filters[i]->obj->destroyInstance(filters[i]->filter); + } + } + } svc = svc->next; } spinlock_release(&service_spin); diff --git a/server/modules/filter/cache/cache.c b/server/modules/filter/cache/cache.c index 8ddb27e8a..b7519fc3f 100644 --- a/server/modules/filter/cache/cache.c +++ b/server/modules/filter/cache/cache.c @@ -80,7 +80,8 @@ FILTER_OBJECT *GetModuleObject() routeQuery, clientReply, diagnostics, - getCapabilities + getCapabilities, + NULL, // destroyInstance }; return &object; diff --git a/server/modules/filter/ccrfilter/ccrfilter.c b/server/modules/filter/ccrfilter/ccrfilter.c index 3abda9137..157c750ed 100644 --- a/server/modules/filter/ccrfilter/ccrfilter.c +++ b/server/modules/filter/ccrfilter/ccrfilter.c @@ -75,9 +75,10 @@ static FILTER_OBJECT MyObject = setDownstream, NULL, // No Upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; #define CCR_DEFAULT_TIME 60 diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.c b/server/modules/filter/dbfwfilter/dbfwfilter.c index e2ebd86ff..b292286ff 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.c +++ b/server/modules/filter/dbfwfilter/dbfwfilter.c @@ -114,11 +114,12 @@ static FILTER_OBJECT MyObject = closeSession, freeSession, setDownstream, - NULL, + NULL, // No setUpStream routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/gatekeeper/gatekeeper.c b/server/modules/filter/gatekeeper/gatekeeper.c index 58e1d0fd2..57bb97848 100644 --- a/server/modules/filter/gatekeeper/gatekeeper.c +++ b/server/modules/filter/gatekeeper/gatekeeper.c @@ -103,9 +103,10 @@ static FILTER_OBJECT MyObject = setDownstream, NULL, // No upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/hintfilter/hintfilter.c b/server/modules/filter/hintfilter/hintfilter.c index b6a0e7dd3..fe35db089 100644 --- a/server/modules/filter/hintfilter/hintfilter.c +++ b/server/modules/filter/hintfilter/hintfilter.c @@ -52,9 +52,10 @@ static FILTER_OBJECT MyObject = setDownstream, NULL, // No upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/luafilter/luafilter.c b/server/modules/filter/luafilter/luafilter.c index dbfe5b2ae..f65542977 100644 --- a/server/modules/filter/luafilter/luafilter.c +++ b/server/modules/filter/luafilter/luafilter.c @@ -96,6 +96,7 @@ static FILTER_OBJECT MyObject = clientReply, diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/maxrows/maxrows.c b/server/modules/filter/maxrows/maxrows.c index 21ecda165..5c56b0c90 100644 --- a/server/modules/filter/maxrows/maxrows.c +++ b/server/modules/filter/maxrows/maxrows.c @@ -98,7 +98,8 @@ FILTER_OBJECT *GetModuleObject() routeQuery, clientReply, diagnostics, - getCapabilities + getCapabilities, + NULL, // No destroyInstance }; return &object; @@ -917,4 +918,3 @@ static int send_ok_upstream(MAXROWS_SESSION_DATA *csdata) return rv; } - diff --git a/server/modules/filter/mqfilter/mqfilter.c b/server/modules/filter/mqfilter/mqfilter.c index 263626c1b..f9b29d4d0 100644 --- a/server/modules/filter/mqfilter/mqfilter.c +++ b/server/modules/filter/mqfilter/mqfilter.c @@ -116,6 +116,7 @@ static FILTER_OBJECT MyObject = clientReply, diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/namedserverfilter/namedserverfilter.c b/server/modules/filter/namedserverfilter/namedserverfilter.c index 788a560d7..e31ae7632 100644 --- a/server/modules/filter/namedserverfilter/namedserverfilter.c +++ b/server/modules/filter/namedserverfilter/namedserverfilter.c @@ -69,9 +69,10 @@ static FILTER_OBJECT MyObject = setDownstream, NULL, // No Upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/qlafilter/qlafilter.c b/server/modules/filter/qlafilter/qlafilter.c index 420e63328..b05d6149f 100644 --- a/server/modules/filter/qlafilter/qlafilter.c +++ b/server/modules/filter/qlafilter/qlafilter.c @@ -87,6 +87,7 @@ static FILTER_OBJECT MyObject = NULL, // No client reply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/regexfilter/regexfilter.c b/server/modules/filter/regexfilter/regexfilter.c index 21100fa55..8382ca497 100644 --- a/server/modules/filter/regexfilter/regexfilter.c +++ b/server/modules/filter/regexfilter/regexfilter.c @@ -71,9 +71,10 @@ static FILTER_OBJECT MyObject = setDownstream, NULL, // No Upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/tee/tee.c b/server/modules/filter/tee/tee.c index c3dd9db19..d979f2e47 100644 --- a/server/modules/filter/tee/tee.c +++ b/server/modules/filter/tee/tee.c @@ -130,6 +130,7 @@ static FILTER_OBJECT MyObject = clientReply, diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/testfilter/testfilter.c b/server/modules/filter/testfilter/testfilter.c index 5c3cb7739..fb9a451cb 100644 --- a/server/modules/filter/testfilter/testfilter.c +++ b/server/modules/filter/testfilter/testfilter.c @@ -37,7 +37,7 @@ MODULE_INFO info = "A simple query counting filter" }; -static char *version_str = "V1.0.0"; +static char *version_str = "V2.0.0"; static FILTER *createInstance(const char *name, char **options, FILTER_PARAMETER **params); static void *newSession(FILTER *instance, SESSION *session); @@ -47,6 +47,7 @@ static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *down static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); static uint64_t getCapabilities(void); +static void destroyInstance(FILTER *instance); static FILTER_OBJECT MyObject = @@ -56,11 +57,12 @@ static FILTER_OBJECT MyObject = closeSession, freeSession, setDownstream, - NULL, // No upstream requirement + NULL, // No upstream requirement routeQuery, - NULL, + NULL, // No clientReply diagnostic, getCapabilities, + destroyInstance, }; /** @@ -68,7 +70,8 @@ static FILTER_OBJECT MyObject = */ typedef struct { - int sessions; + const char *name; + int sessions; } TEST_INSTANCE; /** @@ -135,6 +138,7 @@ createInstance(const char *name, char **options, FILTER_PARAMETER **params) if ((my_instance = MXS_CALLOC(1, sizeof(TEST_INSTANCE))) != NULL) { my_instance->sessions = 0; + my_instance->name = name; } return (FILTER *)my_instance; } @@ -258,3 +262,15 @@ static uint64_t getCapabilities(void) { return RCAP_TYPE_NONE; } + +/** + * destroyInstance routine. + * + * @param The filter instance. + */ +static void destroyInstance(FILTER *instance) +{ + TEST_INSTANCE *cinstance = (TEST_INSTANCE *)instance; + + MXS_INFO("Destroying filter %s", cinstance->name); +} diff --git a/server/modules/filter/topfilter/topfilter.c b/server/modules/filter/topfilter/topfilter.c index 9b5d38e4f..a423d2a19 100644 --- a/server/modules/filter/topfilter/topfilter.c +++ b/server/modules/filter/topfilter/topfilter.c @@ -82,6 +82,7 @@ static FILTER_OBJECT MyObject = clientReply, diagnostic, getCapabilities, + NULL, // No destroyInstance }; /** diff --git a/server/modules/filter/tpmfilter/tpmfilter.c b/server/modules/filter/tpmfilter/tpmfilter.c index da2c42811..0dd59002f 100644 --- a/server/modules/filter/tpmfilter/tpmfilter.c +++ b/server/modules/filter/tpmfilter/tpmfilter.c @@ -95,6 +95,7 @@ static FILTER_OBJECT MyObject = clientReply, diagnostic, getCapabilities, + NULL, // No destroyInstance }; /**