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);
 | 
					    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
 | 
					class FakeEventTask: public mxs::WorkerDisposableTask
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    FakeEventTask(const FakeEventTask&);
 | 
					    FakeEventTask(const FakeEventTask&);
 | 
				
			||||||
@ -3224,8 +3244,15 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void execute(Worker& worker)
 | 
					    void execute(Worker& worker)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        m_dcb->fakeq = m_buffer;
 | 
					        if (dcb_is_still_valid(m_dcb, worker.get_current_id()))
 | 
				
			||||||
        dcb_handler(m_dcb, m_ev);
 | 
					        {
 | 
				
			||||||
 | 
					            m_dcb->fakeq = m_buffer;
 | 
				
			||||||
 | 
					            dcb_handler(m_dcb, m_ev);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            gwbuf_free(m_buffer);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user