From 4acf884790b2136dcff7948e975460f11cf0aa93 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 25 Aug 2020 20:29:08 +0200 Subject: [PATCH] blockchain.py: maybe fix rare deadlock Saw a deadlock near a swap_with_parent(), could not reproduce. get_branch_size() and get_parent_heights() could have been the culprits as they take locks in differing orders and are called from gui/network threads. --- electrum/blockchain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/blockchain.py b/electrum/blockchain.py index 6dfe3573e..4571d0c1a 100644 --- a/electrum/blockchain.py +++ b/electrum/blockchain.py @@ -86,7 +86,7 @@ def hash_raw_header(header: str) -> str: # key: blockhash hex at forkpoint # the chain at some key is the best chain that includes the given hash blockchains = {} # type: Dict[str, Blockchain] -blockchains_lock = threading.RLock() +blockchains_lock = threading.RLock() # lock order: take this last; so after Blockchain.lock def read_blockchains(config: 'SimpleConfig'): @@ -222,7 +222,7 @@ class Blockchain(Logger): def get_parent_heights(self) -> Mapping['Blockchain', int]: """Returns map: (parent chain -> height of last common block)""" - with blockchains_lock: + with self.lock, blockchains_lock: result = {self: self.height()} chain = self while True: