From e15e55190b8ce35440f626e8648fa3844203bdb5 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 18 Jul 2022 21:42:28 +0930 Subject: [PATCH] lightningd: provide peer address for reconnect if connect fails. It usually works out due to other reconnections, but I noticed this diagnosing another test. Signed-off-by: Rusty Russell --- lightningd/connect_control.c | 6 ++++-- lightningd/connect_control.h | 4 +++- lightningd/peer_control.c | 5 +++-- lightningd/test/run-invoice-select-inchan.c | 4 +++- wallet/test/run-wallet.c | 4 +++- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index aaf2f30ba..b7bff6888 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -366,10 +366,12 @@ static void connect_failed(struct lightningd *ld, } } -void connect_failed_disconnect(struct lightningd *ld, const struct node_id *id) +void connect_failed_disconnect(struct lightningd *ld, + const struct node_id *id, + const struct wireaddr_internal *addrhint) { connect_failed(ld, id, CONNECT_DISCONNECTED_DURING, - "disconnected during connection", 1, NULL); + "disconnected during connection", 1, addrhint); } static void handle_connect_failed(struct lightningd *ld, const u8 *msg) diff --git a/lightningd/connect_control.h b/lightningd/connect_control.h index 6e836478f..ab63b59ac 100644 --- a/lightningd/connect_control.h +++ b/lightningd/connect_control.h @@ -20,7 +20,9 @@ void try_reconnect(const tal_t *ctx, void connect_succeeded(struct lightningd *ld, const struct peer *peer, bool incoming, const struct wireaddr_internal *addr); -void connect_failed_disconnect(struct lightningd *ld, const struct node_id *id); +void connect_failed_disconnect(struct lightningd *ld, + const struct node_id *id, + const struct wireaddr_internal *addr); /* Disconnect a peer (if no subds want to talk any more) */ void maybe_disconnect_peer(struct lightningd *ld, struct peer *peer); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 3dfebb77c..db86e3869 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1540,11 +1540,12 @@ void peer_disconnect_done(struct lightningd *ld, const u8 *msg) /* If there are literally no channels, might as well * free immediately. */ if (!p->uncommitted_channel && list_empty(&p->channels)) - tal_free(p); + p = tal_free(p); } /* If you were trying to connect, it failed. */ - connect_failed_disconnect(ld, &id); + connect_failed_disconnect(ld, &id, + p && !p->connected_incoming ? &p->addr : NULL); /* Fire off plugin notifications */ notify_disconnect(ld, &id); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 71606b0fb..dcb0bb7b1 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -148,7 +148,9 @@ struct command_result *command_success(struct command *cmd UNNEEDED, { fprintf(stderr, "command_success called!\n"); abort(); } /* Generated stub for connect_failed_disconnect */ -void connect_failed_disconnect(struct lightningd *ld UNNEEDED, const struct node_id *id UNNEEDED) +void connect_failed_disconnect(struct lightningd *ld UNNEEDED, + const struct node_id *id UNNEEDED, + const struct wireaddr_internal *addr UNNEEDED) { fprintf(stderr, "connect_failed_disconnect called!\n"); abort(); } /* Generated stub for connect_succeeded */ void connect_succeeded(struct lightningd *ld UNNEEDED, const struct peer *peer UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 8e0384ecc..6b3fda3f5 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -107,7 +107,9 @@ struct command_result *command_success(struct command *cmd UNNEEDED, { fprintf(stderr, "command_success called!\n"); abort(); } /* Generated stub for connect_failed_disconnect */ -void connect_failed_disconnect(struct lightningd *ld UNNEEDED, const struct node_id *id UNNEEDED) +void connect_failed_disconnect(struct lightningd *ld UNNEEDED, + const struct node_id *id UNNEEDED, + const struct wireaddr_internal *addr UNNEEDED) { fprintf(stderr, "connect_failed_disconnect called!\n"); abort(); } /* Generated stub for connect_succeeded */ void connect_succeeded(struct lightningd *ld UNNEEDED, const struct peer *peer UNNEEDED,