Deliver hangups only to valid DCBs

If a DCB was closed and a hangup event was sent to it via
dcb_hangup_foreach shortly after it was closed, the DCB would still
receive it even if it was closed. To prevent this, events must only be
delivered to DCBs if they haven't been closed.
This commit is contained in:
Markus Mäkelä
2019-03-08 07:45:59 +02:00
parent 71a3cde441
commit 7db87784ac
3 changed files with 4 additions and 4 deletions

View File

@ -47,7 +47,7 @@ Backend::~Backend()
void Backend::close(close_type type) void Backend::close(close_type type)
{ {
mxb_assert(m_dcb->n_close == 0); mxb_assert(m_dcb && m_dcb->n_close == 0);
if (!m_closed) if (!m_closed)
{ {
@ -180,7 +180,7 @@ void Backend::set_state(backend_state state)
bool Backend::connect(MXS_SESSION* session, SessionCommandList* sescmd) bool Backend::connect(MXS_SESSION* session, SessionCommandList* sescmd)
{ {
mxb_assert(!in_use()); mxb_assert(!in_use() && m_dcb == nullptr);
bool rval = false; bool rval = false;
if ((m_dcb = dcb_connect(m_backend->server, session, m_backend->server->protocol))) if ((m_dcb = dcb_connect(m_backend->server, session, m_backend->server->protocol)))

View File

@ -2041,8 +2041,7 @@ static void dcb_hangup_foreach_worker(MXB_WORKER* worker, struct server* server)
for (DCB* dcb = this_unit.all_dcbs[id]; dcb; dcb = dcb->thread.next) for (DCB* dcb = this_unit.all_dcbs[id]; dcb; dcb = dcb->thread.next)
{ {
if (dcb->state == DCB_STATE_POLLING && dcb->server if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server && dcb->n_close == 0)
&& dcb->server == server)
{ {
dcb->flags |= DCBF_HUNG; dcb->flags |= DCBF_HUNG;
dcb->func.hangup(dcb); dcb->func.hangup(dcb);

View File

@ -1354,6 +1354,7 @@ static int gw_error_backend_event(DCB* dcb)
*/ */
static int gw_backend_hangup(DCB* dcb) static int gw_backend_hangup(DCB* dcb)
{ {
mxb_assert(dcb->n_close == 0);
MXS_SESSION* session = dcb->session; MXS_SESSION* session = dcb->session;
if (dcb->persistentstart) if (dcb->persistentstart)