forked from LBRYCommunity/lbry-sdk
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,6 +96,7 @@ class AddressManager:
|
||||||
return [r['address'] for r in records]
|
return [r['address'] for r in records]
|
||||||
|
|
||||||
async def get_or_create_usable_address(self) -> str:
|
async def get_or_create_usable_address(self) -> str:
|
||||||
|
async with self.address_generator_lock:
|
||||||
addresses = await self.get_addresses(only_usable=True, limit=10)
|
addresses = await self.get_addresses(only_usable=True, limit=10)
|
||||||
if addresses:
|
if addresses:
|
||||||
return random.choice(addresses)
|
return random.choice(addresses)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import asyncio
|
||||||
from binascii import hexlify
|
from binascii import hexlify
|
||||||
from lbry.testcase import AsyncioTestCase
|
from lbry.testcase import AsyncioTestCase
|
||||||
from lbry.wallet import Wallet, Ledger, Database, Headers, Account, SingleKey, HierarchicalDeterministic
|
from lbry.wallet import Wallet, Ledger, Database, Headers, Account, SingleKey, HierarchicalDeterministic
|
||||||
|
@ -37,6 +38,18 @@ class TestAccount(AsyncioTestCase):
|
||||||
addresses = await account.change.get_addresses()
|
addresses = await account.change.get_addresses()
|
||||||
self.assertEqual(len(addresses), 6)
|
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):
|
async def test_generate_keys_over_batch_threshold_saves_it_properly(self):
|
||||||
account = Account.generate(self.ledger, Wallet(), 'lbryum')
|
account = Account.generate(self.ledger, Wallet(), 'lbryum')
|
||||||
async with account.receiving.address_generator_lock:
|
async with account.receiving.address_generator_lock:
|
||||||
|
|
Loading…
Reference in a new issue