diff --git a/openstack/common/service.py b/openstack/common/service.py index 3d9f660..5a84429 100644 --- a/openstack/common/service.py +++ b/openstack/common/service.py @@ -23,7 +23,6 @@ import os import random import signal import sys -import threading import time try: @@ -35,6 +34,7 @@ except ImportError: UnsupportedOperation = None import eventlet +from eventlet import event from oslo.config import cfg from openstack.common import eventlet_backdoor @@ -419,10 +419,11 @@ class Service(object): self.tg = threadgroup.ThreadGroup(threads) # signal that the service is done shutting itself down: - self._done = threading.Event() + self._done = event.Event() def reset(self): - self._done = threading.Event() + # NOTE(Fengqian): docs for Event.reset() recommend against using it + self._done = event.Event() def start(self): pass @@ -431,7 +432,8 @@ class Service(object): self.tg.stop() self.tg.wait() # Signal that service cleanup is done: - self._done.set() + if not self._done.ready(): + self._done.send() def wait(self): self._done.wait() @@ -442,7 +444,7 @@ class Services(object): def __init__(self): self.services = [] self.tg = threadgroup.ThreadGroup() - self.done = threading.Event() + self.done = event.Event() def add(self, service): self.services.append(service) @@ -456,7 +458,8 @@ class Services(object): # Each service has performed cleanup, now signal that the run_service # wrapper threads can now die: - self.done.set() + if not self.done.ready(): + self.done.send() # reap threads: self.tg.stop() @@ -466,7 +469,7 @@ class Services(object): def restart(self): self.stop() - self.done = threading.Event() + self.done = event.Event() for restart_service in self.services: restart_service.reset() self.tg.add_thread(self.run_service, restart_service, self.done) diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index dfb3460..c54351d 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -25,11 +25,11 @@ import multiprocessing import os import signal import socket -import threading import time import traceback import eventlet +from eventlet import event import mock import mox @@ -274,11 +274,11 @@ class ServiceRestartTest(ServiceTestBase): class _Service(service.Service): def __init__(self): super(_Service, self).__init__() - self.init = threading.Event() + self.init = event.Event() self.cleaned_up = False def start(self): - self.init.set() + self.init.send() def stop(self): self.cleaned_up = True @@ -358,7 +358,7 @@ class LauncherTest(test.BaseTestCase): launcher.stop() self.assertTrue(svc.cleaned_up) - self.assertTrue(svc._done.is_set()) + self.assertTrue(svc._done.ready()) # make sure stop can be called more than once. (i.e. play nice with # unit test fixtures in nova bug #1199315)