From 4de81540647b108427224e72ddc5b748097abeec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 11 Oct 2016 16:34:30 +0200 Subject: [PATCH] Stop event queue on shutdown and join on it --- src/octoprint/events.py | 14 +++++++++++++- src/octoprint/server/__init__.py | 5 +++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/octoprint/events.py b/src/octoprint/events.py index 8a31f8fc..1791d5cb 100644 --- a/src/octoprint/events.py +++ b/src/octoprint/events.py @@ -124,15 +124,22 @@ class EventManager(object): self._registeredListeners = collections.defaultdict(list) self._logger = logging.getLogger(__name__) + self._shutdown_signaled = False + self._queue = queue.Queue() + self._worker = threading.Thread(target=self._work) self._worker.daemon = True self._worker.start() def _work(self): try: - while True: + while not self._shutdown_signaled: event, payload = self._queue.get(True) + if event == Events.SHUTDOWN: + # we've got the shutdown event here, stop event loop processing after this has been processed + self._logger.info("Processing shutdown event, this will be our last event") + self._shutdown_signaled = True eventListeners = self._registeredListeners[event] self._logger.debug("Firing event: %s (Payload: %r)" % (event, payload)) @@ -147,6 +154,7 @@ class EventManager(object): octoprint.plugin.call_plugin(octoprint.plugin.types.EventHandlerPlugin, "on_event", args=(event, payload)) + self._logger.info("Event loop shut down") except: self._logger.exception("Ooops, the event bus worker loop crashed") @@ -195,6 +203,10 @@ class EventManager(object): self._registeredListeners[event].remove(callback) self._logger.debug("Unsubscribed listener %r for event %s" % (callback, event)) + def join(self, timeout=None): + self._worker.join(timeout) + return self._worker.is_alive() + class GenericEventListener(object): """ diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 0ddc18f4..7e98e146 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -525,6 +525,11 @@ class Server(object): "on_shutdown", sorting_context="ShutdownPlugin.on_shutdown") + # wait for shutdown even to be processed, but maximally for 15s + event_timeout = 15.0 + if eventManager.join(timeout=event_timeout): + self._logger.warn("Event loop was still busy processing after {}s, shutting down anyhow".format(event_timeout)) + if self._octoprint_daemon is not None: self._logger.info("Cleaning up daemon pidfile") self._octoprint_daemon.terminated()