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