Browse Source

fix race between network and lnwatcher (network.add_job does not always work)

regtest_lnd
ThomasV 6 years ago
committed by SomberNight
parent
commit
2e16ed73c7
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 6
      electrum/daemon.py
  2. 5
      electrum/lnwatcher.py

6
electrum/daemon.py

@ -155,8 +155,6 @@ class Daemon(DaemonThread):
self.network = Network(config)
self.network._loop_thread = self._loop_thread
self.fx = FxThread(config, self.network)
if self.network:
self.network.start([self.fx.run])
self.gui = None
# path -> wallet; make sure path is standardized.
self.wallets = {} # type: Dict[str, Abstract_Wallet]
@ -164,7 +162,11 @@ class Daemon(DaemonThread):
self.server = None
if listen_jsonrpc:
self.init_server(config, fd)
# server-side watchtower
self.watchtower = WatchTower(self.config, self.network.lnwatcher) if self.config.get('watchtower_host') else None
# client-side
if self.network:
self.network.start([self.fx.run, self.network.lnwatcher.watchtower_task])
self.start()
def init_server(self, config: SimpleConfig, fd):

5
electrum/lnwatcher.py

@ -19,6 +19,7 @@ class LNWatcher(PrintError):
# TODO if verifier gets an incorrect merkle proof, that tx will never verify!!
# similarly, what if server ignores request for merkle proof?
# maybe we should disconnect from server in these cases
verbosity_filter = 'W'
def __init__(self, network):
self.network = network
@ -47,7 +48,6 @@ class LNWatcher(PrintError):
watchtower_url = self.config.get('watchtower_url')
self.watchtower = jsonrpclib.Server(watchtower_url) if watchtower_url else None
self.watchtower_queue = asyncio.Queue()
asyncio.run_coroutine_threadsafe(self.network.add_job(self.watchtower_task), self.network.asyncio_loop)
def with_watchtower(func):
def wrapper(self, *args, **kwargs):
@ -59,8 +59,11 @@ class LNWatcher(PrintError):
@ignore_exceptions
@log_exceptions
async def watchtower_task(self):
self.print_error('watchtower task started')
while True:
name, args, kwargs = await self.watchtower_queue.get()
if self.watchtower is None:
continue
func = getattr(self.watchtower, name)
try:
r = func(*args, **kwargs)

Loading…
Cancel
Save