tlnpeer: process gossip in chunks - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit a0764c017c01d6b13383465c6ccc5217b73ef773 DIR parent 62f58c18feeb6a3ea79f88382d6b057e34ce347d HTML Author: SomberNight <somber.night@protonmail.com> Date: Sun, 26 May 2019 05:30:02 +0200 lnpeer: process gossip in chunks Diffstat: M electrum/lnpeer.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) --- DIR diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py t@@ -24,7 +24,7 @@ from . import bitcoin from . import ecc from .ecc import sig_string_from_r_and_s, get_r_and_s_from_sig_string, der_sig_from_sig_string from . import constants -from .util import bh2u, bfh, log_exceptions, list_enabled_bits, ignore_exceptions +from .util import bh2u, bfh, log_exceptions, list_enabled_bits, ignore_exceptions, chunks from .transaction import Transaction, TxOutput from .logging import Logger from .lnonion import (new_onion_packet, decode_onion_error, OnionFailureCode, calc_hops_data_for_payment, t@@ -234,21 +234,26 @@ class Peer(Logger): raise Exception('unknown message') if self.gossip_queue.empty(): break + # note: data processed in chunks to avoid taking sql lock for too long # channel announcements - self.verify_channel_announcements(chan_anns) - self.channel_db.on_channel_announcement(chan_anns) + for chan_anns_chunk in chunks(chan_anns, 300): + self.verify_channel_announcements(chan_anns_chunk) + self.channel_db.on_channel_announcement(chan_anns_chunk) # node announcements - self.verify_node_announcements(node_anns) - self.channel_db.on_node_announcement(node_anns) + for node_anns_chunk in chunks(node_anns, 100): + self.verify_node_announcements(node_anns_chunk) + self.channel_db.on_node_announcement(node_anns_chunk) # channel updates - orphaned, expired, deprecated, good, to_delete = self.channel_db.filter_channel_updates(chan_upds, max_age=self.network.lngossip.max_age) - if orphaned: - self.logger.info(f'adding {len(orphaned)} unknown channel ids') - self.network.lngossip.add_new_ids(orphaned) - if good: - self.logger.debug(f'on_channel_update: {len(good)}/{len(chan_upds)}') - self.verify_channel_updates(good) - self.channel_db.update_policies(good, to_delete) + for chan_upds_chunk in chunks(chan_upds, 1000): + orphaned, expired, deprecated, good, to_delete = self.channel_db.filter_channel_updates(chan_upds_chunk, + max_age=self.network.lngossip.max_age) + if orphaned: + self.logger.info(f'adding {len(orphaned)} unknown channel ids') + self.network.lngossip.add_new_ids(orphaned) + if good: + self.logger.debug(f'on_channel_update: {len(good)}/{len(chan_upds_chunk)}') + self.verify_channel_updates(good) + self.channel_db.update_policies(good, to_delete) # refresh gui if chan_anns or node_anns or chan_upds: self.network.lngossip.refresh_gui()