readwritesplit.c:handleError is meant to handle backend errors. Removed one call from mysql_client.c and only send error message to client instead.
Added checks to debug build to ensure that handleError is called before backend DCB is closed.
This commit is contained in:
@ -394,7 +394,8 @@ static int gw_read_backend_event(DCB *dcb) {
|
|||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
}
|
||||||
dcb_close(dcb);
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
|
dcb_close(dcb);
|
||||||
}
|
}
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto return_rc;
|
goto return_rc;
|
||||||
@ -468,6 +469,7 @@ static int gw_read_backend_event(DCB *dcb) {
|
|||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
}
|
||||||
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
rc = 0;
|
rc = 0;
|
||||||
goto return_rc;
|
goto return_rc;
|
||||||
@ -858,6 +860,7 @@ static int gw_error_backend_event(DCB *dcb)
|
|||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
}
|
||||||
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
|
|
||||||
retblock:
|
retblock:
|
||||||
@ -1047,6 +1050,7 @@ gw_backend_hangup(DCB *dcb)
|
|||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
}
|
||||||
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
|
|
||||||
retblock:
|
retblock:
|
||||||
@ -1189,6 +1193,7 @@ static int backend_write_delayqueue(DCB *dcb)
|
|||||||
session->state = SESSION_STATE_STOPPING;
|
session->state = SESSION_STATE_STOPPING;
|
||||||
spinlock_release(&session->ses_lock);
|
spinlock_release(&session->ses_lock);
|
||||||
}
|
}
|
||||||
|
ss_dassert(dcb->dcb_errhandle_called);
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -838,29 +838,18 @@ int gw_read_client_event(
|
|||||||
{
|
{
|
||||||
GWBUF* errbuf;
|
GWBUF* errbuf;
|
||||||
bool succp;
|
bool succp;
|
||||||
|
|
||||||
errbuf = mysql_create_custom_error(
|
modutil_send_mysql_err_packet(dcb,
|
||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
"Write to backend failed. Session closed.");
|
2003,
|
||||||
#if defined(SS_DEBUG)
|
"HY000",
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
"Write to backend failed. Session closed.");
|
||||||
LOGFILE_ERROR,
|
LOGIF(LE, (skygw_log_write_flush(
|
||||||
"Client routing error handling.")));
|
LOGFILE_ERROR,
|
||||||
#endif
|
"Error : Routing the query failed. "
|
||||||
LOGIF(LE, (skygw_log_write_flush(
|
"Session will be closed.")));
|
||||||
LOGFILE_ERROR,
|
|
||||||
"Error : Routing the query failed. "
|
|
||||||
"Session will be closed.")));
|
|
||||||
|
|
||||||
router->handleError(router_instance,
|
|
||||||
rsession,
|
|
||||||
errbuf,
|
|
||||||
dcb,
|
|
||||||
ERRACT_REPLY_CLIENT,
|
|
||||||
&succp);
|
|
||||||
gwbuf_free(errbuf);
|
|
||||||
ss_dassert(!succp);
|
|
||||||
|
|
||||||
dcb_close(dcb);
|
dcb_close(dcb);
|
||||||
}
|
}
|
||||||
|
@ -1730,7 +1730,10 @@ static int routeQuery(
|
|||||||
goto retblock;
|
goto retblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read stored master DCB pointer */
|
/**
|
||||||
|
* Read stored master DCB pointer. If master is not set, routing must
|
||||||
|
* be aborted
|
||||||
|
*/
|
||||||
if ((master_dcb = router_cli_ses->rses_master_ref->bref_dcb) == NULL)
|
if ((master_dcb = router_cli_ses->rses_master_ref->bref_dcb) == NULL)
|
||||||
{
|
{
|
||||||
char* query_str = modutil_get_query(querybuf);
|
char* query_str = modutil_get_query(querybuf);
|
||||||
@ -2074,8 +2077,15 @@ static int routeQuery(
|
|||||||
"suitable state "
|
"suitable state "
|
||||||
"failed.")));
|
"failed.")));
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Master has changed. Set the dcb pointer NULL and
|
||||||
|
* return with error indicator.
|
||||||
|
*/
|
||||||
|
router_cli_ses->rses_master_ref->bref_dcb = NULL;
|
||||||
|
rses_end_locked_router_action(router_cli_ses);
|
||||||
succp = false;
|
succp = false;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
goto retblock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4048,7 +4058,7 @@ static void rwsplit_process_router_options(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error Handler routine to resolve backend failures. If it succeeds then there
|
* Error Handler routine to resolve _backend_ failures. If it succeeds then there
|
||||||
* are enough operative backends available and connected. Otherwise it fails,
|
* are enough operative backends available and connected. Otherwise it fails,
|
||||||
* and session is terminated.
|
* and session is terminated.
|
||||||
*
|
*
|
||||||
@ -4077,6 +4087,7 @@ static void handleError (
|
|||||||
|
|
||||||
CHK_DCB(backend_dcb);
|
CHK_DCB(backend_dcb);
|
||||||
#if defined(SS_DEBUG)
|
#if defined(SS_DEBUG)
|
||||||
|
ss_dassert(!backend_dcb->dcb_errhandle_called);
|
||||||
backend_dcb->dcb_errhandle_called = true;
|
backend_dcb->dcb_errhandle_called = true;
|
||||||
#endif
|
#endif
|
||||||
session = backend_dcb->session;
|
session = backend_dcb->session;
|
||||||
|
Reference in New Issue
Block a user