Fix to MXS-323: Routers properly handle client DCB errors
All routers now detect if a client DCB is passed to handleError and take the appropriate action.
This commit is contained in:
@ -4670,7 +4670,7 @@ static void handleError (
|
||||
ROUTER* instance,
|
||||
void* router_session,
|
||||
GWBUF* errmsgbuf,
|
||||
DCB* backend_dcb,
|
||||
DCB* problem_dcb,
|
||||
error_action_t action,
|
||||
bool* succp)
|
||||
{
|
||||
@ -4678,10 +4678,10 @@ static void handleError (
|
||||
ROUTER_INSTANCE* inst = (ROUTER_INSTANCE *)instance;
|
||||
ROUTER_CLIENT_SES* rses = (ROUTER_CLIENT_SES *)router_session;
|
||||
|
||||
CHK_DCB(backend_dcb);
|
||||
CHK_DCB(problem_dcb);
|
||||
|
||||
/** Don't handle same error twice on same DCB */
|
||||
if (backend_dcb->dcb_errhandle_called)
|
||||
if (problem_dcb->dcb_errhandle_called)
|
||||
{
|
||||
/** we optimistically assume that previous call succeed */
|
||||
/*
|
||||
@ -4693,14 +4693,18 @@ static void handleError (
|
||||
}
|
||||
else
|
||||
{
|
||||
backend_dcb->dcb_errhandle_called = true;
|
||||
problem_dcb->dcb_errhandle_called = true;
|
||||
}
|
||||
session = backend_dcb->session;
|
||||
session = problem_dcb->session;
|
||||
|
||||
if (session == NULL || rses == NULL)
|
||||
{
|
||||
*succp = false;
|
||||
}
|
||||
}
|
||||
else if (dcb_isclient(problem_dcb))
|
||||
{
|
||||
*succp = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
CHK_SESSION(session);
|
||||
@ -4721,11 +4725,11 @@ static void handleError (
|
||||
* If master has lost its Master status error can't be
|
||||
* handled so that session could continue.
|
||||
*/
|
||||
if (rses->rses_master_ref->bref_dcb == backend_dcb &&
|
||||
if (rses->rses_master_ref->bref_dcb == problem_dcb &&
|
||||
!SERVER_IS_MASTER(srv))
|
||||
{
|
||||
backend_ref_t* bref;
|
||||
bref = get_bref_from_dcb(rses, backend_dcb);
|
||||
bref = get_bref_from_dcb(rses, problem_dcb);
|
||||
if (bref != NULL)
|
||||
{
|
||||
CHK_BACKEND_REF(bref);
|
||||
@ -4739,7 +4743,7 @@ static void handleError (
|
||||
"corresponding backend ref.",
|
||||
srv->name,
|
||||
srv->port);
|
||||
dcb_close(backend_dcb);
|
||||
dcb_close(problem_dcb);
|
||||
}
|
||||
if (!srv->master_err_is_logged)
|
||||
{
|
||||
@ -4761,7 +4765,7 @@ static void handleError (
|
||||
*/
|
||||
*succp = handle_error_new_connection(inst,
|
||||
&rses,
|
||||
backend_dcb,
|
||||
problem_dcb,
|
||||
errmsgbuf);
|
||||
}
|
||||
/* Free the lock if rses still exists */
|
||||
@ -4773,7 +4777,7 @@ static void handleError (
|
||||
{
|
||||
handle_error_reply_client(session,
|
||||
rses,
|
||||
backend_dcb,
|
||||
problem_dcb,
|
||||
errmsgbuf);
|
||||
*succp = false; /*< no new backend servers were made available */
|
||||
break;
|
||||
@ -4784,7 +4788,7 @@ static void handleError (
|
||||
break;
|
||||
}
|
||||
}
|
||||
dcb_close(backend_dcb);
|
||||
dcb_close(problem_dcb);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4018,7 +4018,7 @@ static void handleError (
|
||||
ROUTER* instance,
|
||||
void* router_session,
|
||||
GWBUF* errmsgbuf,
|
||||
DCB* backend_dcb,
|
||||
DCB* problem_dcb,
|
||||
error_action_t action,
|
||||
bool* succp)
|
||||
{
|
||||
@ -4026,10 +4026,10 @@ static void handleError (
|
||||
ROUTER_INSTANCE* inst = (ROUTER_INSTANCE *)instance;
|
||||
ROUTER_CLIENT_SES* rses = (ROUTER_CLIENT_SES *)router_session;
|
||||
|
||||
CHK_DCB(backend_dcb);
|
||||
CHK_DCB(problem_dcb);
|
||||
|
||||
/** Don't handle same error twice on same DCB */
|
||||
if (backend_dcb->dcb_errhandle_called)
|
||||
if (problem_dcb->dcb_errhandle_called)
|
||||
{
|
||||
/** we optimistically assume that previous call succeed */
|
||||
*succp = true;
|
||||
@ -4037,14 +4037,18 @@ static void handleError (
|
||||
}
|
||||
else
|
||||
{
|
||||
backend_dcb->dcb_errhandle_called = true;
|
||||
problem_dcb->dcb_errhandle_called = true;
|
||||
}
|
||||
session = backend_dcb->session;
|
||||
session = problem_dcb->session;
|
||||
|
||||
if (session == NULL || rses == NULL)
|
||||
{
|
||||
*succp = false;
|
||||
}
|
||||
else if (dcb_isclient(problem_dcb))
|
||||
{
|
||||
*succp = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
CHK_SESSION(session);
|
||||
@ -4064,7 +4068,7 @@ static void handleError (
|
||||
*/
|
||||
*succp = handle_error_new_connection(inst,
|
||||
rses,
|
||||
backend_dcb,
|
||||
problem_dcb,
|
||||
errmsgbuf);
|
||||
rses_end_locked_router_action(rses);
|
||||
break;
|
||||
@ -4074,7 +4078,7 @@ static void handleError (
|
||||
{
|
||||
handle_error_reply_client(session,
|
||||
rses,
|
||||
backend_dcb,
|
||||
problem_dcb,
|
||||
errmsgbuf);
|
||||
*succp = false; /*< no new backend servers were made available */
|
||||
break;
|
||||
@ -4085,7 +4089,7 @@ static void handleError (
|
||||
break;
|
||||
}
|
||||
}
|
||||
dcb_close(backend_dcb);
|
||||
dcb_close(problem_dcb);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user