From 6d3fb11bc68d975ee40925e5d546919a3375b7e4 Mon Sep 17 00:00:00 2001 From: niftynei Date: Mon, 10 May 2021 13:46:52 -0500 Subject: [PATCH] df-tests: patch for state == AWAITING_UNILATERAL problem Found on CI where DEVELOPER=0 EXPERIMENTAL_DUAL_FUND=1, as we turn off automatic reconnects when DEVELOPER=1 This test has been modified to make the error happen every time, and then fixed. lightningd-2: 2021-05-07T20:12:03.790Z DEBUG 0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518-chan#1: Peer has reconnected, state AWAITING_UNILATERAL lightningd-2: 2021-05-07T20:12:03.812Z **BROKEN** lightningd: FATAL SIGNAL 6 (version e8b3f78) lightningd-2: 2021-05-07T20:12:03.812Z **BROKEN** lightningd: backtrace: common/daemon.c:44 (send_backtrace) 0x56384ee072e9 lightningd-2: 2021-05-07T20:12:03.813Z **BROKEN** lightningd: backtrace: common/daemon.c:52 (crashdump) 0x56384ee0733b ----------------------------- Captured stderr call ----------------------------- lightningd: lightningd/peer_control.c:1100: peer_connected_hook_final: Assertion `channel->state == DUALOPEND_OPEN_INIT || channel->state == DUALOPEND_AWAITING_LOCKIN' failed. lightningd: FATAL SIGNAL 6 (version e8b3f78) 0x56384ee072a1 send_backtrace common/daemon.c:39 0x56384ee0733b crashdump common/daemon.c:52 0x7f88486a020f ??? ???:0 0x7f88486a018b ??? ???:0 0x7f884867f858 ??? ???:0 0x7f884867f728 ??? ???:0 0x7f8848690f35 ??? ???:0 0x56384eddc94e peer_connected_hook_final lightningd/peer_control.c:1100 0x56384edea2ed plugin_hook_call_ lightningd/plugin_hook.c:275 0x56384eddfeb8 plugin_hook_call_peer_connected lightningd/peer_control.c:1156 0x56384eddfeb8 peer_connected lightningd/peer_control.c:1209 0x56384edc30cd connectd_msg lightningd/connect_control.c:332 0x56384edebe6f sd_msg_read lightningd/subd.c:509 0x56384edebfb1 read_fds lightningd/subd.c:310 0x56384ee483b0 next_plan ccan/ccan/io/io.c:59 0x56384ee4885b do_plan ccan/ccan/io/io.c:407 0x56384ee488f8 io_ready ccan/ccan/io/io.c:417 0x56384ee4a23c io_loop ccan/ccan/io/poll.c:445 0x56384edcabda io_loop_with_timers lightningd/io_loop_with_timers.c:24 0x56384edce826 main lightningd/lightningd.c:1111 0x7f88486810b2 ??? ???:0 0x56384edb52ad ??? ???:0 0xffffffffffffffff ??? ???:0 --- lightningd/peer_control.c | 5 ++--- tests/test_plugin.py | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index a6c51c1af..a9d91097f 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1093,12 +1093,11 @@ send_error: if (feature_negotiated(ld->our_features, peer->their_features, OPT_DUAL_FUND)) { - /* if we have a channel, we're actually restarting - * dualopend. we only get here if there's an error */ if (channel) { assert(!channel->owner); assert(channel->state == DUALOPEND_OPEN_INIT - || channel->state == DUALOPEND_AWAITING_LOCKIN); + || channel->state == DUALOPEND_AWAITING_LOCKIN + || channel->state == AWAITING_UNILATERAL); channel->peer->addr = addr; channel->peer->connected_incoming = payload->incoming; peer_restart_dualopend(peer, payload->pps, channel, error); diff --git a/tests/test_plugin.py b/tests/test_plugin.py index a650b666d..8a94f80f1 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -9,7 +9,8 @@ from utils import ( DEVELOPER, only_one, sync_blockheight, TIMEOUT, wait_for, TEST_NETWORK, DEPRECATED_APIS, expected_peer_features, expected_node_features, expected_channel_features, account_balance, - check_coin_moves, first_channel_id, check_coin_moves_idx, EXPERIMENTAL_FEATURES + check_coin_moves, first_channel_id, check_coin_moves_idx, + EXPERIMENTAL_FEATURES, EXPERIMENTAL_DUAL_FUND ) import ast @@ -846,6 +847,9 @@ def test_channel_state_changed_unilateral(node_factory, bitcoind): # such errors a soft because LND. opts = {"plugin": os.path.join(os.getcwd(), "tests/plugins/misc_notifications.py"), "allow_warning": True} + if EXPERIMENTAL_DUAL_FUND: + opts['may_reconnect'] = True + l1, l2 = node_factory.line_graph(2, opts=opts) l1_id = l1.rpc.getinfo()["id"] @@ -901,6 +905,9 @@ def test_channel_state_changed_unilateral(node_factory, bitcoind): wait_for(lambda: len(l1.rpc.listpeers()['peers']) == 1) # check 'closer' on l2 while the peer is not yet forgotten assert(l2.rpc.listpeers()['peers'][0]['channels'][0]['closer'] == 'local') + if EXPERIMENTAL_DUAL_FUND: + l1.daemon.wait_for_log(r'Peer has reconnected, state') + l2.daemon.wait_for_log(r'Peer has reconnected, state') # settle the channel closure bitcoind.generate_block(100)