Deliver hangups only to valid DCBs
If a DCB was closed and a hangup event was sent to it via dcb_hangup_foreach shortly after it was closed, the DCB would still receive it even if it was closed. To prevent this, events must only be delivered to DCBs if they haven't been closed.
This commit is contained in:
@ -47,7 +47,7 @@ Backend::~Backend()
|
||||
|
||||
void Backend::close(close_type type)
|
||||
{
|
||||
mxb_assert(m_dcb->n_close == 0);
|
||||
mxb_assert(m_dcb && m_dcb->n_close == 0);
|
||||
|
||||
if (!m_closed)
|
||||
{
|
||||
@ -180,7 +180,7 @@ void Backend::set_state(backend_state state)
|
||||
|
||||
bool Backend::connect(MXS_SESSION* session, SessionCommandList* sescmd)
|
||||
{
|
||||
mxb_assert(!in_use());
|
||||
mxb_assert(!in_use() && m_dcb == nullptr);
|
||||
bool rval = false;
|
||||
|
||||
if ((m_dcb = dcb_connect(m_backend->server, session, m_backend->server->protocol)))
|
||||
|
@ -2041,8 +2041,7 @@ static void dcb_hangup_foreach_worker(MXB_WORKER* worker, struct server* server)
|
||||
|
||||
for (DCB* dcb = this_unit.all_dcbs[id]; dcb; dcb = dcb->thread.next)
|
||||
{
|
||||
if (dcb->state == DCB_STATE_POLLING && dcb->server
|
||||
&& dcb->server == server)
|
||||
if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server && dcb->n_close == 0)
|
||||
{
|
||||
dcb->flags |= DCBF_HUNG;
|
||||
dcb->func.hangup(dcb);
|
||||
|
@ -1354,6 +1354,7 @@ static int gw_error_backend_event(DCB* dcb)
|
||||
*/
|
||||
static int gw_backend_hangup(DCB* dcb)
|
||||
{
|
||||
mxb_assert(dcb->n_close == 0);
|
||||
MXS_SESSION* session = dcb->session;
|
||||
|
||||
if (dcb->persistentstart)
|
||||
|
Reference in New Issue
Block a user