network: load gossip db early
The gossip db is loaded early when the network is started to save time when the gui is locked and a wallet not yet loaded. Side effects of the LNWallet to start peering when a channel db is loaded is circumvented.
This commit is contained in:
@@ -613,6 +613,8 @@ class ChannelDB(SqlDB):
|
|||||||
@sql
|
@sql
|
||||||
@profiler
|
@profiler
|
||||||
def load_data(self):
|
def load_data(self):
|
||||||
|
if self.data_loaded.is_set():
|
||||||
|
return
|
||||||
# Note: this method takes several seconds... mostly due to lnmsg.decode_msg being slow.
|
# Note: this method takes several seconds... mostly due to lnmsg.decode_msg being slow.
|
||||||
# I believe lnmsg (and lightning.json) will need a rewrite anyway, so instead of tweaking
|
# I believe lnmsg (and lightning.json) will need a rewrite anyway, so instead of tweaking
|
||||||
# load_data() here, that should be done. see #6006
|
# load_data() here, that should be done. see #6006
|
||||||
|
|||||||
@@ -444,6 +444,9 @@ class Daemon(Logger):
|
|||||||
daemon_jobs.append(self.watchtower.run)
|
daemon_jobs.append(self.watchtower.run)
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.start(jobs=[self.fx.run])
|
self.network.start(jobs=[self.fx.run])
|
||||||
|
# prepare lightning functionality, also load channel db early
|
||||||
|
self.network.maybe_init_lightning()
|
||||||
|
self.network.channel_db.load_data()
|
||||||
|
|
||||||
self.taskgroup = TaskGroup()
|
self.taskgroup = TaskGroup()
|
||||||
asyncio.run_coroutine_threadsafe(self._run(jobs=daemon_jobs), self.asyncio_loop)
|
asyncio.run_coroutine_threadsafe(self._run(jobs=daemon_jobs), self.asyncio_loop)
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ class ElectrumGui(Logger):
|
|||||||
self.app.new_window_signal.emit(path, uri)
|
self.app.new_window_signal.emit(path, uri)
|
||||||
|
|
||||||
def show_lightning_dialog(self):
|
def show_lightning_dialog(self):
|
||||||
if not self.daemon.network.is_lightning_running():
|
if not self.daemon.network.has_channel_db():
|
||||||
return
|
return
|
||||||
if not self.lightning_dialog:
|
if not self.lightning_dialog:
|
||||||
self.lightning_dialog = LightningDialog(self)
|
self.lightning_dialog = LightningDialog(self)
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ class ChannelsList(MyTreeView):
|
|||||||
labels[subject] = label
|
labels[subject] = label
|
||||||
status = chan.get_state_for_GUI()
|
status = chan.get_state_for_GUI()
|
||||||
closed = chan.is_closed()
|
closed = chan.is_closed()
|
||||||
if self.network and self.network.is_lightning_running():
|
if self.network and self.network.has_channel_db():
|
||||||
node_info = self.parent.network.channel_db.get_node_info_for_node_id(chan.node_id)
|
node_info = self.parent.network.channel_db.get_node_info_for_node_id(chan.node_id)
|
||||||
node_alias = (node_info.alias if node_info else '') or ''
|
node_alias = (node_info.alias if node_info else '') or ''
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -460,7 +460,7 @@ class LNGossip(LNWorker):
|
|||||||
self.has_started = True
|
self.has_started = True
|
||||||
|
|
||||||
async def maintain_db(self):
|
async def maintain_db(self):
|
||||||
await self.channel_db.load_data()
|
await self.channel_db.data_loaded.wait()
|
||||||
while True:
|
while True:
|
||||||
if len(self.unknown_ids) == 0:
|
if len(self.unknown_ids) == 0:
|
||||||
self.channel_db.prune_old_policies(self.max_age)
|
self.channel_db.prune_old_policies(self.max_age)
|
||||||
@@ -584,6 +584,10 @@ class LNWallet(LNWorker):
|
|||||||
|
|
||||||
def start_network(self, network: 'Network'):
|
def start_network(self, network: 'Network'):
|
||||||
assert network
|
assert network
|
||||||
|
self.network = network
|
||||||
|
self.config = network.config
|
||||||
|
self.channel_db = self.network.channel_db
|
||||||
|
|
||||||
self.lnwatcher = LNWalletWatcher(self, network)
|
self.lnwatcher = LNWalletWatcher(self, network)
|
||||||
self.lnwatcher.start_network(network)
|
self.lnwatcher.start_network(network)
|
||||||
self.network = network
|
self.network = network
|
||||||
@@ -592,7 +596,6 @@ class LNWallet(LNWorker):
|
|||||||
for chan in self.channels.values():
|
for chan in self.channels.values():
|
||||||
self.lnwatcher.add_channel(chan.funding_outpoint.to_str(), chan.get_funding_address())
|
self.lnwatcher.add_channel(chan.funding_outpoint.to_str(), chan.get_funding_address())
|
||||||
|
|
||||||
super().start_network(network)
|
|
||||||
for coro in [
|
for coro in [
|
||||||
self.maybe_listen(),
|
self.maybe_listen(),
|
||||||
self.lnwatcher.on_network_update('network_updated'), # shortcut (don't block) if funding tx locked and verified
|
self.lnwatcher.on_network_update('network_updated'), # shortcut (don't block) if funding tx locked and verified
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
|
|||||||
"""Our guess whether the device has Internet-connectivity."""
|
"""Our guess whether the device has Internet-connectivity."""
|
||||||
return self._has_ever_managed_to_connect_to_server
|
return self._has_ever_managed_to_connect_to_server
|
||||||
|
|
||||||
def is_lightning_running(self):
|
def has_channel_db(self):
|
||||||
return self.channel_db is not None
|
return self.channel_db is not None
|
||||||
|
|
||||||
def maybe_init_lightning(self):
|
def maybe_init_lightning(self):
|
||||||
|
|||||||
@@ -363,7 +363,6 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
AddressSynchronizer.start_network(self, network)
|
AddressSynchronizer.start_network(self, network)
|
||||||
if network:
|
if network:
|
||||||
if self.lnworker:
|
if self.lnworker:
|
||||||
network.maybe_init_lightning()
|
|
||||||
self.lnworker.start_network(network)
|
self.lnworker.start_network(network)
|
||||||
# only start gossiping when we already have channels
|
# only start gossiping when we already have channels
|
||||||
if self.db.get('channels'):
|
if self.db.get('channels'):
|
||||||
|
|||||||
Reference in New Issue
Block a user