Skip to content

Commit 72d0603

Browse files
committed
synchronizer: fix race in _on_address_status
Triggering needs two consecutive scripthash status changes in very quick succession. Client gets notification from server, but then response to "blockchain.scripthash.get_history" will already contain the changed-again history that has a different status. 20190627T101547.902638Z | INFO | synchronizer.[default_wallet] | receiving history mwXtx49BCGAiy4tU1r7MBX5VVLWSdtasCL 1 20190627T101547.903262Z | INFO | synchronizer.[default_wallet] | error: status mismatch: mwXtx49BCGAiy4tU1r7MBX5VVLWSdtasCL
1 parent 37809be commit 72d0603

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

electrum/synchronizer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def __init__(self, wallet: 'AddressSynchronizer'):
147147
def _reset(self):
148148
super()._reset()
149149
self.requested_tx = {}
150-
self.requested_histories = {}
150+
self.requested_histories = set()
151151

152152
def diagnostic_name(self):
153153
return self.wallet.diagnostic_name()
@@ -161,10 +161,10 @@ async def _on_address_status(self, addr, status):
161161
history = self.wallet.db.get_addr_history(addr)
162162
if history_status(history) == status:
163163
return
164-
if addr in self.requested_histories:
164+
if (addr, status) in self.requested_histories:
165165
return
166166
# request address history
167-
self.requested_histories[addr] = status
167+
self.requested_histories.add((addr, status))
168168
h = address_to_scripthash(addr)
169169
self._requests_sent += 1
170170
result = await self.network.get_history_for_scripthash(h)
@@ -188,7 +188,7 @@ async def _on_address_status(self, addr, status):
188188
await self._request_missing_txs(hist)
189189

190190
# Remove request; this allows up_to_date to be True
191-
self.requested_histories.pop(addr)
191+
self.requested_histories.discard((addr, status))
192192

193193
async def _request_missing_txs(self, hist, *, allow_server_not_finding_tx=False):
194194
# "hist" is a list of [tx_hash, tx_height] lists

0 commit comments

Comments
 (0)