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.
This commit is contained in:
Johan Wikman 2016-10-21 14:14:50 +03:00
parent d50acd02e4
commit 59a4152d8a
18 changed files with 240 additions and 8 deletions

View File

@ -25,6 +25,7 @@
*/
#include <maxscale/cdefs.h>
#include <maxscale/routing.h>
#include <maxscale/dcb.h>
#include <maxscale/session.h>
#include <maxscale/buffer.h>
@ -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

View File

@ -30,6 +30,7 @@
*/
#include <maxscale/cdefs.h>
#include <maxscale/routing.h>
#include <maxscale/service.h>
#include <maxscale/session.h>
#include <maxscale/buffer.h>
@ -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

View File

@ -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 <maxscale/cdefs.h>
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

View File

@ -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
//

View File

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

View File

@ -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"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,

View File

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

View File

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

View File

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

View File

@ -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;
}
/********************************