tnetwork: load gossip db early - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 4efcb53d24d5f1040556d5fb4194eb8007943602 DIR parent 6045de759bdd5b47361d1749e210ddbd863100fb HTML Author: bitromortac <bitromortac@protonmail.com> Date: Thu, 8 Oct 2020 06:36:02 +0200 network: load gossip db early The gossip db is loaded early when the network is started to save ttime 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. Diffstat: M electrum/channel_db.py | 2 ++ M electrum/daemon.py | 3 +++ M electrum/gui/qt/__init__.py | 2 +- M electrum/gui/qt/channels_list.py | 2 +- M electrum/lnworker.py | 7 +++++-- M electrum/network.py | 2 +- M electrum/wallet.py | 1 - 7 files changed, 13 insertions(+), 6 deletions(-) --- DIR diff --git a/electrum/channel_db.py b/electrum/channel_db.py t@@ -613,6 +613,8 @@ class ChannelDB(SqlDB): @sql @profiler 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. # I believe lnmsg (and lightning.json) will need a rewrite anyway, so instead of tweaking # load_data() here, that should be done. see #6006 DIR diff --git a/electrum/daemon.py b/electrum/daemon.py t@@ -444,6 +444,9 @@ class Daemon(Logger): daemon_jobs.append(self.watchtower.run) if self.network: 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() asyncio.run_coroutine_threadsafe(self._run(jobs=daemon_jobs), self.asyncio_loop) DIR diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py t@@ -208,7 +208,7 @@ class ElectrumGui(Logger): self.app.new_window_signal.emit(path, uri) def show_lightning_dialog(self): - if not self.daemon.network.is_lightning_running(): + if not self.daemon.network.has_channel_db(): return if not self.lightning_dialog: self.lightning_dialog = LightningDialog(self) DIR diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py t@@ -79,7 +79,7 @@ class ChannelsList(MyTreeView): labels[subject] = label status = chan.get_state_for_GUI() 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_alias = (node_info.alias if node_info else '') or '' else: DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -460,7 +460,7 @@ class LNGossip(LNWorker): self.has_started = True async def maintain_db(self): - await self.channel_db.load_data() + await self.channel_db.data_loaded.wait() while True: if len(self.unknown_ids) == 0: self.channel_db.prune_old_policies(self.max_age) t@@ -584,6 +584,10 @@ class LNWallet(LNWorker): def start_network(self, network: 'Network'): assert network + self.network = network + self.config = network.config + self.channel_db = self.network.channel_db + self.lnwatcher = LNWalletWatcher(self, network) self.lnwatcher.start_network(network) self.network = network t@@ -592,7 +596,6 @@ class LNWallet(LNWorker): for chan in self.channels.values(): self.lnwatcher.add_channel(chan.funding_outpoint.to_str(), chan.get_funding_address()) - super().start_network(network) for coro in [ self.maybe_listen(), self.lnwatcher.on_network_update('network_updated'), # shortcut (don't block) if funding tx locked and verified DIR diff --git a/electrum/network.py b/electrum/network.py t@@ -344,7 +344,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): """Our guess whether the device has Internet-connectivity.""" 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 def maybe_init_lightning(self): DIR diff --git a/electrum/wallet.py b/electrum/wallet.py t@@ -363,7 +363,6 @@ class Abstract_Wallet(AddressSynchronizer, ABC): AddressSynchronizer.start_network(self, network) if network: if self.lnworker: - network.maybe_init_lightning() self.lnworker.start_network(network) # only start gossiping when we already have channels if self.db.get('channels'):