Skip to content

Commit 6285017

Browse files
committed
pytest: add test to demonstrate gossip_store misordering node announcements.
We usually lose the node announcement on restart, because the node_announcement message is ignored by gossmap, as it doesn't (yet!) know of the node, since the channel_announcement does not precede the node_announcement. This is supposed to be detected and fixed by gossipd, but this simple test shows that it is not! ``` FAILED tests/test_gossip.py::test_gossmap_lost_node - AssertionError: assert {'nodes': [{'nodeid': '022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59', 'alias': 'SILENTARTIST-v25.12-2-g703851b', 'color': '022d22', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}, {'nodeid': '0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', 'alias': 'JUNIORBEAM-v25.12-2-g703851b', 'color': '0266e4', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}, {'nodeid': '035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d'}, {'nodeid': '0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199', 'alias': 'JUNIORFELONY-v25.12-2-g703851b', 'color': '0382ce', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}]} == {'nodes': [{'nodeid': '022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59', 'alias': 'SILENTARTIST-v25.12-2-g703851b', 'color': '022d22', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}, {'nodeid': '0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', 'alias': 'JUNIORBEAM-v25.12-2-g703851b', 'color': '0266e4', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}, {'nodeid': '035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d', 'alias': 'HOPPINGFIRE-v25.12-2-g703851b', 'color': '035d2b', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}, {'nodeid': '0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199', 'alias': 'JUNIORFELONY-v25.12-2-g703851b', 'color': '0382ce', 'last_timestamp': 1765172273, 'features': '8898880a8a59a1', 'addresses': []}]} Differing items: {'nodes': [{'addresses': [], 'alias': 'SILENTARTIST-v25.12-2-g703851b', 'color': '022d22', 'features': '8898880a8a59a1...}, {'addresses': [], 'alias': 'JUNIORFELONY-v25.12-2-g703851b', 'color': '0382ce', 'features': '8898880a8a59a1', ...}]} != {'nodes': [{'addresses': [], 'alias': 'SILENTARTIST-v25.12-2-g703851b', 'color': '022d22', 'features': '8898880a8a59a1...}, {'addresses': [], 'alias': 'JUNIORFELONY-v25.12-2-g703851b', 'color': '0382ce', 'features': '8898880a8a59a1', ...}]} Full diff: { 'nodes': [ { 'addresses': [], 'alias': 'SILENTARTIST-v25.12-2-g703851b', 'color': '022d22', 'features': '8898880a8a59a1', 'last_timestamp': 1765172273, 'nodeid': '022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59', }, { 'addresses': [], 'alias': 'JUNIORBEAM-v25.12-2-g703851b', 'color': '0266e4', 'features': '8898880a8a59a1', 'last_timestamp': 1765172273, 'nodeid': '0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', }, { - 'addresses': [], - 'alias': 'HOPPINGFIRE-v25.12-2-g703851b', - 'color': '035d2b', - 'features': '8898880a8a59a1', - 'last_timestamp': 1765172273, 'nodeid': '035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d', }, { 'addresses': [], 'alias': 'JUNIORFELONY-v25.12-2-g703851b', 'color': '0382ce', 'features': '8898880a8a59a1', 'last_timestamp': 1765172273, 'nodeid': '0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199', }, ], } ``` Signed-off-by: Rusty Russell <[email protected]>
1 parent 7ceeba6 commit 6285017

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

tests/test_gossip.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2370,3 +2370,22 @@ def test_incoming_unreasonable(node_factory):
23702370
wait_for(lambda: [c['updates']['remote']['fee_base_msat'] for c in l3.rpc.listpeerchannels()['channels']] == [100000000, 100000000])
23712371
l3.restart()
23722372
l3.rpc.listincoming()
2373+
2374+
2375+
@pytest.mark.xfail(strict=True)
2376+
def test_gossmap_lost_node(node_factory, bitcoind):
2377+
l1, l2, l3, l4 = node_factory.line_graph(4, wait_for_announce=True)
2378+
2379+
scid23 = only_one(l2.rpc.listpeerchannels(l3.info['id'])['channels'])['short_channel_id']
2380+
l2.rpc.close(l3.info['id'])
2381+
bitcoind.generate_block(13, wait_for_mempool=1)
2382+
wait_for(lambda: l1.rpc.listchannels(scid23) == {'channels': []})
2383+
2384+
pre_channels = l1.rpc.listchannels()
2385+
pre_nodes = l1.rpc.listnodes()
2386+
l1.restart()
2387+
post_channels = l1.rpc.listchannels()
2388+
post_nodes = l1.rpc.listnodes()
2389+
2390+
assert post_channels == pre_channels
2391+
assert post_nodes == pre_nodes

0 commit comments

Comments
 (0)