make get_or_create_usable_address respect the generator lock
This commit is contained in:
parent
216e5f65ad
commit
0ccafd5b53
2 changed files with 15 additions and 1 deletions
|
@ -96,7 +96,8 @@ class AddressManager:
|
|||
return [r['address'] for r in records]
|
||||
|
||||
async def get_or_create_usable_address(self) -> str:
|
||||
addresses = await self.get_addresses(only_usable=True, limit=10)
|
||||
async with self.address_generator_lock:
|
||||
addresses = await self.get_addresses(only_usable=True, limit=10)
|
||||
if addresses:
|
||||
return random.choice(addresses)
|
||||
addresses = await self.ensure_address_gap()
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import asyncio
|
||||
from binascii import hexlify
|
||||
from lbry.testcase import AsyncioTestCase
|
||||
from lbry.wallet import Wallet, Ledger, Database, Headers, Account, SingleKey, HierarchicalDeterministic
|
||||
|
@ -37,6 +38,18 @@ class TestAccount(AsyncioTestCase):
|
|||
addresses = await account.change.get_addresses()
|
||||
self.assertEqual(len(addresses), 6)
|
||||
|
||||
async def test_unused_address_on_account_creation_does_not_cause_a_race(self):
|
||||
account = Account.generate(self.ledger, Wallet(), 'lbryum')
|
||||
await account.ledger.db.db.executescript("update pubkey_address set used_times=10")
|
||||
await account.receiving.address_generator_lock.acquire()
|
||||
delayed1 = asyncio.ensure_future(account.receiving.ensure_address_gap())
|
||||
delayed = asyncio.ensure_future(account.receiving.get_or_create_usable_address())
|
||||
await asyncio.sleep(0)
|
||||
# wallet being created and queried at the same time
|
||||
account.receiving.address_generator_lock.release()
|
||||
await delayed1
|
||||
await delayed
|
||||
|
||||
async def test_generate_keys_over_batch_threshold_saves_it_properly(self):
|
||||
account = Account.generate(self.ledger, Wallet(), 'lbryum')
|
||||
async with account.receiving.address_generator_lock:
|
||||
|
|
Loading…
Reference in a new issue