MXS-2196: Fix dcb error flag assignment

The error flag was set before the function was called which caused the
function to never be used. As the core should handle the filtering of
multiple errors on the same DCB, the protocol modules should not check it.
This commit is contained in:
Markus Mäkelä
2018-12-05 14:24:13 +02:00
parent 01ba8bf886
commit 7aaadfc550
2 changed files with 17 additions and 20 deletions

View File

@ -1927,8 +1927,11 @@ static void dcb_hangup_foreach_worker(MXB_WORKER* worker, struct SERVER* server)
{ {
if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server) if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server)
{ {
dcb->dcb_errhandle_called = true; if (!dcb->dcb_errhandle_called)
dcb->func.hangup(dcb); {
dcb->func.hangup(dcb);
dcb->dcb_errhandle_called = true;
}
} }
} }
} }
@ -2673,13 +2676,13 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
if (!dcb->dcb_errhandle_called) if (!dcb->dcb_errhandle_called)
{ {
dcb->dcb_errhandle_called = true;
if (dcb_session_check(dcb, "hangup EPOLLHUP")) if (dcb_session_check(dcb, "hangup EPOLLHUP"))
{ {
DCB_EH_NOTICE("Calling dcb->func.hangup(%p)", dcb); DCB_EH_NOTICE("Calling dcb->func.hangup(%p)", dcb);
dcb->func.hangup(dcb); dcb->func.hangup(dcb);
} }
dcb->dcb_errhandle_called = true;
} }
} }
@ -2700,13 +2703,13 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events)
if (!dcb->dcb_errhandle_called) if (!dcb->dcb_errhandle_called)
{ {
dcb->dcb_errhandle_called = true;
if (dcb_session_check(dcb, "hangup EPOLLRDHUP")) if (dcb_session_check(dcb, "hangup EPOLLRDHUP"))
{ {
DCB_EH_NOTICE("Calling dcb->func.hangup(%p)", dcb); DCB_EH_NOTICE("Calling dcb->func.hangup(%p)", dcb);
dcb->func.hangup(dcb); dcb->func.hangup(dcb);
} }
dcb->dcb_errhandle_called = true;
} }
} }
#endif #endif

View File

@ -577,22 +577,16 @@ static void do_handle_error(DCB* dcb, mxs_error_action_t action, const char* err
bool succp = true; bool succp = true;
MXS_SESSION* session = dcb->session; MXS_SESSION* session = dcb->session;
if (!dcb->dcb_errhandle_called) mxb_assert(!dcb->dcb_errhandle_called);
{
GWBUF* errbuf = mysql_create_custom_error(1, 0, errmsg);
MXS_ROUTER_SESSION* rsession = static_cast<MXS_ROUTER_SESSION*>(session->router_session);
MXS_ROUTER_OBJECT* router = session->service->router;
MXS_ROUTER* router_instance = session->service->router_instance;
router->handleError(router_instance, GWBUF* errbuf = mysql_create_custom_error(1, 0, errmsg);
rsession, MXS_ROUTER_SESSION* rsession = static_cast<MXS_ROUTER_SESSION*>(session->router_session);
errbuf, MXS_ROUTER_OBJECT* router = session->service->router;
dcb, MXS_ROUTER* router_instance = session->service->router_instance;
action,
&succp);
gwbuf_free(errbuf); router->handleError(router_instance, rsession, errbuf, dcb, action, &succp);
}
gwbuf_free(errbuf);
/** /**
* If error handler fails it means that routing session can't continue * If error handler fails it means that routing session can't continue
* and it must be closed. In success, only this DCB is closed. * and it must be closed. In success, only this DCB is closed.