From 96746583a237145a087203bc5efb66edc9e7f924 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 15 Apr 2019 10:26:57 +0530 Subject: [PATCH] Limit the amount of time to wait for BonJour to shutdown --- src/calibre/srv/bonjour.py | 5 +++-- src/calibre/srv/embedded.py | 2 +- src/calibre/srv/standalone.py | 2 +- src/calibre/srv/tests/loop.py | 2 +- src/calibre/utils/mdns.py | 22 ++++++++++++++-------- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/calibre/srv/bonjour.py b/src/calibre/srv/bonjour.py index 55c5ce3af9..c840f3502d 100644 --- a/src/calibre/srv/bonjour.py +++ b/src/calibre/srv/bonjour.py @@ -11,8 +11,9 @@ from threading import Event class BonJour(object): # {{{ - def __init__(self, name='Books in calibre', service_type='_calibre._tcp', path='/opds', add_hostname=True): + def __init__(self, name='Books in calibre', service_type='_calibre._tcp', path='/opds', add_hostname=True, wait_for_stop=True): self.service_name = name + self.wait_for_stop = wait_for_stop self.service_type = service_type self.add_hostname = add_hostname self.path = path @@ -42,6 +43,6 @@ class BonJour(object): # {{{ self.shutdown.wait() for s in mdns_services: - unpublish(*s, add_hostname=self.add_hostname) + unpublish(*s, add_hostname=self.add_hostname, wait_for_stop=self.wait_for_stop) self.stopped.set() # }}} diff --git a/src/calibre/srv/embedded.py b/src/calibre/srv/embedded.py index b76e07ce5e..9403b32d37 100644 --- a/src/calibre/srv/embedded.py +++ b/src/calibre/srv/embedded.py @@ -66,7 +66,7 @@ class Server(object): self.handler = Handler(library_broker, opts, notify_changes=notify_changes) plugins = self.plugins = [] if opts.use_bonjour: - plugins.append(BonJour()) + plugins.append(BonJour(wait_for_stop=max(0, opts.shutdown_timeout - 0.2))) self.opts = opts self.log, self.access_log = log, access_log self.handler.set_log(self.log) diff --git a/src/calibre/srv/standalone.py b/src/calibre/srv/standalone.py index e2fd973341..da27be988e 100644 --- a/src/calibre/srv/standalone.py +++ b/src/calibre/srv/standalone.py @@ -75,7 +75,7 @@ class Server(object): self.handler.router.ctx.search_the_net_urls = json.load(f) plugins = [] if opts.use_bonjour: - plugins.append(BonJour()) + plugins.append(BonJour(wait_for_stop=max(0, opts.shutdown_timeout - 0.2))) self.loop = ServerLoop( create_http_handler(self.handler.dispatch), opts=opts, diff --git a/src/calibre/srv/tests/loop.py b/src/calibre/srv/tests/loop.py index 30c153d777..66c8a1f72c 100644 --- a/src/calibre/srv/tests/loop.py +++ b/src/calibre/srv/tests/loop.py @@ -119,7 +119,7 @@ class LoopTest(BaseTest): from zeroconf import Zeroconf else: from calibre.utils.Zeroconf import Zeroconf - b = BonJour() + b = BonJour(wait_for_stop=False) with TestServer(lambda data:(data.path[0] + data.read()), plugins=(b,), shutdown_timeout=5) as server: self.assertTrue(b.started.wait(5), 'BonJour not started') self.ae(b.advertised_port, server.address[1]) diff --git a/src/calibre/utils/mdns.py b/src/calibre/utils/mdns.py index 41db4713d5..b1435e1d15 100644 --- a/src/calibre/utils/mdns.py +++ b/src/calibre/utils/mdns.py @@ -191,7 +191,7 @@ def publish(desc, service_type, port, properties=None, add_hostname=True, use_ip return service -def unpublish(desc, service_type, port, properties=None, add_hostname=True): +def unpublish(desc, service_type, port, properties=None, add_hostname=True, wait_for_stop=True): ''' Unpublish a service. @@ -201,13 +201,19 @@ def unpublish(desc, service_type, port, properties=None, add_hostname=True): service = create_service(desc, service_type, port, properties, add_hostname) server.unregister_service(service) if len(server.services) == 0: - stop_server() + stop_server(wait_for_stop=wait_for_stop) -def stop_server(): +def stop_server(wait_for_stop=True): global _server - if _server is not None: - try: - _server.close() - finally: - _server = None + srv = _server + _server = None + if srv is not None: + t = Thread(target=srv.close) + t.daemon = True + t.start() + if wait_for_stop: + if wait_for_stop is True: + t.join() + else: + t.join(wait_for_stop)