lnworker: accessing self.channels needs lock
This commit is contained in:
@@ -317,6 +317,8 @@ class LNWallet(LNWorker):
|
||||
self.preimages = self.storage.get('lightning_preimages', {}) # RHASH -> preimage
|
||||
self.sweep_address = wallet.get_receiving_address()
|
||||
self.lock = threading.RLock()
|
||||
|
||||
# note: accessing channels (besides simple lookup) needs self.lock!
|
||||
self.channels = {} # type: Dict[bytes, Channel]
|
||||
for x in wallet.storage.get("channels", []):
|
||||
c = Channel(x, sweep_address=self.sweep_address, lnworker=self)
|
||||
@@ -331,7 +333,9 @@ class LNWallet(LNWorker):
|
||||
watchtower = self.network.local_watchtower
|
||||
if watchtower:
|
||||
while True:
|
||||
for chan in self.channels.values():
|
||||
with self.lock:
|
||||
channels = list(self.channels.values())
|
||||
for chan in channels:
|
||||
await self.sync_channel_with_watchtower(chan, watchtower.sweepstore)
|
||||
await asyncio.sleep(5)
|
||||
|
||||
@@ -345,16 +349,19 @@ class LNWallet(LNWorker):
|
||||
r = await super().request(*args, **kwargs)
|
||||
return r.data.result
|
||||
while True:
|
||||
watchtower_url = self.config.get('watchtower_url')
|
||||
if watchtower_url:
|
||||
try:
|
||||
async with aiohttp.ClientSession(loop=asyncio.get_event_loop()) as session:
|
||||
watchtower = myAiohttpClient(session, watchtower_url)
|
||||
for chan in self.channels.values():
|
||||
await self.sync_channel_with_watchtower(chan, watchtower)
|
||||
except aiohttp.client_exceptions.ClientConnectorError:
|
||||
self.logger.info(f'could not contact remote watchtower {watchtower_url}')
|
||||
await asyncio.sleep(5)
|
||||
watchtower_url = self.config.get('watchtower_url')
|
||||
if not watchtower_url:
|
||||
continue
|
||||
with self.lock:
|
||||
channels = list(self.channels.values())
|
||||
try:
|
||||
async with aiohttp.ClientSession(loop=asyncio.get_event_loop()) as session:
|
||||
watchtower = myAiohttpClient(session, watchtower_url)
|
||||
for chan in channels:
|
||||
await self.sync_channel_with_watchtower(chan, watchtower)
|
||||
except aiohttp.client_exceptions.ClientConnectorError:
|
||||
self.logger.info(f'could not contact remote watchtower {watchtower_url}')
|
||||
|
||||
async def sync_channel_with_watchtower(self, chan: Channel, watchtower):
|
||||
outpoint = chan.funding_outpoint.to_str()
|
||||
@@ -416,7 +423,9 @@ class LNWallet(LNWorker):
|
||||
# return one item per payment_hash
|
||||
# note: with AMP we will have several channels per payment
|
||||
out = defaultdict(list)
|
||||
for chan in self.channels.values():
|
||||
with self.lock:
|
||||
channels = list(self.channels.values())
|
||||
for chan in channels:
|
||||
d = chan.get_payments()
|
||||
for k, v in d.items():
|
||||
out[k].append(v)
|
||||
@@ -484,7 +493,9 @@ class LNWallet(LNWorker):
|
||||
}
|
||||
out.append(item)
|
||||
# add funding events
|
||||
for chan in self.channels.values():
|
||||
with self.lock:
|
||||
channels = list(self.channels.values())
|
||||
for chan in channels:
|
||||
item = self.channel_timestamps.get(chan.channel_id.hex())
|
||||
if item is None:
|
||||
continue
|
||||
@@ -1129,7 +1140,8 @@ class LNWallet(LNWorker):
|
||||
# TODO: assert that closing tx is deep-mined and htlcs are swept
|
||||
chan = self.channels[chan_id]
|
||||
assert chan.is_closed()
|
||||
self.channels.pop(chan_id)
|
||||
with self.lock:
|
||||
self.channels.pop(chan_id)
|
||||
self.save_channels()
|
||||
self.network.trigger_callback('channels', self.wallet)
|
||||
self.network.trigger_callback('wallet_updated', self.wallet)
|
||||
|
||||
Reference in New Issue
Block a user