From ed280aa81b05a8b6321f28fd70e587abe4b45d64 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Sun, 20 Nov 2016 22:15:42 +0200 Subject: [PATCH] Use client DCB to route requests Using internal DCBs for query routing wasn't needed as the client DCB could be used. This could also be done by simply routing the query again with routeQuery. --- include/maxscale/debug.h | 3 +- .../routing/schemarouter/schemarouter.c | 58 +------------------ 2 files changed, 4 insertions(+), 57 deletions(-) diff --git a/include/maxscale/debug.h b/include/maxscale/debug.h index 64973e68e..ac3c25e8f 100644 --- a/include/maxscale/debug.h +++ b/include/maxscale/debug.h @@ -243,7 +243,8 @@ typedef enum skygw_chk_t #define STRDCBROLE(r) ((r) == DCB_ROLE_SERVICE_LISTENER ? "DCB_ROLE_SERVICE_LISTENER" : \ ((r) == DCB_ROLE_CLIENT_HANDLER ? "DCB_ROLE_CLIENT_HANDLER" : \ ((r) == DCB_ROLE_BACKEND_HANDLER ? "DCB_ROLE_BACKEND_HANDLER" : \ - "UNKNOWN DCB ROLE"))) + ((r) == DCB_ROLE_INTERNAL ? "DCB_ROLE_INTERNAL" : \ + "UNKNOWN DCB ROLE")))) #define STRBETYPE(t) ((t) == BE_MASTER ? "BE_MASTER" : \ ((t) == BE_SLAVE ? "BE_SLAVE" : \ diff --git a/server/modules/routing/schemarouter/schemarouter.c b/server/modules/routing/schemarouter/schemarouter.c index 6d802fe5a..8aa38ec42 100644 --- a/server/modules/routing/schemarouter/schemarouter.c +++ b/server/modules/routing/schemarouter/schemarouter.c @@ -607,41 +607,6 @@ bool check_shard_status(ROUTER_INSTANCE* router, char* shard) return false; } -/** - * A fake DCB read function used to forward queued queries. - * @param dcb Internal DCB used by the router session - * @return Always 1 - */ -int internalRoute(DCB* dcb) -{ - if (dcb->dcb_readqueue && dcb->session) - { - GWBUF* tmp = dcb->dcb_readqueue; - void* rinst = dcb->session->service->router_instance; - void *rses = dcb->session->router_session; - - dcb->dcb_readqueue = NULL; - return dcb->session->service->router->routeQuery(rinst, rses, tmp); - } - return 1; -} - -/** - * A fake DCB read function used to forward replies to the client. - * @param dcb Internal DCB used by the router session - * @return Always 1 - */ -int internalReply(DCB* dcb) -{ - if (dcb->dcb_readqueue && dcb->session) - { - GWBUF* tmp = dcb->dcb_readqueue; - dcb->dcb_readqueue = NULL; - return SESSION_ROUTE_REPLY(dcb->session, tmp); - } - return 1; -} - /** * Implementation of the mandatory version entry point * @@ -955,16 +920,8 @@ static void* newSession(ROUTER* router_inst, SESSION* session) } client_rses->shardmap = map; - client_rses->dcb_reply = dcb_alloc(DCB_ROLE_INTERNAL, NULL); - client_rses->dcb_reply->func.read = internalReply; - client_rses->dcb_reply->state = DCB_STATE_POLLING; - client_rses->dcb_reply->session = session; memcpy(&client_rses->rses_config, &router->schemarouter_config, sizeof(schemarouter_config_t)); client_rses->n_sescmd = 0; - client_rses->dcb_route = dcb_alloc(DCB_ROLE_INTERNAL, NULL); - client_rses->dcb_route->func.read = internalRoute; - client_rses->dcb_route->state = DCB_STATE_POLLING; - client_rses->dcb_route->session = session; client_rses->rses_config.last_refresh = time(NULL); if (using_db) @@ -1147,18 +1104,7 @@ static void closeSession(ROUTER* instance, void* router_session) } } - /* Close internal DCBs */ - router_cli_ses->dcb_reply->session = NULL; - router_cli_ses->dcb_route->session = NULL; - dcb_close(router_cli_ses->dcb_reply); - dcb_close(router_cli_ses->dcb_route); - - while (router_cli_ses->queue && - (router_cli_ses->queue = gwbuf_consume( - router_cli_ses->queue, gwbuf_length(router_cli_ses->queue)))) - { - ; - } + gwbuf_free(router_cli_ses->queue); /** Unlock */ rses_end_locked_router_action(router_cli_ses); @@ -4153,7 +4099,7 @@ void route_queued_query(ROUTER_CLIENT_SES *router_cli_ses) querystr); MXS_FREE(querystr); #endif - poll_add_epollin_event_to_dcb(router_cli_ses->dcb_route, tmp); + poll_add_epollin_event_to_dcb(router_cli_ses->rses_client_dcb, tmp); } /**