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.
This commit is contained in:
Markus Mäkelä 2018-11-29 17:25:15 +02:00
parent bb295b5cbe
commit 67626d6c32
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
5 changed files with 8 additions and 7 deletions

View File

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

View File

@ -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)
{

View File

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

View File

@ -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)
{

View File

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