tlnworker.invoices access now uses lock - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 25c372a3e0c7d03ded5bb537e48cbe9337168014 DIR parent 509df9ddaf411a3fe2f6d96cee59d4ab0373de4c HTML Author: SomberNight <somber.night@protonmail.com> Date: Fri, 6 Sep 2019 18:27:47 +0200 lnworker.invoices access now uses lock (qt gui thread vs asyncio thread race) Traceback (most recent call last): File "/home/user/wspace/electrum/electrum/gui/qt/main_window.py", line 1685, in do_send self.pay_lightning_invoice(self.payto_e.lightning_invoice) File "/home/user/wspace/electrum/electrum/gui/qt/main_window.py", line 1667, in pay_lightning_invoice self.invoice_list.update() File "/home/user/wspace/electrum/electrum/gui/qt/invoice_list.py", line 73, in update _list = self.parent.wallet.get_invoices() File "/home/user/wspace/electrum/electrum/wallet.py", line 525, in get_invoices out += self.lnworker.get_invoices() File "/home/user/wspace/electrum/electrum/util.py", line 401, in return lambda *args, **kw_args: do_profile(args, kw_args) File "/home/user/wspace/electrum/electrum/util.py", line 397, in do_profile o = func(*args, **kw_args) File "/home/user/wspace/electrum/electrum/lnworker.py", line 1007, in get_invoices for key, (invoice, direction, status) in self.invoices.items(): RuntimeError: dictionary changed size during iteration Diffstat: M electrum/lnworker.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) --- DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -958,7 +958,8 @@ class LNWallet(LNWorker): def save_invoice(self, payment_hash:bytes, invoice, direction, status): key = bh2u(payment_hash) - self.invoices[key] = invoice, direction, status + with self.lock: + self.invoices[key] = invoice, direction, status self.storage.put('lightning_invoices', self.invoices) self.storage.write() t@@ -1004,7 +1005,9 @@ class LNWallet(LNWorker): def get_invoices(self): # invoices = outgoing out = [] - for key, (invoice, direction, status) in self.invoices.items(): + with self.lock: + invoice_items = list(self.invoices.items()) + for key, (invoice, direction, status) in invoice_items: if direction == SENT and status != PR_PAID: out.append(self.get_request(key)) return out t@@ -1013,7 +1016,9 @@ class LNWallet(LNWorker): def get_requests(self): # requests = incoming out = [] - for key, (invoice, direction, status) in self.invoices.items(): + with self.lock: + invoice_items = list(self.invoices.items()) + for key, (invoice, direction, status) in invoice_items: if direction == RECEIVED and status != PR_PAID: out.append(self.get_request(key)) return out t@@ -1062,7 +1067,8 @@ class LNWallet(LNWorker): def delete_invoice(self, payment_hash_hex: str): try: - del self.invoices[payment_hash_hex] + with self.lock: + del self.invoices[payment_hash_hex] except KeyError: return self.storage.put('lightning_invoices', self.invoices)