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:
parent
71a3cde441
commit
7db87784ac
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user