Discard fake events for closed DCBs

If a fake event is sent to a DCB that has been closed, it should be
discarded.
This commit is contained in:
Markus Mäkelä
2018-01-31 10:35:20 +02:00
parent 1febafabf3
commit 12f5cabc50

View File

@ -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: