From b2cd90bb08b3380a2c34d6243d623c8abec8d323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 28 Feb 2017 11:28:22 +0200 Subject: [PATCH] Only use get_bref_from_dcb with backend DCBs Altered the function to assert that the DCB is a backend DCB in addition to the existing assertions for non-NULL backend reference on function return. Move the fetching of the backend reference after the type of the DCB is inspected in handleError. This removes the need to handle the case where the returned bref is NULL and the DCB is a client DCB. --- .../routing/readwritesplit/readwritesplit.c | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index d96560c9d..4c4d5ebab 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -1031,32 +1031,21 @@ int rses_get_max_replication_lag(ROUTER_CLIENT_SES *rses) */ backend_ref_t *get_bref_from_dcb(ROUTER_CLIENT_SES *rses, DCB *dcb) { - backend_ref_t *bref; - int i = 0; + ss_dassert(dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER); CHK_DCB(dcb); CHK_CLIENT_RSES(rses); - bref = rses->rses_backend_ref; - - while (i < rses->rses_nbackends) + for (int i = 0; i < rses->rses_nbackends; i++) { - if (bref->bref_dcb == dcb) + if (rses->rses_backend_ref[i].bref_dcb == dcb) { - break; + return &rses->rses_backend_ref[i]; } - bref++; - i += 1; - } - - if (i == rses->rses_nbackends) - { - bref = NULL; } /** We should always have a valid backend reference */ - ss_dassert(bref); - - return bref; + ss_dassert(false); + return NULL; } /** @@ -1258,10 +1247,9 @@ static void handleError(MXS_ROUTER *instance, mxs_error_action_t action, bool *succp) { - MXS_SESSION *session; ROUTER_INSTANCE *inst = (ROUTER_INSTANCE *)instance; ROUTER_CLIENT_SES *rses = (ROUTER_CLIENT_SES *)router_session; - + CHK_CLIENT_RSES(rses); CHK_DCB(problem_dcb); if (rses->rses_closed) @@ -1287,25 +1275,18 @@ static void handleError(MXS_ROUTER *instance, { problem_dcb->dcb_errhandle_called = true; } - session = problem_dcb->session; - backend_ref_t *bref = get_bref_from_dcb(rses, problem_dcb); + MXS_SESSION *session = problem_dcb->session; + ss_dassert(session); - if (session == NULL) - { - MXS_ERROR("Session of DCB %p is NULL, won't close the DCB.", problem_dcb); - ss_dassert(false); - *succp = false; - } - else if (DCB_ROLE_CLIENT_HANDLER == problem_dcb->dcb_role) + if (problem_dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER) { dcb_close(problem_dcb); *succp = false; } else { - CHK_SESSION(session); - CHK_CLIENT_RSES(rses); + backend_ref_t *bref = get_bref_from_dcb(rses, problem_dcb); switch (action) {