Fix race condition in dispatcher start/stop (#887)

fixes #881
This commit is contained in:
Noam Meltzer 2017-10-21 14:40:24 +03:00 committed by GitHub
parent 3ed05991ad
commit 4b3315db6f
2 changed files with 14 additions and 2 deletions

View file

@ -183,14 +183,20 @@ class Dispatcher(object):
self.__async_queue.put(promise)
return promise
def start(self):
def start(self, ready=None):
"""Thread target of thread 'dispatcher'.
Runs in background and processes the update queue.
Args:
ready (:obj:`threading.Event`, optional): If specified, the event will be set once the
dispatcher is ready.
"""
if self.running:
self.logger.warning('already running')
if ready is not None:
ready.set()
return
if self.__exception_event.is_set():
@ -202,6 +208,9 @@ class Dispatcher(object):
self.running = True
self.logger.debug('Dispatcher started')
if ready is not None:
ready.set()
while 1:
try:
# Pop update from update queue.

View file

@ -199,10 +199,13 @@ class Updater(object):
# Create & start threads
self.job_queue.start()
self._init_thread(self.dispatcher.start, "dispatcher")
dispatcher_ready = Event()
self._init_thread(self.dispatcher.start, "dispatcher", ready=dispatcher_ready)
self._init_thread(self._start_polling, "updater", poll_interval, timeout,
read_latency, bootstrap_retries, clean, allowed_updates)
dispatcher_ready.wait()
# Return the update queue so the main thread can insert updates
return self.update_queue