diff --git a/server/core/dcb.c b/server/core/dcb.c index 9e94150a8..4bd51d9a2 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -2423,6 +2423,9 @@ static bool dcb_set_state_nomutex( case DCB_STATE_NOPOLLING: switch (new_state) { + /** Stopped services which are restarting will go from + * DCB_STATE_NOPOLLING to DCB_STATE_LISTENING.*/ + case DCB_STATE_LISTENING: case DCB_STATE_ZOMBIE: /*< fall through */ dcb->state = new_state; case DCB_STATE_POLLING: /*< ok to try but state can't change */ diff --git a/server/core/poll.c b/server/core/poll.c index 377310cb0..9a1a5565d 100644 --- a/server/core/poll.c +++ b/server/core/poll.c @@ -330,7 +330,8 @@ poll_remove_dcb(DCB *dcb) CHK_DCB(dcb); /*< It is possible that dcb has already been removed from the set */ - if (dcb->state != DCB_STATE_POLLING) + if (dcb->state != DCB_STATE_POLLING && + dcb->state != DCB_STATE_LISTENING) { if (dcb->state == DCB_STATE_NOPOLLING || dcb->state == DCB_STATE_ZOMBIE) diff --git a/server/core/service.c b/server/core/service.c index b0959e6c3..24d51542d 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -534,11 +534,16 @@ int listeners = 0; port = service->ports; while (port) { - poll_remove_dcb(port->listener); - port->listener->session->state = SESSION_STATE_LISTENER_STOPPED; - listeners++; - - port = port->next; + if(port->listener && + port->listener->session->state == SESSION_STATE_LISTENER) + { + if(poll_remove_dcb(port->listener) == 0) + { + port->listener->session->state = SESSION_STATE_LISTENER_STOPPED; + listeners++; + } + } + port = port->next; } service->state = SERVICE_STATE_STOPPED; @@ -562,13 +567,18 @@ int listeners = 0; port = service->ports; while (port) { - if (poll_add_dcb(port->listener) == 0) { - port->listener->session->state = SESSION_STATE_LISTENER; - listeners++; - } - port = port->next; + if(port->listener && + port->listener->session->state == SESSION_STATE_LISTENER_STOPPED) + { + if(poll_add_dcb(port->listener) == 0) + { + port->listener->session->state = SESSION_STATE_LISTENER; + listeners++; + } + } + port = port->next; } - + service->state = SERVICE_STATE_STARTED; return listeners; }