Rename schemarouter structures
Renamed structures to remove confusion with readwritesplit structures.
This commit is contained in:
@ -75,7 +75,7 @@ static void handleError(MXS_ROUTER* instance,
|
|||||||
DCB* backend_dcb,
|
DCB* backend_dcb,
|
||||||
mxs_error_action_t action,
|
mxs_error_action_t action,
|
||||||
bool* succp);
|
bool* succp);
|
||||||
static backend_ref_t* get_bref_from_dcb(ROUTER_CLIENT_SES* rses, DCB* dcb);
|
static backend_ref_t* get_bref_from_dcb(SCHEMAROUTER_SESSION* rses, DCB* dcb);
|
||||||
|
|
||||||
static route_target_t get_shard_route_target(qc_query_type_t qtype,
|
static route_target_t get_shard_route_target(qc_query_type_t qtype,
|
||||||
bool trx_active,
|
bool trx_active,
|
||||||
@ -86,22 +86,22 @@ static uint64_t getCapabilities(MXS_ROUTER* instance);
|
|||||||
static bool connect_backend_servers(backend_ref_t* backend_ref,
|
static bool connect_backend_servers(backend_ref_t* backend_ref,
|
||||||
int router_nservers,
|
int router_nservers,
|
||||||
MXS_SESSION* session,
|
MXS_SESSION* session,
|
||||||
ROUTER_INSTANCE* router);
|
SCHEMAROUTER* router);
|
||||||
|
|
||||||
static bool get_shard_dcb(DCB** dcb,
|
static bool get_shard_dcb(DCB** dcb,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
char* name);
|
char* name);
|
||||||
|
|
||||||
static bool rses_begin_locked_router_action(ROUTER_CLIENT_SES* rses);
|
static bool rses_begin_locked_router_action(SCHEMAROUTER_SESSION* rses);
|
||||||
static void rses_end_locked_router_action(ROUTER_CLIENT_SES* rses);
|
static void rses_end_locked_router_action(SCHEMAROUTER_SESSION* rses);
|
||||||
static void mysql_sescmd_done(mysql_sescmd_t* sescmd);
|
static void mysql_sescmd_done(mysql_sescmd_t* sescmd);
|
||||||
static mysql_sescmd_t* mysql_sescmd_init(rses_property_t* rses_prop,
|
static mysql_sescmd_t* mysql_sescmd_init(rses_property_t* rses_prop,
|
||||||
GWBUF* sescmd_buf,
|
GWBUF* sescmd_buf,
|
||||||
unsigned char packet_type,
|
unsigned char packet_type,
|
||||||
ROUTER_CLIENT_SES* rses);
|
SCHEMAROUTER_SESSION* rses);
|
||||||
static rses_property_t* mysql_sescmd_get_property(mysql_sescmd_t* scmd);
|
static rses_property_t* mysql_sescmd_get_property(mysql_sescmd_t* scmd);
|
||||||
static rses_property_t* rses_property_init(rses_property_type_t prop_type);
|
static rses_property_t* rses_property_init(rses_property_type_t prop_type);
|
||||||
static void rses_property_add(ROUTER_CLIENT_SES* rses,
|
static void rses_property_add(SCHEMAROUTER_SESSION* rses,
|
||||||
rses_property_t* prop);
|
rses_property_t* prop);
|
||||||
static void rses_property_done(rses_property_t* prop);
|
static void rses_property_done(rses_property_t* prop);
|
||||||
static mysql_sescmd_t* rses_property_get_sescmd(rses_property_t* prop);
|
static mysql_sescmd_t* rses_property_get_sescmd(rses_property_t* prop);
|
||||||
@ -116,43 +116,43 @@ static GWBUF* sescmd_cursor_clone_querybuf(sescmd_cursor_t* scur);
|
|||||||
static mysql_sescmd_t* sescmd_cursor_get_command(sescmd_cursor_t* scur);
|
static mysql_sescmd_t* sescmd_cursor_get_command(sescmd_cursor_t* scur);
|
||||||
static bool sescmd_cursor_next(sescmd_cursor_t* scur);
|
static bool sescmd_cursor_next(sescmd_cursor_t* scur);
|
||||||
static GWBUF* sescmd_cursor_process_replies(GWBUF* replybuf, backend_ref_t* bref);
|
static GWBUF* sescmd_cursor_process_replies(GWBUF* replybuf, backend_ref_t* bref);
|
||||||
static void tracelog_routed_query(ROUTER_CLIENT_SES* rses,
|
static void tracelog_routed_query(SCHEMAROUTER_SESSION* rses,
|
||||||
char* funcname,
|
char* funcname,
|
||||||
backend_ref_t* bref,
|
backend_ref_t* bref,
|
||||||
GWBUF* buf);
|
GWBUF* buf);
|
||||||
static bool route_session_write(ROUTER_CLIENT_SES* router_client_ses,
|
static bool route_session_write(SCHEMAROUTER_SESSION* router_client_ses,
|
||||||
GWBUF* querybuf,
|
GWBUF* querybuf,
|
||||||
ROUTER_INSTANCE* inst,
|
SCHEMAROUTER* inst,
|
||||||
unsigned char packet_type,
|
unsigned char packet_type,
|
||||||
qc_query_type_t qtype);
|
qc_query_type_t qtype);
|
||||||
static void bref_clear_state(backend_ref_t* bref, bref_state_t state);
|
static void bref_clear_state(backend_ref_t* bref, bref_state_t state);
|
||||||
static void bref_set_state(backend_ref_t* bref, bref_state_t state);
|
static void bref_set_state(backend_ref_t* bref, bref_state_t state);
|
||||||
static sescmd_cursor_t* backend_ref_get_sescmd_cursor (backend_ref_t* bref);
|
static sescmd_cursor_t* backend_ref_get_sescmd_cursor (backend_ref_t* bref);
|
||||||
static int router_handle_state_switch(DCB* dcb, DCB_REASON reason, void* data);
|
static int router_handle_state_switch(DCB* dcb, DCB_REASON reason, void* data);
|
||||||
static bool handle_error_new_connection(ROUTER_INSTANCE* inst,
|
static bool handle_error_new_connection(SCHEMAROUTER* inst,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
DCB* backend_dcb,
|
DCB* backend_dcb,
|
||||||
GWBUF* errmsg);
|
GWBUF* errmsg);
|
||||||
static void handle_error_reply_client(MXS_SESSION* ses,
|
static void handle_error_reply_client(MXS_SESSION* ses,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
DCB* backend_dcb,
|
DCB* backend_dcb,
|
||||||
GWBUF* errmsg);
|
GWBUF* errmsg);
|
||||||
|
|
||||||
static SPINLOCK instlock;
|
static SPINLOCK instlock;
|
||||||
static ROUTER_INSTANCE* instances;
|
static SCHEMAROUTER* instances;
|
||||||
|
|
||||||
bool detect_show_shards(GWBUF* query);
|
bool detect_show_shards(GWBUF* query);
|
||||||
int process_show_shards(ROUTER_CLIENT_SES* rses);
|
int process_show_shards(SCHEMAROUTER_SESSION* rses);
|
||||||
static int hashkeyfun(const void* key);
|
static int hashkeyfun(const void* key);
|
||||||
static int hashcmpfun(const void *, const void *);
|
static int hashcmpfun(const void *, const void *);
|
||||||
|
|
||||||
void write_error_to_client(DCB* dcb, int errnum, const char* mysqlstate, const char* errmsg);
|
void write_error_to_client(DCB* dcb, int errnum, const char* mysqlstate, const char* errmsg);
|
||||||
int inspect_backend_mapping_states(ROUTER_CLIENT_SES *router_cli_ses,
|
int inspect_backend_mapping_states(SCHEMAROUTER_SESSION *router_cli_ses,
|
||||||
backend_ref_t *bref,
|
backend_ref_t *bref,
|
||||||
GWBUF** wbuf);
|
GWBUF** wbuf);
|
||||||
bool handle_default_db(ROUTER_CLIENT_SES *router_cli_ses);
|
bool handle_default_db(SCHEMAROUTER_SESSION *router_cli_ses);
|
||||||
void route_queued_query(ROUTER_CLIENT_SES *router_cli_ses);
|
void route_queued_query(SCHEMAROUTER_SESSION *router_cli_ses);
|
||||||
void synchronize_shard_map(ROUTER_CLIENT_SES *client);
|
void synchronize_shard_map(SCHEMAROUTER_SESSION *client);
|
||||||
|
|
||||||
static int hashkeyfun(const void* key)
|
static int hashkeyfun(const void* key)
|
||||||
{
|
{
|
||||||
@ -279,7 +279,7 @@ char* get_lenenc_str(void* data)
|
|||||||
* @return 1 if a complete response was received, 0 if a partial response was received
|
* @return 1 if a complete response was received, 0 if a partial response was received
|
||||||
* and -1 if a database was found on more than one server.
|
* and -1 if a database was found on more than one server.
|
||||||
*/
|
*/
|
||||||
showdb_response_t parse_showdb_response(ROUTER_CLIENT_SES* rses, backend_ref_t* bref, GWBUF** buffer)
|
showdb_response_t parse_showdb_response(SCHEMAROUTER_SESSION* rses, backend_ref_t* bref, GWBUF** buffer)
|
||||||
{
|
{
|
||||||
unsigned char* ptr;
|
unsigned char* ptr;
|
||||||
char* target = bref->bref_backend->server->unique_name;
|
char* target = bref->bref_backend->server->unique_name;
|
||||||
@ -400,7 +400,7 @@ showdb_response_t parse_showdb_response(ROUTER_CLIENT_SES* rses, backend_ref_t*
|
|||||||
* @param session Router client session
|
* @param session Router client session
|
||||||
* @return 1 if all writes to backends were succesful and 0 if one or more errors occurred
|
* @return 1 if all writes to backends were succesful and 0 if one or more errors occurred
|
||||||
*/
|
*/
|
||||||
int gen_databaselist(ROUTER_INSTANCE* inst, ROUTER_CLIENT_SES* session)
|
int gen_databaselist(SCHEMAROUTER* inst, SCHEMAROUTER_SESSION* session)
|
||||||
{
|
{
|
||||||
DCB* dcb;
|
DCB* dcb;
|
||||||
const char* query = "SHOW DATABASES";
|
const char* query = "SHOW DATABASES";
|
||||||
@ -451,8 +451,8 @@ int gen_databaselist(ROUTER_INSTANCE* inst, ROUTER_CLIENT_SES* session)
|
|||||||
* @param buffer Query to inspect
|
* @param buffer Query to inspect
|
||||||
* @return Name of the backend or NULL if the query contains no known databases.
|
* @return Name of the backend or NULL if the query contains no known databases.
|
||||||
*/
|
*/
|
||||||
char* get_shard_target_name(ROUTER_INSTANCE* router,
|
char* get_shard_target_name(SCHEMAROUTER* router,
|
||||||
ROUTER_CLIENT_SES* client,
|
SCHEMAROUTER_SESSION* client,
|
||||||
GWBUF* buffer,
|
GWBUF* buffer,
|
||||||
qc_query_type_t qtype)
|
qc_query_type_t qtype)
|
||||||
{
|
{
|
||||||
@ -571,7 +571,7 @@ char* get_shard_target_name(ROUTER_INSTANCE* router,
|
|||||||
* @param shard Shard to check
|
* @param shard Shard to check
|
||||||
* @return True if the backend server is running
|
* @return True if the backend server is running
|
||||||
*/
|
*/
|
||||||
bool check_shard_status(ROUTER_INSTANCE* router, char* shard)
|
bool check_shard_status(SCHEMAROUTER* router, char* shard)
|
||||||
{
|
{
|
||||||
for (SERVER_REF *ref = router->service->dbref; ref; ref = ref->next)
|
for (SERVER_REF *ref = router->service->dbref; ref; ref = ref->next)
|
||||||
{
|
{
|
||||||
@ -651,11 +651,11 @@ MXS_MODULE* MXS_CREATE_MODULE()
|
|||||||
*/
|
*/
|
||||||
static MXS_ROUTER* createInstance(SERVICE *service, char **options)
|
static MXS_ROUTER* createInstance(SERVICE *service, char **options)
|
||||||
{
|
{
|
||||||
ROUTER_INSTANCE* router;
|
SCHEMAROUTER* router;
|
||||||
MXS_CONFIG_PARAMETER* conf;
|
MXS_CONFIG_PARAMETER* conf;
|
||||||
MXS_CONFIG_PARAMETER* param;
|
MXS_CONFIG_PARAMETER* param;
|
||||||
|
|
||||||
if ((router = MXS_CALLOC(1, sizeof(ROUTER_INSTANCE))) == NULL)
|
if ((router = MXS_CALLOC(1, sizeof(SCHEMAROUTER))) == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -824,7 +824,7 @@ static MXS_ROUTER* createInstance(SERVICE *service, char **options)
|
|||||||
* @param map Shard map to update
|
* @param map Shard map to update
|
||||||
* @return Current state of the shard map
|
* @return Current state of the shard map
|
||||||
*/
|
*/
|
||||||
enum shard_map_state shard_map_update_state(shard_map_t *self, ROUTER_INSTANCE* router)
|
enum shard_map_state shard_map_update_state(shard_map_t *self, SCHEMAROUTER* router)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&self->lock);
|
spinlock_acquire(&self->lock);
|
||||||
double tdiff = difftime(time(NULL), self->last_updated);
|
double tdiff = difftime(time(NULL), self->last_updated);
|
||||||
@ -850,8 +850,8 @@ enum shard_map_state shard_map_update_state(shard_map_t *self, ROUTER_INSTANCE*
|
|||||||
static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* router_inst, MXS_SESSION* session)
|
static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* router_inst, MXS_SESSION* session)
|
||||||
{
|
{
|
||||||
backend_ref_t* backend_ref; /*< array of backend references (DCB, BACKEND, cursor) */
|
backend_ref_t* backend_ref; /*< array of backend references (DCB, BACKEND, cursor) */
|
||||||
ROUTER_CLIENT_SES* client_rses = NULL;
|
SCHEMAROUTER_SESSION* client_rses = NULL;
|
||||||
ROUTER_INSTANCE* router = (ROUTER_INSTANCE *)router_inst;
|
SCHEMAROUTER* router = (SCHEMAROUTER *)router_inst;
|
||||||
bool succp;
|
bool succp;
|
||||||
int router_nservers = 0; /*< # of servers in total */
|
int router_nservers = 0; /*< # of servers in total */
|
||||||
char db[MYSQL_DATABASE_MAXLEN + 1] = "";
|
char db[MYSQL_DATABASE_MAXLEN + 1] = "";
|
||||||
@ -878,7 +878,7 @@ static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* router_inst, MXS_SESSION* sess
|
|||||||
MXS_INFO("Client'%s' connecting with empty database.", data->user);
|
MXS_INFO("Client'%s' connecting with empty database.", data->user);
|
||||||
}
|
}
|
||||||
|
|
||||||
client_rses = (ROUTER_CLIENT_SES *)MXS_CALLOC(1, sizeof(ROUTER_CLIENT_SES));
|
client_rses = (SCHEMAROUTER_SESSION *)MXS_CALLOC(1, sizeof(SCHEMAROUTER_SESSION));
|
||||||
|
|
||||||
if (client_rses == NULL)
|
if (client_rses == NULL)
|
||||||
{
|
{
|
||||||
@ -1042,8 +1042,8 @@ static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* router_inst, MXS_SESSION* sess
|
|||||||
*/
|
*/
|
||||||
static void closeSession(MXS_ROUTER* instance, MXS_ROUTER_SESSION* router_session)
|
static void closeSession(MXS_ROUTER* instance, MXS_ROUTER_SESSION* router_session)
|
||||||
{
|
{
|
||||||
ROUTER_CLIENT_SES* router_cli_ses;
|
SCHEMAROUTER_SESSION* router_cli_ses;
|
||||||
ROUTER_INSTANCE* inst;
|
SCHEMAROUTER* inst;
|
||||||
backend_ref_t* backend_ref;
|
backend_ref_t* backend_ref;
|
||||||
|
|
||||||
MXS_DEBUG("%lu [schemarouter:closeSession]", pthread_self());
|
MXS_DEBUG("%lu [schemarouter:closeSession]", pthread_self());
|
||||||
@ -1056,7 +1056,7 @@ static void closeSession(MXS_ROUTER* instance, MXS_ROUTER_SESSION* router_sessio
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
|
router_cli_ses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
CHK_CLIENT_RSES(router_cli_ses);
|
CHK_CLIENT_RSES(router_cli_ses);
|
||||||
|
|
||||||
inst = router_cli_ses->router;
|
inst = router_cli_ses->router;
|
||||||
@ -1137,7 +1137,7 @@ static void closeSession(MXS_ROUTER* instance, MXS_ROUTER_SESSION* router_sessio
|
|||||||
|
|
||||||
static void freeSession(MXS_ROUTER* router_instance, MXS_ROUTER_SESSION* router_client_session)
|
static void freeSession(MXS_ROUTER* router_instance, MXS_ROUTER_SESSION* router_client_session)
|
||||||
{
|
{
|
||||||
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_client_session;
|
SCHEMAROUTER_SESSION* router_cli_ses = (SCHEMAROUTER_SESSION *)router_client_session;
|
||||||
|
|
||||||
for (int i = 0; i < router_cli_ses->rses_nbackends; i++)
|
for (int i = 0; i < router_cli_ses->rses_nbackends; i++)
|
||||||
{
|
{
|
||||||
@ -1186,7 +1186,7 @@ static void freeSession(MXS_ROUTER* router_instance, MXS_ROUTER_SESSION* router_
|
|||||||
* @return True if proper DCB was found, false otherwise.
|
* @return True if proper DCB was found, false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool get_shard_dcb(DCB** p_dcb,
|
static bool get_shard_dcb(DCB** p_dcb,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
char* name)
|
char* name)
|
||||||
{
|
{
|
||||||
backend_ref_t* backend_ref;
|
backend_ref_t* backend_ref;
|
||||||
@ -1285,7 +1285,7 @@ void check_drop_tmp_table(MXS_ROUTER* instance,
|
|||||||
char** tbl = NULL;
|
char** tbl = NULL;
|
||||||
char *hkey, *dbname;
|
char *hkey, *dbname;
|
||||||
|
|
||||||
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
|
SCHEMAROUTER_SESSION* router_cli_ses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
rses_property_t* rses_prop_tmp;
|
rses_property_t* rses_prop_tmp;
|
||||||
|
|
||||||
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
|
rses_prop_tmp = router_cli_ses->rses_properties[RSES_PROP_TYPE_TMPTABLES];
|
||||||
@ -1341,7 +1341,7 @@ qc_query_type_t is_read_tmp_table(MXS_ROUTER* instance,
|
|||||||
char** tbl = NULL;
|
char** tbl = NULL;
|
||||||
char *hkey, *dbname;
|
char *hkey, *dbname;
|
||||||
|
|
||||||
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
|
SCHEMAROUTER_SESSION* router_cli_ses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
qc_query_type_t qtype = type;
|
qc_query_type_t qtype = type;
|
||||||
rses_property_t* rses_prop_tmp;
|
rses_property_t* rses_prop_tmp;
|
||||||
|
|
||||||
@ -1415,7 +1415,7 @@ void check_create_tmp_table(MXS_ROUTER* instance,
|
|||||||
int klen = 0;
|
int klen = 0;
|
||||||
char *hkey, *dbname;
|
char *hkey, *dbname;
|
||||||
|
|
||||||
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
|
SCHEMAROUTER_SESSION* router_cli_ses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
rses_property_t* rses_prop_tmp;
|
rses_property_t* rses_prop_tmp;
|
||||||
HASHTABLE* h;
|
HASHTABLE* h;
|
||||||
|
|
||||||
@ -1546,7 +1546,7 @@ RESULT_ROW *result_set_cb(struct resultset * rset, void *data)
|
|||||||
* @param client Router client session
|
* @param client Router client session
|
||||||
* @return True if the sending of the database list was successful, otherwise false
|
* @return True if the sending of the database list was successful, otherwise false
|
||||||
*/
|
*/
|
||||||
bool send_database_list(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client)
|
bool send_database_list(SCHEMAROUTER* router, SCHEMAROUTER_SESSION* client)
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
spinlock_acquire(&client->shardmap->lock);
|
spinlock_acquire(&client->shardmap->lock);
|
||||||
@ -1611,17 +1611,15 @@ bool send_database_list(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client)
|
|||||||
* an error message is sent to the client.
|
* an error message is sent to the client.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int routeQuery(MXS_ROUTER* instance,
|
static int routeQuery(MXS_ROUTER* instance, MXS_ROUTER_SESSION* router_session, GWBUF* qbuf)
|
||||||
MXS_ROUTER_SESSION* router_session,
|
|
||||||
GWBUF* qbuf)
|
|
||||||
{
|
{
|
||||||
qc_query_type_t qtype = QUERY_TYPE_UNKNOWN;
|
qc_query_type_t qtype = QUERY_TYPE_UNKNOWN;
|
||||||
mysql_server_cmd_t packet_type;
|
mysql_server_cmd_t packet_type;
|
||||||
uint8_t* packet;
|
uint8_t* packet;
|
||||||
int i, ret = 0;
|
int ret = 0;
|
||||||
DCB* target_dcb = NULL;
|
DCB* target_dcb = NULL;
|
||||||
ROUTER_INSTANCE* inst = (ROUTER_INSTANCE *)instance;
|
SCHEMAROUTER* inst = (SCHEMAROUTER *)instance;
|
||||||
ROUTER_CLIENT_SES* router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
|
SCHEMAROUTER_SESSION* router_cli_ses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
bool rses_is_closed = false;
|
bool rses_is_closed = false;
|
||||||
bool change_successful = false;
|
bool change_successful = false;
|
||||||
route_target_t route_target = TARGET_UNDEFINED;
|
route_target_t route_target = TARGET_UNDEFINED;
|
||||||
@ -2126,7 +2124,7 @@ retblock:
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static bool rses_begin_locked_router_action(
|
static bool rses_begin_locked_router_action(
|
||||||
ROUTER_CLIENT_SES* rses)
|
SCHEMAROUTER_SESSION* rses)
|
||||||
{
|
{
|
||||||
bool succp = false;
|
bool succp = false;
|
||||||
|
|
||||||
@ -2162,7 +2160,7 @@ return_succp:
|
|||||||
* @details (write detailed description here)
|
* @details (write detailed description here)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static void rses_end_locked_router_action(ROUTER_CLIENT_SES* rses)
|
static void rses_end_locked_router_action(SCHEMAROUTER_SESSION* rses)
|
||||||
{
|
{
|
||||||
CHK_CLIENT_RSES(rses);
|
CHK_CLIENT_RSES(rses);
|
||||||
spinlock_release(&rses->rses_lock);
|
spinlock_release(&rses->rses_lock);
|
||||||
@ -2178,7 +2176,7 @@ static void rses_end_locked_router_action(ROUTER_CLIENT_SES* rses)
|
|||||||
*/
|
*/
|
||||||
static void diagnostic(MXS_ROUTER *instance, DCB *dcb)
|
static void diagnostic(MXS_ROUTER *instance, DCB *dcb)
|
||||||
{
|
{
|
||||||
ROUTER_INSTANCE *router = (ROUTER_INSTANCE *)instance;
|
SCHEMAROUTER *router = (SCHEMAROUTER *)instance;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
double sescmd_pct = router->stats.n_sescmd != 0 ?
|
double sescmd_pct = router->stats.n_sescmd != 0 ?
|
||||||
@ -2243,12 +2241,12 @@ static void clientReply(MXS_ROUTER* instance,
|
|||||||
DCB* backend_dcb)
|
DCB* backend_dcb)
|
||||||
{
|
{
|
||||||
DCB* client_dcb;
|
DCB* client_dcb;
|
||||||
ROUTER_CLIENT_SES* router_cli_ses;
|
SCHEMAROUTER_SESSION* router_cli_ses;
|
||||||
sescmd_cursor_t* scur = NULL;
|
sescmd_cursor_t* scur = NULL;
|
||||||
backend_ref_t* bref;
|
backend_ref_t* bref;
|
||||||
GWBUF* writebuf = buffer;
|
GWBUF* writebuf = buffer;
|
||||||
|
|
||||||
router_cli_ses = (ROUTER_CLIENT_SES *) router_session;
|
router_cli_ses = (SCHEMAROUTER_SESSION *) router_session;
|
||||||
CHK_CLIENT_RSES(router_cli_ses);
|
CHK_CLIENT_RSES(router_cli_ses);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2497,7 +2495,7 @@ static void clientReply(MXS_ROUTER* instance,
|
|||||||
if ((ret = bref->bref_dcb->func.write(bref->bref_dcb,
|
if ((ret = bref->bref_dcb->func.write(bref->bref_dcb,
|
||||||
gwbuf_clone(bref->bref_pending_cmd))) == 1)
|
gwbuf_clone(bref->bref_pending_cmd))) == 1)
|
||||||
{
|
{
|
||||||
ROUTER_INSTANCE* inst = (ROUTER_INSTANCE *) instance;
|
SCHEMAROUTER* inst = (SCHEMAROUTER *) instance;
|
||||||
atomic_add(&inst->stats.n_queries, 1);
|
atomic_add(&inst->stats.n_queries, 1);
|
||||||
/**
|
/**
|
||||||
* Add one query response waiter to backend reference
|
* Add one query response waiter to backend reference
|
||||||
@ -2675,7 +2673,7 @@ static void bref_set_state(backend_ref_t* bref, bref_state_t state)
|
|||||||
static bool connect_backend_servers(backend_ref_t* backend_ref,
|
static bool connect_backend_servers(backend_ref_t* backend_ref,
|
||||||
int router_nservers,
|
int router_nservers,
|
||||||
MXS_SESSION* session,
|
MXS_SESSION* session,
|
||||||
ROUTER_INSTANCE* router)
|
SCHEMAROUTER* router)
|
||||||
{
|
{
|
||||||
bool succp = true;
|
bool succp = true;
|
||||||
/*
|
/*
|
||||||
@ -2888,7 +2886,7 @@ static void rses_property_done(rses_property_t* prop)
|
|||||||
*
|
*
|
||||||
* Router client session must be locked.
|
* Router client session must be locked.
|
||||||
*/
|
*/
|
||||||
static void rses_property_add(ROUTER_CLIENT_SES* rses,
|
static void rses_property_add(SCHEMAROUTER_SESSION* rses,
|
||||||
rses_property_t* prop)
|
rses_property_t* prop)
|
||||||
{
|
{
|
||||||
rses_property_t* p;
|
rses_property_t* p;
|
||||||
@ -2941,7 +2939,7 @@ static mysql_sescmd_t* rses_property_get_sescmd(rses_property_t* prop)
|
|||||||
static mysql_sescmd_t* mysql_sescmd_init(rses_property_t* rses_prop,
|
static mysql_sescmd_t* mysql_sescmd_init(rses_property_t* rses_prop,
|
||||||
GWBUF* sescmd_buf,
|
GWBUF* sescmd_buf,
|
||||||
unsigned char packet_type,
|
unsigned char packet_type,
|
||||||
ROUTER_CLIENT_SES* rses)
|
SCHEMAROUTER_SESSION* rses)
|
||||||
{
|
{
|
||||||
mysql_sescmd_t* sescmd;
|
mysql_sescmd_t* sescmd;
|
||||||
|
|
||||||
@ -3123,7 +3121,7 @@ static bool sescmd_cursor_history_empty(sescmd_cursor_t* scur)
|
|||||||
|
|
||||||
static void sescmd_cursor_reset(sescmd_cursor_t* scur)
|
static void sescmd_cursor_reset(sescmd_cursor_t* scur)
|
||||||
{
|
{
|
||||||
ROUTER_CLIENT_SES* rses;
|
SCHEMAROUTER_SESSION* rses;
|
||||||
CHK_SESCMD_CUR(scur);
|
CHK_SESCMD_CUR(scur);
|
||||||
CHK_CLIENT_RSES(scur->scmd_cur_rses);
|
CHK_CLIENT_RSES(scur->scmd_cur_rses);
|
||||||
rses = scur->scmd_cur_rses;
|
rses = scur->scmd_cur_rses;
|
||||||
@ -3334,9 +3332,9 @@ static uint64_t getCapabilities(MXS_ROUTER* instance)
|
|||||||
* Return true if succeed, false is returned if router session was closed or
|
* Return true if succeed, false is returned if router session was closed or
|
||||||
* if execute_sescmd_in_backend failed.
|
* if execute_sescmd_in_backend failed.
|
||||||
*/
|
*/
|
||||||
static bool route_session_write(ROUTER_CLIENT_SES* router_cli_ses,
|
static bool route_session_write(SCHEMAROUTER_SESSION* router_cli_ses,
|
||||||
GWBUF* querybuf,
|
GWBUF* querybuf,
|
||||||
ROUTER_INSTANCE* inst,
|
SCHEMAROUTER* inst,
|
||||||
unsigned char packet_type,
|
unsigned char packet_type,
|
||||||
qc_query_type_t qtype)
|
qc_query_type_t qtype)
|
||||||
{
|
{
|
||||||
@ -3561,8 +3559,8 @@ static void handleError(MXS_ROUTER* instance,
|
|||||||
{
|
{
|
||||||
ss_dassert(problem_dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER);
|
ss_dassert(problem_dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER);
|
||||||
MXS_SESSION* session;
|
MXS_SESSION* session;
|
||||||
ROUTER_INSTANCE* inst = (ROUTER_INSTANCE *)instance;
|
SCHEMAROUTER* inst = (SCHEMAROUTER *)instance;
|
||||||
ROUTER_CLIENT_SES* rses = (ROUTER_CLIENT_SES *)router_session;
|
SCHEMAROUTER_SESSION* rses = (SCHEMAROUTER_SESSION *)router_session;
|
||||||
|
|
||||||
CHK_DCB(problem_dcb);
|
CHK_DCB(problem_dcb);
|
||||||
|
|
||||||
@ -3618,7 +3616,7 @@ static void handleError(MXS_ROUTER* instance,
|
|||||||
|
|
||||||
|
|
||||||
static void handle_error_reply_client(MXS_SESSION* ses,
|
static void handle_error_reply_client(MXS_SESSION* ses,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
DCB* backend_dcb,
|
DCB* backend_dcb,
|
||||||
GWBUF* errmsg)
|
GWBUF* errmsg)
|
||||||
{
|
{
|
||||||
@ -3652,7 +3650,7 @@ static void handle_error_reply_client(MXS_SESSION* ses,
|
|||||||
* @return True if session has a single backend server in use that is running.
|
* @return True if session has a single backend server in use that is running.
|
||||||
* False if no backends are in use or running.
|
* False if no backends are in use or running.
|
||||||
*/
|
*/
|
||||||
bool have_servers(ROUTER_CLIENT_SES* rses)
|
bool have_servers(SCHEMAROUTER_SESSION* rses)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -3681,8 +3679,8 @@ bool have_servers(ROUTER_CLIENT_SES* rses)
|
|||||||
*
|
*
|
||||||
* @return true if there are enough backend connections to continue, false if not
|
* @return true if there are enough backend connections to continue, false if not
|
||||||
*/
|
*/
|
||||||
static bool handle_error_new_connection(ROUTER_INSTANCE* inst,
|
static bool handle_error_new_connection(SCHEMAROUTER* inst,
|
||||||
ROUTER_CLIENT_SES* rses,
|
SCHEMAROUTER_SESSION* rses,
|
||||||
DCB* backend_dcb,
|
DCB* backend_dcb,
|
||||||
GWBUF* errmsg)
|
GWBUF* errmsg)
|
||||||
{
|
{
|
||||||
@ -3762,7 +3760,7 @@ return_succp:
|
|||||||
*
|
*
|
||||||
* @return backend reference pointer if succeed or NULL
|
* @return backend reference pointer if succeed or NULL
|
||||||
*/
|
*/
|
||||||
static backend_ref_t* get_bref_from_dcb(ROUTER_CLIENT_SES* rses,
|
static backend_ref_t* get_bref_from_dcb(SCHEMAROUTER_SESSION* rses,
|
||||||
DCB* dcb)
|
DCB* dcb)
|
||||||
{
|
{
|
||||||
backend_ref_t* bref;
|
backend_ref_t* bref;
|
||||||
@ -3844,7 +3842,7 @@ bool detect_show_shards(GWBUF* query)
|
|||||||
struct shard_list
|
struct shard_list
|
||||||
{
|
{
|
||||||
HASHITERATOR* iter;
|
HASHITERATOR* iter;
|
||||||
ROUTER_CLIENT_SES* rses;
|
SCHEMAROUTER_SESSION* rses;
|
||||||
RESULTSET* rset;
|
RESULTSET* rset;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3874,7 +3872,7 @@ RESULT_ROW* shard_list_cb(struct resultset* rset, void* data)
|
|||||||
* @param rses Router client session
|
* @param rses Router client session
|
||||||
* @return 0 on success, -1 on error
|
* @return 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int process_show_shards(ROUTER_CLIENT_SES* rses)
|
int process_show_shards(SCHEMAROUTER_SESSION* rses)
|
||||||
{
|
{
|
||||||
int rval = 0;
|
int rval = 0;
|
||||||
|
|
||||||
@ -3940,7 +3938,7 @@ void write_error_to_client(DCB* dcb, int errnum, const char* mysqlstate, const c
|
|||||||
* @param router_cli_ses
|
* @param router_cli_ses
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool handle_default_db(ROUTER_CLIENT_SES *router_cli_ses)
|
bool handle_default_db(SCHEMAROUTER_SESSION *router_cli_ses)
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
char* target = NULL;
|
char* target = NULL;
|
||||||
@ -4009,7 +4007,7 @@ bool handle_default_db(ROUTER_CLIENT_SES *router_cli_ses)
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void route_queued_query(ROUTER_CLIENT_SES *router_cli_ses)
|
void route_queued_query(SCHEMAROUTER_SESSION *router_cli_ses)
|
||||||
{
|
{
|
||||||
GWBUF* tmp = router_cli_ses->queue;
|
GWBUF* tmp = router_cli_ses->queue;
|
||||||
router_cli_ses->queue = router_cli_ses->queue->next;
|
router_cli_ses->queue = router_cli_ses->queue->next;
|
||||||
@ -4029,7 +4027,7 @@ void route_queued_query(ROUTER_CLIENT_SES *router_cli_ses)
|
|||||||
* @param router_cli_ses Router client session
|
* @param router_cli_ses Router client session
|
||||||
* @return 1 if mapping is done, 0 if it is still ongoing and -1 on error
|
* @return 1 if mapping is done, 0 if it is still ongoing and -1 on error
|
||||||
*/
|
*/
|
||||||
int inspect_backend_mapping_states(ROUTER_CLIENT_SES *router_cli_ses,
|
int inspect_backend_mapping_states(SCHEMAROUTER_SESSION *router_cli_ses,
|
||||||
backend_ref_t *bref,
|
backend_ref_t *bref,
|
||||||
GWBUF** wbuf)
|
GWBUF** wbuf)
|
||||||
{
|
{
|
||||||
@ -4151,7 +4149,7 @@ void replace_shard_map(shard_map_t **target, shard_map_t **source)
|
|||||||
* is discarded and the router's shard map is used.
|
* is discarded and the router's shard map is used.
|
||||||
* @param client Router session
|
* @param client Router session
|
||||||
*/
|
*/
|
||||||
void synchronize_shard_map(ROUTER_CLIENT_SES *client)
|
void synchronize_shard_map(SCHEMAROUTER_SESSION *client)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&client->router->lock);
|
spinlock_acquire(&client->router->lock);
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ typedef enum backend_type_t
|
|||||||
BE_COUNT
|
BE_COUNT
|
||||||
} backend_type_t;
|
} backend_type_t;
|
||||||
|
|
||||||
struct router_instance;
|
struct schemarouter_instance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Route target types
|
* Route target types
|
||||||
@ -132,7 +132,7 @@ typedef enum
|
|||||||
#define TARGET_IS_ANY(t) (t & TARGET_ANY)
|
#define TARGET_IS_ANY(t) (t & TARGET_ANY)
|
||||||
|
|
||||||
typedef struct rses_property_st rses_property_t;
|
typedef struct rses_property_st rses_property_t;
|
||||||
typedef struct router_client_session ROUTER_CLIENT_SES;
|
typedef struct schemarouter_session SCHEMAROUTER_SESSION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Router session properties
|
* Router session properties
|
||||||
@ -189,7 +189,7 @@ struct rses_property_st
|
|||||||
#if defined(SS_DEBUG)
|
#if defined(SS_DEBUG)
|
||||||
skygw_chk_t rses_prop_chk_top;
|
skygw_chk_t rses_prop_chk_top;
|
||||||
#endif
|
#endif
|
||||||
ROUTER_CLIENT_SES* rses_prop_rsession; /*< Parent router session */
|
SCHEMAROUTER_SESSION* rses_prop_rsession; /*< Parent router session */
|
||||||
int rses_prop_refcount; /*< Reference count*/
|
int rses_prop_refcount; /*< Reference count*/
|
||||||
rses_property_type_t rses_prop_type; /*< Property type */
|
rses_property_type_t rses_prop_type; /*< Property type */
|
||||||
union rses_prop_data
|
union rses_prop_data
|
||||||
@ -208,7 +208,7 @@ typedef struct sescmd_cursor_st
|
|||||||
#if defined(SS_DEBUG)
|
#if defined(SS_DEBUG)
|
||||||
skygw_chk_t scmd_cur_chk_top;
|
skygw_chk_t scmd_cur_chk_top;
|
||||||
#endif
|
#endif
|
||||||
ROUTER_CLIENT_SES* scmd_cur_rses; /*< pointer to owning router session */
|
SCHEMAROUTER_SESSION* scmd_cur_rses; /*< pointer to owning router session */
|
||||||
rses_property_t** scmd_cur_ptr_property; /*< address of pointer to owner property */
|
rses_property_t** scmd_cur_ptr_property; /*< address of pointer to owner property */
|
||||||
mysql_sescmd_t* scmd_cur_cmd; /*< pointer to current session command */
|
mysql_sescmd_t* scmd_cur_cmd; /*< pointer to current session command */
|
||||||
bool scmd_cur_active; /*< true if command is being executed */
|
bool scmd_cur_active; /*< true if command is being executed */
|
||||||
@ -313,7 +313,7 @@ typedef struct
|
|||||||
/**
|
/**
|
||||||
* The client session structure used within this router.
|
* The client session structure used within this router.
|
||||||
*/
|
*/
|
||||||
struct router_client_session
|
struct schemarouter_session
|
||||||
{
|
{
|
||||||
#if defined(SS_DEBUG)
|
#if defined(SS_DEBUG)
|
||||||
skygw_chk_t rses_chk_top;
|
skygw_chk_t rses_chk_top;
|
||||||
@ -331,8 +331,8 @@ struct router_client_session
|
|||||||
int rses_nbackends; /*< Number of backends */
|
int rses_nbackends; /*< Number of backends */
|
||||||
bool rses_autocommit_enabled; /*< Is autocommit enabled */
|
bool rses_autocommit_enabled; /*< Is autocommit enabled */
|
||||||
bool rses_transaction_active; /*< Is a transaction active */
|
bool rses_transaction_active; /*< Is a transaction active */
|
||||||
struct router_instance *router; /*< The router instance */
|
struct schemarouter_instance *router; /*< The router instance */
|
||||||
struct router_client_session* next; /*< List of router sessions */
|
struct schemarouter_session* next; /*< List of router sessions */
|
||||||
shard_map_t*
|
shard_map_t*
|
||||||
shardmap; /*< Database hash containing names of the databases mapped to the servers that contain them */
|
shardmap; /*< Database hash containing names of the databases mapped to the servers that contain them */
|
||||||
char connect_db[MYSQL_DATABASE_MAXLEN + 1]; /*< Database the user was trying to connect to */
|
char connect_db[MYSQL_DATABASE_MAXLEN + 1]; /*< Database the user was trying to connect to */
|
||||||
@ -353,18 +353,18 @@ struct router_client_session
|
|||||||
/**
|
/**
|
||||||
* The per instance data for the router.
|
* The per instance data for the router.
|
||||||
*/
|
*/
|
||||||
typedef struct router_instance
|
typedef struct schemarouter_instance
|
||||||
{
|
{
|
||||||
HASHTABLE* shard_maps; /*< Shard maps hashed by user name */
|
HASHTABLE* shard_maps; /*< Shard maps hashed by user name */
|
||||||
SERVICE* service; /*< Pointer to service */
|
SERVICE* service; /*< Pointer to service */
|
||||||
ROUTER_CLIENT_SES* connections; /*< List of client connections */
|
SCHEMAROUTER_SESSION* connections; /*< List of client connections */
|
||||||
SPINLOCK lock; /*< Lock for the instance data */
|
SPINLOCK lock; /*< Lock for the instance data */
|
||||||
schemarouter_config_t schemarouter_config; /*< expanded config info from SERVICE */
|
schemarouter_config_t schemarouter_config; /*< expanded config info from SERVICE */
|
||||||
int schemarouter_version;/*< version number for router's config */
|
int schemarouter_version;/*< version number for router's config */
|
||||||
unsigned int bitmask; /*< Bitmask to apply to server->status */
|
unsigned int bitmask; /*< Bitmask to apply to server->status */
|
||||||
unsigned int bitvalue; /*< Required value of server->status */
|
unsigned int bitvalue; /*< Required value of server->status */
|
||||||
ROUTER_STATS stats; /*< Statistics for this router */
|
ROUTER_STATS stats; /*< Statistics for this router */
|
||||||
struct router_instance* next; /*< Next router on the list */
|
struct schemarouter_instance* next; /*< Next router on the list */
|
||||||
bool available_slaves; /*< The router has some slaves available */
|
bool available_slaves; /*< The router has some slaves available */
|
||||||
HASHTABLE* ignored_dbs; /*< List of databases to ignore when the
|
HASHTABLE* ignored_dbs; /*< List of databases to ignore when the
|
||||||
* database mapping finds multiple servers
|
* database mapping finds multiple servers
|
||||||
@ -374,7 +374,7 @@ typedef struct router_instance
|
|||||||
* if they are found on more than one server. */
|
* if they are found on more than one server. */
|
||||||
pcre2_match_data* ignore_match_data;
|
pcre2_match_data* ignore_match_data;
|
||||||
|
|
||||||
} ROUTER_INSTANCE;
|
} SCHEMAROUTER;
|
||||||
|
|
||||||
#define BACKEND_TYPE(b) (SERVER_IS_MASTER((b)->backend_server) ? BE_MASTER : \
|
#define BACKEND_TYPE(b) (SERVER_IS_MASTER((b)->backend_server) ? BE_MASTER : \
|
||||||
(SERVER_IS_SLAVE((b)->backend_server) ? BE_SLAVE : BE_UNDEFINED));
|
(SERVER_IS_SLAVE((b)->backend_server) ? BE_SLAVE : BE_UNDEFINED));
|
||||||
|
Reference in New Issue
Block a user