From 83813ff1ac71da6030f7181d3c8fe961491a51f3 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Thu, 9 Aug 2018 23:30:14 +0900 Subject: [PATCH 1/3] Extend SUPPRESS_MESSAGE_REGEX Fixes #521 --- electrumx/lib/server_base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/electrumx/lib/server_base.py b/electrumx/lib/server_base.py index 602ae90..1c8dfe3 100644 --- a/electrumx/lib/server_base.py +++ b/electrumx/lib/server_base.py @@ -23,12 +23,12 @@ class ServerBase(object): Derived classes are expected to: - - set PYTHON_MIN_VERSION and SUPPRESS_MESSAGES as appropriate + - set PYTHON_MIN_VERSION and SUPPRESS_MESSAGE_REGEX as appropriate - implement the serve() coroutine, called from the run() method. Upon return the event loop runs until the shutdown signal is received. ''' - - SUPPRESS_MESSAGE_REGEX = re.compile('SSH handshake') + SUPPRESS_MESSAGE_REGEX = re.compile('SSL handshake|Fatal read error on|' + 'SSL error in data received') SUPPRESS_TASK_REGEX = re.compile('accept_connection2') PYTHON_MIN_VERSION = (3, 6) From afae1b4a423a159930b90dd0c593645020ef98f8 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 10 Aug 2018 09:20:56 +0900 Subject: [PATCH 2/3] Fix rare race condition Closes #567 --- electrumx/server/session.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 9f63027..b479654 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -670,8 +670,10 @@ class ElectrumX(SessionBase): # Check mempool hashXs - the status is a function of the # confirmed state of other transactions. Note: we cannot # iterate over mempool_statuses as it changes size. - for hashX in set(self.mempool_statuses): - old_status = self.mempool_statuses[hashX] + for hashX in tuple(self.mempool_statuses): + # Items can be evicted whilst await-ing below; False + # ensures such hashXs are notified + old_status = self.mempool_statuses.get(hashX, False) status = await self.address_status(hashX) if status != old_status: alias = self.hashX_subs[hashX] From dd67b57c30909649ed7ab3901f161b8e27d76ac8 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 10 Aug 2018 09:52:49 +0900 Subject: [PATCH 3/3] Catch and log failures in the main peers task Closes #565 --- electrumx/server/peers.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/electrumx/server/peers.py b/electrumx/server/peers.py index a54d8bb..24e72ec 100644 --- a/electrumx/server/peers.py +++ b/electrumx/server/peers.py @@ -390,9 +390,13 @@ class PeerManager(object): await group.spawn(forever.wait()) await group.spawn(self._detect_proxy()) await group.spawn(self._import_peers()) - # Consume tasks as they complete + # Consume tasks as they complete, logging unexpected failures async for task in group: - task.result() + if not task.cancelled(): + try: + task.result() + except Exception: + self.logger.exception('task failed unexpectedly') def info(self): '''The number of peers.'''