diff --git a/hub/elastic_sync/service.py b/hub/elastic_sync/service.py index ee246be..5044a49 100644 --- a/hub/elastic_sync/service.py +++ b/hub/elastic_sync/service.py @@ -1,3 +1,4 @@ +import errno import os import json import typing @@ -55,9 +56,24 @@ class ElasticSyncService(BlockchainReaderService): ) async def run_es_notifier(self, synchronized: asyncio.Event): - server = await asyncio.get_event_loop().create_server( - lambda: ElasticNotifierProtocol(self._listeners), self.env.elastic_notifier_host, self.env.elastic_notifier_port - ) + started = False + while not started: + try: + server = await asyncio.get_event_loop().create_server( + lambda: ElasticNotifierProtocol(self._listeners), + self.env.elastic_notifier_host, + self.env.elastic_notifier_port + ) + started = True + except Exception as e: + if not isinstance(e, asyncio.CancelledError): + self.log.error(f'ES notifier server failed to listen on ' + f'{self.env.elastic_notifier_host}:' + f'{self.env.elastic_notifier_port:d} : {e!r}') + if isinstance(e, OSError) and e.errno is errno.EADDRINUSE: + await asyncio.sleep(3) + continue + raise self.log.info("ES notifier server listening on TCP %s:%i", self.env.elastic_notifier_host, self.env.elastic_notifier_port) synchronized.set() diff --git a/hub/herald/session.py b/hub/herald/session.py index 72662f3..7a04f0d 100644 --- a/hub/herald/session.py +++ b/hub/herald/session.py @@ -271,9 +271,10 @@ class SessionManager: host, port = args[:2] try: self.servers[kind] = await loop.create_server(protocol_factory, *args, **kw_args) - except OSError as e: # don't suppress CancelledError - self.logger.error(f'{kind} server failed to listen on {host}:' - f'{port:d} :{e!r}') + except Exception as e: + if not isinstance(e, asyncio.CancelledError): + self.logger.error(f'{kind} server failed to listen on ' + f'{host}:{port:d} : {e!r}') raise else: self.logger.info(f'{kind} server listening on {host}:{port:d}')