Merge pull request #3221 from lbryio/subscribe_hash_on_call

Improve performance of address subscriptions and transaction proofs
This commit is contained in:
Jack Robison 2021-03-10 15:58:50 -05:00 committed by GitHub
commit fe60d4be88
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1275,10 +1275,9 @@ class LBRYElectrumX(SessionBase):
address: the address to subscribe to""" address: the address to subscribe to"""
if len(addresses) > 1000: if len(addresses) > 1000:
raise RPCError(BAD_REQUEST, f'too many addresses in subscription request: {len(addresses)}') raise RPCError(BAD_REQUEST, f'too many addresses in subscription request: {len(addresses)}')
hashXes = [ return [
(self.address_to_hashX(address), address) for address in addresses await self.hashX_subscribe(self.address_to_hashX(address), address) for address in addresses
] ]
return [await self.hashX_subscribe(*args) for args in hashXes]
async def address_unsubscribe(self, address): async def address_unsubscribe(self, address):
"""Unsubscribe an address. """Unsubscribe an address.
@ -1553,15 +1552,14 @@ class LBRYElectrumX(SessionBase):
else: else:
batch_result[tx_hash] = [raw_tx, {'block_height': -1}] batch_result[tx_hash] = [raw_tx, {'block_height': -1}]
def threaded_get_merkle(): if needed_merkles:
for tx_hash, (raw_tx, block_txs, pos, block_height) in needed_merkles.items(): for tx_hash, (raw_tx, block_txs, pos, block_height) in needed_merkles.items():
batch_result[tx_hash] = raw_tx, { batch_result[tx_hash] = raw_tx, {
'merkle': self._get_merkle_branch(block_txs, pos), 'merkle': self._get_merkle_branch(block_txs, pos),
'pos': pos, 'pos': pos,
'block_height': block_height 'block_height': block_height
} }
if needed_merkles: await asyncio.sleep(0) # heavy call, give other tasks a chance
await asyncio.get_running_loop().run_in_executor(self.db.executor, threaded_get_merkle)
self.session_mgr.tx_replied_count_metric.inc(len(tx_hashes)) self.session_mgr.tx_replied_count_metric.inc(len(tx_hashes))
return batch_result return batch_result