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&);
 | 
			
		||||
@ -3223,10 +3243,17 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void execute(Worker& worker)
 | 
			
		||||
    {
 | 
			
		||||
        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:
 | 
			
		||||
    DCB*     m_dcb;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user