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:
@ -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
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user