From 12f5cabc5027886808d8b5c6f8edd80bba738235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 31 Jan 2018 10:35:20 +0200 Subject: [PATCH] Discard fake events for closed DCBs If a fake event is sent to a DCB that has been closed, it should be discarded. --- server/core/dcb.cc | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/server/core/dcb.cc b/server/core/dcb.cc index 701159efd..151e990eb 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -3209,6 +3209,26 @@ static uint32_t dcb_poll_handler(MXS_POLL_DATA *data, int thread_id, uint32_t ev return dcb_handler(dcb, events); } +static bool dcb_is_still_valid(DCB* target, int id) +{ + bool rval = false; + + for (DCB *dcb = this_unit.all_dcbs[id]; + dcb; dcb = dcb->thread.next) + { + if (target == dcb) + { + if (dcb->n_close == 0) + { + rval = true; + } + break; + } + } + + return rval; +} + class FakeEventTask: public mxs::WorkerDisposableTask { FakeEventTask(const FakeEventTask&); @@ -3224,8 +3244,15 @@ public: void execute(Worker& worker) { - m_dcb->fakeq = m_buffer; - dcb_handler(m_dcb, m_ev); + if (dcb_is_still_valid(m_dcb, worker.get_current_id())) + { + m_dcb->fakeq = m_buffer; + dcb_handler(m_dcb, m_ev); + } + else + { + gwbuf_free(m_buffer); + } } private: