From 67626d6c32ba521d5523ad9a5124c9d7214a6631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Thu, 29 Nov 2018 17:25:15 +0200 Subject: [PATCH] MXS-2196: Pass the SERVICE pointer when allocating a DCB The value would otherwise be assigned outside of it and in some cases not at all. Now all DCBs (apart from internal ones) have a valid SERVICE pointer. The SERV_LISTENER pointer should not be in the DCBs but in the session. This way the listener is an attribute of a session instead of a connection. If this is implemented, the authenticator data can be more easily shared. --- include/maxscale/dcb.h | 2 +- server/core/dcb.cc | 7 ++++--- server/core/test/test_dcb.cc | 2 +- server/core/test/test_poll.cc | 2 +- server/modules/routing/binlogrouter/blr_master.cc | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/maxscale/dcb.h b/include/maxscale/dcb.h index 451221468..b900c9049 100644 --- a/include/maxscale/dcb.h +++ b/include/maxscale/dcb.h @@ -261,7 +261,7 @@ void dcb_global_init(); int dcb_write(DCB*, GWBUF*); DCB* dcb_accept(DCB* listener); -DCB* dcb_alloc(dcb_role_t, SERV_LISTENER*); +DCB* dcb_alloc(dcb_role_t, SERV_LISTENER*, SERVICE* service); DCB* dcb_connect(struct server*, struct session*, const char*); int dcb_read(DCB*, GWBUF**, int); int dcb_drain_writeq(DCB*); diff --git a/server/core/dcb.cc b/server/core/dcb.cc index cae3da1b6..6fff6f6e7 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -180,7 +180,7 @@ static void dcb_initialize(DCB* dcb) * * @return An available DCB or NULL if none could be allocated. */ -DCB* dcb_alloc(dcb_role_t role, SERV_LISTENER* listener) +DCB* dcb_alloc(dcb_role_t role, SERV_LISTENER* listener, SERVICE* service) { DCB* newdcb; @@ -192,6 +192,7 @@ DCB* dcb_alloc(dcb_role_t role, SERV_LISTENER* listener) dcb_initialize(newdcb); newdcb->dcb_role = role; newdcb->listener = listener; + newdcb->service = service; newdcb->last_read = mxs_clock(); newdcb->low_water = config_writeq_low_water(); newdcb->high_water = config_writeq_high_water(); @@ -410,7 +411,7 @@ DCB* dcb_connect(SERVER* server, MXS_SESSION* session, const char* protocol) } } - if ((dcb = dcb_alloc(DCB_ROLE_BACKEND_HANDLER, NULL)) == NULL) + if ((dcb = dcb_alloc(DCB_ROLE_BACKEND_HANDLER, NULL, session->service)) == NULL) { return NULL; } @@ -2401,7 +2402,7 @@ DCB* dcb_accept(DCB* dcb) configure_network_socket(c_sock, client_conn.ss_family); - client_dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, dcb->listener); + client_dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, dcb->listener, dcb->service); if (client_dcb == NULL) { diff --git a/server/core/test/test_dcb.cc b/server/core/test/test_dcb.cc index 7ec3c69ac..7efa34af4 100644 --- a/server/core/test/test_dcb.cc +++ b/server/core/test/test_dcb.cc @@ -51,7 +51,7 @@ static int test1() SERV_LISTENER* dummy = nullptr; /* Single buffer tests */ fprintf(stderr, "testdcb : creating buffer with type DCB_ROLE_INTERNAL"); - dcb = dcb_alloc(DCB_ROLE_INTERNAL, dummy); + dcb = dcb_alloc(DCB_ROLE_INTERNAL, dummy, NULL); printDCB(dcb); fprintf(stderr, "\t..done\nAllocated dcb."); // TODO: Without running workers, the following will hang. As it does not diff --git a/server/core/test/test_poll.cc b/server/core/test/test_poll.cc index d26d08534..905e16db1 100644 --- a/server/core/test/test_poll.cc +++ b/server/core/test/test_poll.cc @@ -59,7 +59,7 @@ static int test1() "testpoll : Initialise the polling system."); init_test_env(NULL); fprintf(stderr, "\t..done\nAdd a DCB"); - dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, dummy); + dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, dummy, NULL); if (dcb == NULL) { diff --git a/server/modules/routing/binlogrouter/blr_master.cc b/server/modules/routing/binlogrouter/blr_master.cc index 67942ad1a..d9253c14e 100644 --- a/server/modules/routing/binlogrouter/blr_master.cc +++ b/server/modules/routing/binlogrouter/blr_master.cc @@ -186,7 +186,7 @@ static void blr_start_master(void* data) pthread_mutex_unlock(&router->lock); - DCB* client = dcb_alloc(DCB_ROLE_INTERNAL, NULL); + DCB* client = dcb_alloc(DCB_ROLE_INTERNAL, NULL, NULL); /* Create fake 'client' DCB */ if (client == NULL)