From 6ed17e9e0c89b6ea7c8305864f49590d1d5ca0b6 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sun, 11 Feb 2024 20:58:41 +1030 Subject: [PATCH] pyln-testing: dump gossip store when we complain about bad gossip. Signed-off-by: Rusty Russell --- contrib/pyln-testing/pyln/testing/fixtures.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/contrib/pyln-testing/pyln/testing/fixtures.py b/contrib/pyln-testing/pyln/testing/fixtures.py index 8ca5db204..7b89de6ee 100644 --- a/contrib/pyln-testing/pyln/testing/fixtures.py +++ b/contrib/pyln-testing/pyln/testing/fixtures.py @@ -1,6 +1,6 @@ from concurrent import futures from pyln.testing.db import SqliteDbProvider, PostgresDbProvider -from pyln.testing.utils import NodeFactory, BitcoinD, ElementsD, env, LightningNode, TEST_DEBUG +from pyln.testing.utils import NodeFactory, BitcoinD, ElementsD, env, LightningNode, TEST_DEBUG, TEST_NETWORK from pyln.client import Millisatoshi from typing import Dict @@ -12,6 +12,7 @@ import pytest # type: ignore import re import shutil import string +import subprocess import sys import tempfile import time @@ -465,16 +466,24 @@ def node_factory(request, directory, test_name, bitcoind, executor, db_provider, teardown_checks.add_error(e) def map_node_error(nodes, f, msg): + ret = False for n in nodes: if n and f(n): + ret = True teardown_checks.add_node_error(n, msg.format(n=n)) + return ret map_node_error(nf.nodes, printValgrindErrors, "reported valgrind errors") map_node_error(nf.nodes, printCrashLog, "had crash.log files") map_node_error(nf.nodes, lambda n: not n.allow_broken_log and n.daemon.is_in_log(r'\*\*BROKEN\*\*'), "had BROKEN messages") map_node_error(nf.nodes, lambda n: not n.allow_warning and n.daemon.is_in_log(r' WARNING:'), "had warning messages") map_node_error(nf.nodes, checkReconnect, "had unexpected reconnections") - map_node_error(nf.nodes, checkBadGossip, "had bad gossip messages") + + # On any bad gossip complaints, print out every nodes' gossip_store + if map_node_error(nf.nodes, checkBadGossip, "had bad gossip messages"): + for n in nf.nodes: + dumpGossipStore(n) + map_node_error(nf.nodes, lambda n: n.daemon.is_in_log('Bad reestablish'), "had bad reestablish") map_node_error(nf.nodes, lambda n: n.daemon.is_in_log('bad hsm request'), "had bad hsm requests") map_node_error(nf.nodes, lambda n: n.daemon.is_in_log(r'Accessing a null column'), "Accessing a null column") @@ -553,6 +562,14 @@ def checkReconnect(node): return 0 +def dumpGossipStore(node): + gs_path = os.path.join(node.daemon.lightning_dir, TEST_NETWORK, 'gossip_store') + gs = subprocess.run(['devtools/dump-gossipstore', '--print-deleted', gs_path], + stdout=subprocess.PIPE) + print("GOSSIP STORE CONTENTS for {}:\n".format(node.daemon.prefix)) + print(gs.stdout.decode()) + + def checkBadGossip(node): if node.allow_bad_gossip: return 0