Browse Source

Handle subscriptions whose history becomes too long

patch-2
Neil Booth 6 years ago
parent
commit
304e44d523
  1. 37
      electrumx/server/session.py

37
electrumx/server/session.py

@ -889,22 +889,21 @@ class ElectrumX(SessionBase):
changed = {}
for hashX in touched:
alias = self.hashX_subs[hashX]
status = await self.address_status(hashX)
changed[alias] = status
# 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 tuple(self.mempool_statuses):
# Items can be evicted whilst await-ing status; 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]
alias = self.hashX_subs.get(hashX)
if alias:
status = await self.subscription_address_status(hashX)
changed[alias] = status
# Check mempool hashXs - the status is a function of the confirmed state of
# other transactions.
mempool_statuses = self.mempool_statuses.copy()
for hashX, old_status in mempool_statuses.items():
alias = self.hashX_subs.get(hashX)
if alias:
status = await self.subscription_address_status(hashX)
if status != old_status:
changed[alias] = status
method = 'blockchain.scripthash.subscribe'
for alias, status in changed.items():
await self.send_notification(method, (alias, status))
@ -966,6 +965,16 @@ class ElectrumX(SessionBase):
return status
async def subscription_address_status(self, hashX):
'''As for address_status, but if it can't be calculated the subscription is
discarded.'''
try:
return await self.address_status(hashX)
except RPCError:
self.hashX_subs.pop(hashX, None)
self.mempool_statuses.pop(hashX, None)
return None
async def hashX_listunspent(self, hashX):
'''Return the list of UTXOs of a script hash, including mempool
effects.'''

Loading…
Cancel
Save