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:
VilhoRaatikka
2014-11-07 17:55:05 +02:00
parent 4f39828fa1
commit 44771dbc51
3 changed files with 31 additions and 26 deletions

View File

@ -394,6 +394,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 = 1; rc = 1;
@ -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);
} }
} }

View File

@ -839,28 +839,17 @@ 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,
2003,
"HY000",
"Write to backend failed. Session closed."); "Write to backend failed. Session closed.");
#if defined(SS_DEBUG)
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"Client routing error handling.")));
#endif
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Error : Routing the query failed. " "Error : Routing the query failed. "
"Session will be closed."))); "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);
} }

View File

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