Fix issues with error handling needing to cater for both client and backend DCBs.

This commit is contained in:
counterpoint
2015-11-02 16:27:44 +00:00
parent bad61b0740
commit 1b04a0cf91

View File

@ -125,7 +125,7 @@ static void handleError(
ROUTER *instance,
void *router_session,
GWBUF *errbuf,
DCB *backend_dcb,
DCB *problem_dcb,
error_action_t action,
bool *succp);
static uint8_t getCapabilities (ROUTER* inst, void* router_session);
@ -837,12 +837,12 @@ clientReply(
/**
* Error Handler routine
*
* The routine will handle errors that occurred in backend writes.
* The routine will handle errors that occurred in writes.
*
* @param instance The router instance
* @param router_session The router session
* @param message The error message to reply
* @param backend_dcb The backend DCB
* @param problem_dcb The DCB related to the error
* @param action The action: ERRACT_NEW_CONNECTION or ERRACT_REPLY_CLIENT
* @param succp Result of action: true if router can continue
*
@ -851,18 +851,18 @@ static void handleError(
ROUTER *instance,
void *router_session,
GWBUF *errbuf,
DCB *backend_dcb,
DCB *problem_dcb,
error_action_t action,
bool *succp)
{
DCB *client_dcb;
SESSION *session = backend_dcb->session;
SESSION *session = problem_dcb->session;
session_state_t sesstate;
ROUTER_CLIENT_SES *router_cli_ses = (ROUTER_CLIENT_SES *)router_session;
/** 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;
@ -870,7 +870,7 @@ static void handleError(
}
else
{
backend_dcb->dcb_errhandle_called = true;
problem_dcb->dcb_errhandle_called = true;
}
spinlock_acquire(&session->ses_lock);
sesstate = session->state;
@ -887,20 +887,15 @@ static void handleError(
spinlock_release(&session->ses_lock);
}
if (router_cli_ses && router_cli_ses->backend_dcb) {
if (backend_dcb != router_cli_ses->backend_dcb)
{
/* Linkages have gone badly wrong */
LOGIF(LE, (skygw_log_write(LOGFILE_ERROR,
"Read Connection Router error in handleError: router client "
"session DCB %p is not null, but does not match backend DCB %p "
"either. \n",
router_cli_ses->backend_dcb,
backend_dcb)));
}
router_cli_ses->backend_dcb = NULL;
if (dcb_isclient(problem_dcb))
{
dcb_close(problem_dcb);
}
else if (router_cli_ses && problem_dcb == router_cli_ses->backend_dcb)
{
router_cli_ses->backend_dcb = NULL;
dcb_close(problem_dcb);
}
dcb_close(backend_dcb);
/** false because connection is not available anymore */
*succp = false;