From 59a4152d8acf0c373ff56ffab901911110cdd6fa Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Fri, 21 Oct 2016 14:14:50 +0300 Subject: [PATCH] Add getCapabilities to filters Common capabilities are now defined in routing.h. The common capabilities can be defined using bits 0 - 15. Router capabilities are defined using bits 16-31 and filter capabilities (should there ever be such) using bits 32-47. So, to find out the capabilities of a service you only need to OR the capabilities of the router and all filters together. For instance, if a single filter needs statement based routing, then that is what is done. --- include/maxscale/filter.h | 20 +++++++++- include/maxscale/router.h | 18 ++++++--- include/maxscale/routing.h | 38 +++++++++++++++++++ server/modules/filter/cache/cache.c | 13 +++++++ server/modules/filter/ccrfilter/ccrfilter.c | 12 ++++++ server/modules/filter/dbfwfilter/dbfwfilter.c | 12 ++++++ server/modules/filter/gatekeeper/gatekeeper.c | 13 +++++++ server/modules/filter/hintfilter/hintfilter.c | 12 ++++++ server/modules/filter/luafilter/luafilter.c | 12 ++++++ server/modules/filter/mqfilter/mqfilter.c | 12 ++++++ .../namedserverfilter/namedserverfilter.c | 12 ++++++ server/modules/filter/qlafilter/qlafilter.c | 12 ++++++ .../modules/filter/regexfilter/regexfilter.c | 12 ++++++ server/modules/filter/tee/tee.c | 12 ++++++ server/modules/filter/testfilter/testfilter.c | 12 ++++++ server/modules/filter/topfilter/topfilter.c | 12 ++++++ server/modules/filter/tpmfilter/tpmfilter.c | 12 ++++++ .../routing/readconnroute/readconnroute.c | 2 +- 18 files changed, 240 insertions(+), 8 deletions(-) create mode 100644 include/maxscale/routing.h diff --git a/include/maxscale/filter.h b/include/maxscale/filter.h index 780ed06f2..995901a0a 100644 --- a/include/maxscale/filter.h +++ b/include/maxscale/filter.h @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -83,6 +84,7 @@ typedef struct filter_object int (*routeQuery)(FILTER *instance, void *fsession, GWBUF *queue); int (*clientReply)(FILTER *instance, void *fsession, GWBUF *queue); void (*diagnostics)(FILTER *instance, void *fsession, DCB *dcb); + uint64_t (*getCapabilities)(); } FILTER_OBJECT; /** @@ -90,7 +92,7 @@ typedef struct filter_object * is changed these values must be updated in line with the rules in the * file modinfo.h. */ -#define FILTER_VERSION {2, 1, 0} +#define FILTER_VERSION {2, 2, 0} /** * The definition of a filter from the configuration file. * This is basically the link between a plugin to load and the @@ -121,6 +123,22 @@ void dprintAllFilters(DCB *); void dprintFilter(DCB *, FILTER_DEF *); void dListFilters(DCB *); +/** + * Specifies capabilities specific for filters. Common capabilities + * are defined by @c routing_capability_t. + * + * @see routing_capability_t + * + * @note The values of the capabilities here *must* be between 0x000100000000 + * and 0x800000000000, that is, bits 32 to 47. + */ + +/* +typedef enum filter_capability +{ +} filter_capability_t; +*/ + MXS_END_DECLS #endif diff --git a/include/maxscale/router.h b/include/maxscale/router.h index 40b27038a..28ed196fe 100644 --- a/include/maxscale/router.h +++ b/include/maxscale/router.h @@ -30,6 +30,7 @@ */ #include +#include #include #include #include @@ -93,14 +94,19 @@ typedef struct router_object #define ROUTER_VERSION { 2, 0, 0 } /** - * Router capability type. Indicates what kind of input router accepts. + * Specifies capabilities specific for routers. Common capabilities + * are defined by @c routing_capability_t. + * + * @see routing_capability_t + * + * @note The values of the capabilities here *must* be between 0x00010000 + * and 0x80000000, that is, bits 16 to 31. */ -typedef enum router_capability_t +typedef enum router_capability { - RCAP_TYPE_UNDEFINED = 0x00, - RCAP_TYPE_STMT_INPUT = 0x01, /**< Statement per buffer */ - RCAP_TYPE_PACKET_INPUT = 0x02, /**< Data as it was read from DCB */ - RCAP_TYPE_NO_RSESSION = 0x04 /**< Router does not use router sessions */ + RCAP_TYPE_NO_RSESSION = 0x00010000, /**< Router does not use router sessions */ + RCAP_TYPE_NO_USERS_INIT = 0x00020000, /**< Prevent the loading of authenticator + users when the service is started */ } router_capability_t; MXS_END_DECLS diff --git a/include/maxscale/routing.h b/include/maxscale/routing.h new file mode 100644 index 000000000..447d1146d --- /dev/null +++ b/include/maxscale/routing.h @@ -0,0 +1,38 @@ +#pragma once +/* + * Copyright (c) 2016 MariaDB Corporation Ab + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file and at www.mariadb.com/bsl. + * + * Change Date: 2019-07-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2 or later of the General + * Public License. + */ + +/** + * @file routing.h - Common definitions and declarations for routers and filters. + */ + +#include + +MXS_BEGIN_DECLS + +/** + * Routing capability type. Indicates what kind of input a router or + * a filter accepts. + * + * @note The values of the capabilities here *must* be between 0x0000 + * and 0x8000, that is, bits 0 to 15. + */ +typedef enum routing_capability +{ + RCAP_TYPE_STMT_INPUT = 0x0001, /**< Statement per buffer. */ +} routing_capability_t; + +#define RCAP_TYPE_NONE 0 + +MXS_END_DECLS + diff --git a/server/modules/filter/cache/cache.c b/server/modules/filter/cache/cache.c index 15e9aa9dc..9342a57f0 100644 --- a/server/modules/filter/cache/cache.c +++ b/server/modules/filter/cache/cache.c @@ -35,6 +35,7 @@ static void setUpstream(FILTER *instance, void *sdata, UPSTREAM *upstream); static int routeQuery(FILTER *instance, void *sdata, GWBUF *queue); static int clientReply(FILTER *instance, void *sdata, GWBUF *queue); static void diagnostics(FILTER *instance, void *sdata, DCB *dcb); +static uint64_t getCapabilities(); #define C_DEBUG(format, ...) MXS_LOG_MESSAGE(LOG_NOTICE, format, ##__VA_ARGS__) @@ -81,6 +82,7 @@ FILTER_OBJECT *GetModuleObject() routeQuery, clientReply, diagnostics, + getCapabilities }; return &object; @@ -550,6 +552,17 @@ static void diagnostics(FILTER *instance, void *sdata, DCB *dcb) dcb_printf(dcb, "Hello World from Cache!\n"); } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} + // // API END // diff --git a/server/modules/filter/ccrfilter/ccrfilter.c b/server/modules/filter/ccrfilter/ccrfilter.c index f9fe4f796..a144f2295 100644 --- a/server/modules/filter/ccrfilter/ccrfilter.c +++ b/server/modules/filter/ccrfilter/ccrfilter.c @@ -63,6 +63,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -76,6 +77,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; #define CCR_DEFAULT_TIME 60 @@ -412,3 +414,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) dcb_printf(dcb, "\tNo. of hints added based on count: %d\n", my_instance->stats.n_add_count); dcb_printf(dcb, "\tNo. of hints added based on time: %d\n", my_instance->stats.n_add_time); } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.c b/server/modules/filter/dbfwfilter/dbfwfilter.c index cebe94df1..66ad835ed 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.c +++ b/server/modules/filter/dbfwfilter/dbfwfilter.c @@ -105,6 +105,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = { @@ -117,6 +118,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -2328,6 +2330,16 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) } } +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} + #ifdef BUILD_RULE_PARSER // TODO: Not ok to include file from other component's test directory. #include "../../../core/test/test_utils.h" diff --git a/server/modules/filter/gatekeeper/gatekeeper.c b/server/modules/filter/gatekeeper/gatekeeper.c index e794c9a3b..d49153df0 100644 --- a/server/modules/filter/gatekeeper/gatekeeper.c +++ b/server/modules/filter/gatekeeper/gatekeeper.c @@ -89,6 +89,8 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); + static bool read_stored_data(GK_INSTANCE *inst); static bool write_stored_data(GK_INSTANCE *inst); @@ -103,6 +105,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -422,6 +425,16 @@ static void diagnostic(FILTER *instance, void *fsession, DCB *dcb) dcb_printf(dcb, "\t\tQueryhash misses: %u\n", inst->stats.miss); } +/** + * @brief Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} + /** * @brief Write query patterns from memory to disk * diff --git a/server/modules/filter/hintfilter/hintfilter.c b/server/modules/filter/hintfilter/hintfilter.c index c7efaabaa..7d0bfc258 100644 --- a/server/modules/filter/hintfilter/hintfilter.c +++ b/server/modules/filter/hintfilter/hintfilter.c @@ -40,6 +40,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -53,6 +54,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -278,3 +280,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) HINT_SESSION *my_session = (HINT_SESSION *)fsession; } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/luafilter/luafilter.c b/server/modules/filter/luafilter/luafilter.c index 5da797e47..fc523519d 100644 --- a/server/modules/filter/luafilter/luafilter.c +++ b/server/modules/filter/luafilter/luafilter.c @@ -81,6 +81,7 @@ static void setUpstream(FILTER *instance, void *fsession, UPSTREAM *upstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static int clientReply(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -94,6 +95,7 @@ static FILTER_OBJECT MyObject = routeQuery, clientReply, diagnostic, + getCapabilities, }; /** @@ -589,3 +591,13 @@ static void diagnostic(FILTER *instance, void *fsession, DCB *dcb) } } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/mqfilter/mqfilter.c b/server/modules/filter/mqfilter/mqfilter.c index 3642eb3f3..d4279ca79 100644 --- a/server/modules/filter/mqfilter/mqfilter.c +++ b/server/modules/filter/mqfilter/mqfilter.c @@ -101,6 +101,7 @@ static void setUpstream(FILTER *instance, void *fsession, UPSTREAM *upstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static int clientReply(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -114,6 +115,7 @@ static FILTER_OBJECT MyObject = routeQuery, clientReply, diagnostic, + getCapabilities, }; /** @@ -1703,3 +1705,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) my_instance->stats.n_sent); } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/namedserverfilter/namedserverfilter.c b/server/modules/filter/namedserverfilter/namedserverfilter.c index c30315a7f..246ebb7db 100644 --- a/server/modules/filter/namedserverfilter/namedserverfilter.c +++ b/server/modules/filter/namedserverfilter/namedserverfilter.c @@ -57,6 +57,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -70,6 +71,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -410,3 +412,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) my_instance->user); } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/qlafilter/qlafilter.c b/server/modules/filter/qlafilter/qlafilter.c index ec0690479..1f9ebe7e0 100644 --- a/server/modules/filter/qlafilter/qlafilter.c +++ b/server/modules/filter/qlafilter/qlafilter.c @@ -72,6 +72,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -85,6 +86,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, // No client reply diagnostic, + getCapabilities, }; /** @@ -514,3 +516,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) my_instance->nomatch); } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/regexfilter/regexfilter.c b/server/modules/filter/regexfilter/regexfilter.c index 3266f129c..921c6d030 100644 --- a/server/modules/filter/regexfilter/regexfilter.c +++ b/server/modules/filter/regexfilter/regexfilter.c @@ -57,6 +57,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static char *regex_replace(const char *sql, pcre2_code *re, pcre2_match_data *study, const char *replace); @@ -72,6 +73,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -545,3 +547,13 @@ void log_nomatch(REGEX_INSTANCE* inst, char* re, char* old) MXS_INFO("No match %s: [%s]", re, old); } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/tee/tee.c b/server/modules/filter/tee/tee.c index 304b8ae3d..69b02c7ee 100644 --- a/server/modules/filter/tee/tee.c +++ b/server/modules/filter/tee/tee.c @@ -116,6 +116,7 @@ static void setUpstream(FILTER *instance, void *fsession, UPSTREAM *upstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static int clientReply(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = { @@ -128,6 +129,7 @@ static FILTER_OBJECT MyObject = routeQuery, clientReply, diagnostic, + getCapabilities, }; /** @@ -1124,6 +1126,16 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) } } +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} + /** * Determine if the packet is a command that must be sent to the branch * to maintain the session consistancy. These are COM_INIT_DB, diff --git a/server/modules/filter/testfilter/testfilter.c b/server/modules/filter/testfilter/testfilter.c index 8caa25b6e..e2ce7bbd0 100644 --- a/server/modules/filter/testfilter/testfilter.c +++ b/server/modules/filter/testfilter/testfilter.c @@ -46,6 +46,7 @@ static void freeSession(FILTER *instance, void *session); static void setDownstream(FILTER *instance, void *fsession, DOWNSTREAM *downstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -59,6 +60,7 @@ static FILTER_OBJECT MyObject = routeQuery, NULL, diagnostic, + getCapabilities, }; /** @@ -246,3 +248,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) dcb_printf(dcb, "\t\tNo. of sessions created: %d\n", my_instance->sessions); } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_NONE; +} diff --git a/server/modules/filter/topfilter/topfilter.c b/server/modules/filter/topfilter/topfilter.c index 5acbed3e8..2f69868e1 100644 --- a/server/modules/filter/topfilter/topfilter.c +++ b/server/modules/filter/topfilter/topfilter.c @@ -67,6 +67,7 @@ static void setUpstream(FILTER *instance, void *fsession, UPSTREAM *upstream); static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static int clientReply(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = @@ -80,6 +81,7 @@ static FILTER_OBJECT MyObject = routeQuery, clientReply, diagnostic, + getCapabilities, }; /** @@ -682,3 +684,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) } } } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/filter/tpmfilter/tpmfilter.c b/server/modules/filter/tpmfilter/tpmfilter.c index 97fddf10d..e57063826 100644 --- a/server/modules/filter/tpmfilter/tpmfilter.c +++ b/server/modules/filter/tpmfilter/tpmfilter.c @@ -81,6 +81,7 @@ static void setUpstream(FILTER *instance, void *fsession, UPSTREAM *upstream static int routeQuery(FILTER *instance, void *fsession, GWBUF *queue); static int clientReply(FILTER *instance, void *fsession, GWBUF *queue); static void diagnostic(FILTER *instance, void *fsession, DCB *dcb); +static uint64_t getCapabilities(); static FILTER_OBJECT MyObject = { @@ -93,6 +94,7 @@ static FILTER_OBJECT MyObject = routeQuery, clientReply, diagnostic, + getCapabilities, }; /** @@ -557,3 +559,13 @@ diagnostic(FILTER *instance, void *fsession, DCB *dcb) dcb_printf(dcb, "\t\tLogging with query delimiter %s.\n", my_instance->query_delimiter); } + +/** + * Capability routine. + * + * @return The capabilities of the filter. + */ +static uint64_t getCapabilities() +{ + return RCAP_TYPE_STMT_INPUT; +} diff --git a/server/modules/routing/readconnroute/readconnroute.c b/server/modules/routing/readconnroute/readconnroute.c index a9f3a27c9..704b1613b 100644 --- a/server/modules/routing/readconnroute/readconnroute.c +++ b/server/modules/routing/readconnroute/readconnroute.c @@ -987,7 +987,7 @@ static void rses_end_locked_router_action(ROUTER_CLIENT_SES* rses) static uint64_t getCapabilities() { - return RCAP_TYPE_PACKET_INPUT; + return RCAP_TYPE_NONE; } /********************************