From d9d802f9702d24ab1d3c09c0c443ebb630076601 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Tue, 16 Oct 2018 14:51:12 +0100 Subject: [PATCH] Rework the main controller TaskGroup - task groups don't propagate exceptions until joined - therefore waiting on events in the context manager body is not a good idiom; it caused failed tasks that were supposed to set the event to lead to a deadlock with no backtrace Fixes #608 --- electrumx/server/controller.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/electrumx/server/controller.py b/electrumx/server/controller.py index 9f2006d..cfd7bcf 100644 --- a/electrumx/server/controller.py +++ b/electrumx/server/controller.py @@ -119,14 +119,14 @@ class Controller(ServerBase): await daemon.height() caught_up_event = Event() - serve_externally_event = Event() - synchronized_event = Event() - async with TaskGroup() as group: - await group.spawn(session_mgr.serve(notifications, - serve_externally_event)) - await group.spawn(bp.fetch_and_process_blocks(caught_up_event)) + mempool_event = Event() + + async def wait_for_catchup(): await caught_up_event.wait() await group.spawn(db.populate_header_merkle_cache()) - await group.spawn(mempool.keep_synchronized(synchronized_event)) - await synchronized_event.wait() - serve_externally_event.set() + await group.spawn(mempool.keep_synchronized(mempool_event)) + + async with TaskGroup() as group: + await group.spawn(session_mgr.serve(notifications, mempool_event)) + await group.spawn(bp.fetch_and_process_blocks(caught_up_event)) + await group.spawn(wait_for_catchup())