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
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
3 changed files with 4 additions and 4 deletions

View File

@ -47,7 +47,7 @@ Backend::~Backend()
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)
{
@ -180,7 +180,7 @@ void Backend::set_state(backend_state state)
bool Backend::connect(MXS_SESSION* session, SessionCommandList* sescmd)
{
mxb_assert(!in_use());
mxb_assert(!in_use() && m_dcb == nullptr);
bool rval = false;
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)
{
if (dcb->state == DCB_STATE_POLLING && dcb->server
&& dcb->server == server)
if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server && dcb->n_close == 0)
{
dcb->flags |= DCBF_HUNG;
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)
{
mxb_assert(dcb->n_close == 0);
MXS_SESSION* session = dcb->session;
if (dcb->persistentstart)