From 4e8239fcfe8ad9e6311057df4beff67bf0a67c42 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 23 Mar 2022 09:31:33 +1030 Subject: [PATCH] lightningd: don't tell connectd to discard peer unless no subds left. Otherwise it waits for subds to exit, but they don't. Plus, the others may still be talking! Signed-off-by: Rusty Russell --- lightningd/channel.c | 21 +++-------------- lightningd/connect_control.c | 25 +++++++++++++++++++++ lightningd/connect_control.h | 3 +++ lightningd/opening_common.c | 7 ++---- lightningd/peer_control.c | 8 +++---- lightningd/test/run-invoice-select-inchan.c | 6 ++--- wallet/test/run-wallet.c | 6 ++--- 7 files changed, 42 insertions(+), 34 deletions(-) diff --git a/lightningd/channel.c b/lightningd/channel.c index d0b90da19..789d75554 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -20,11 +20,6 @@ #include #include -static bool connects_to_peer(struct subd *owner) -{ - return owner && owner->talks_to_peer; -} - void channel_set_owner(struct channel *channel, struct subd *owner) { struct subd *old_owner = channel->owner; @@ -32,20 +27,10 @@ void channel_set_owner(struct channel *channel, struct subd *owner) if (old_owner) { subd_release_channel(old_owner, channel); - if (channel->connected && !connects_to_peer(owner)) { - /* If shutting down, connectd no longer exists */ - if (channel->peer->ld->connectd) { - u8 *msg; - msg = towire_connectd_discard_peer( - NULL, - &channel->peer->id); - subd_send_msg(channel->peer->ld->connectd, - take(msg)); - } else - channel->peer->is_connected = false; - } + if (channel->connected) + maybe_disconnect_peer(channel->peer->ld, channel->peer); } - channel->connected = connects_to_peer(owner); + channel->connected = (owner && owner->talks_to_peer); } struct htlc_out *channel_has_htlc_out(struct channel *channel) diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index a31a611a6..df6993c81 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -601,6 +601,31 @@ void connectd_activate(struct lightningd *ld) io_loop(NULL, NULL); } +void maybe_disconnect_peer(struct lightningd *ld, struct peer *peer) +{ + struct channel *channel; + + /* Any channels left which want to talk? */ + if (peer->uncommitted_channel) + return; + + list_for_each(&peer->channels, channel, list) { + if (!channel->owner) + continue; + if (channel->owner->talks_to_peer) + return; + } + + /* If shutting down, connectd no longer exists */ + if (!ld->connectd) { + peer->is_connected = false; + return; + } + + subd_send_msg(ld->connectd, + take(towire_connectd_discard_peer(NULL, &peer->id))); +} + static struct command_result *json_sendcustommsg(struct command *cmd, const char *buffer, const jsmntok_t *obj UNNEEDED, diff --git a/lightningd/connect_control.h b/lightningd/connect_control.h index 50ffb45bf..748ecb8eb 100644 --- a/lightningd/connect_control.h +++ b/lightningd/connect_control.h @@ -21,4 +21,7 @@ void connect_succeeded(struct lightningd *ld, const struct peer *peer, bool incoming, 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); + #endif /* LIGHTNING_LIGHTNINGD_CONNECT_CONTROL_H */ diff --git a/lightningd/opening_common.c b/lightningd/opening_common.c index f018b1c91..7442cea19 100644 --- a/lightningd/opening_common.c +++ b/lightningd/opening_common.c @@ -3,11 +3,11 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -31,6 +31,7 @@ static void destroy_uncommitted_channel(struct uncommitted_channel *uc) uc->peer->uncommitted_channel = NULL; + maybe_disconnect_peer(uc->peer->ld, uc->peer); maybe_delete_peer(uc->peer); } @@ -104,11 +105,7 @@ void uncommitted_channel_disconnect(struct uncommitted_channel *uc, enum log_level level, const char *desc) { - u8 *msg = towire_connectd_discard_peer(tmpctx, &uc->peer->id); log_(uc->log, level, NULL, false, "%s", desc); - /* NULL when we're shutting down */ - if (uc->peer->ld->connectd) - subd_send_msg(uc->peer->ld->connectd, msg); if (uc->fc && uc->fc->cmd) was_pending(command_fail(uc->fc->cmd, LIGHTNINGD, "%s", desc)); } diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index fdedc84f5..2e70af6d8 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1962,11 +1962,9 @@ static struct command_result *json_disconnect(struct command *cmd, disconnected = true; } - if (!disconnected) { - /* It's just sitting in connectd. */ - subd_send_msg(cmd->ld->connectd, - take(towire_connectd_discard_peer(NULL, id))); - } + /* It's just sitting in connectd? */ + if (!disconnected) + maybe_disconnect_peer(cmd->ld, peer); /* Connectd tells us when it's finally disconnected */ dc = tal(cmd, struct disconnect_command); diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 81e5c1bae..ba9193ef0 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -450,6 +450,9 @@ void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "log_ called!\n"); abort(); } +/* Generated stub for maybe_disconnect_peer */ +void maybe_disconnect_peer(struct lightningd *ld UNNEEDED, struct peer *peer UNNEEDED) +{ fprintf(stderr, "maybe_disconnect_peer called!\n"); abort(); } /* Generated stub for merkle_tlv */ void merkle_tlv(const struct tlv_field *fields UNNEEDED, struct sha256 *merkle UNNEEDED) { fprintf(stderr, "merkle_tlv called!\n"); abort(); } @@ -654,9 +657,6 @@ u8 *towire_channeld_dev_memleak(const tal_t *ctx UNNEEDED) /* Generated stub for towire_channeld_dev_reenable_commit */ u8 *towire_channeld_dev_reenable_commit(const tal_t *ctx UNNEEDED) { fprintf(stderr, "towire_channeld_dev_reenable_commit called!\n"); abort(); } -/* Generated stub for towire_connectd_discard_peer */ -u8 *towire_connectd_discard_peer(const tal_t *ctx UNNEEDED, const struct node_id *id UNNEEDED) -{ fprintf(stderr, "towire_connectd_discard_peer called!\n"); abort(); } /* Generated stub for towire_connectd_peer_final_msg */ u8 *towire_connectd_peer_final_msg(const tal_t *ctx UNNEEDED, const struct node_id *id UNNEEDED, const u8 *msg UNNEEDED) { fprintf(stderr, "towire_connectd_peer_final_msg called!\n"); abort(); } diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 1f8b36176..6a74d2bab 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -448,6 +448,9 @@ bool json_tok_streq(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED, const char *why UNNEEDED) { fprintf(stderr, "kill_uncommitted_channel called!\n"); abort(); } +/* Generated stub for maybe_disconnect_peer */ +void maybe_disconnect_peer(struct lightningd *ld UNNEEDED, struct peer *peer UNNEEDED) +{ fprintf(stderr, "maybe_disconnect_peer called!\n"); abort(); } /* Generated stub for new_channel_mvt_invoice_hin */ struct channel_coin_mvt *new_channel_mvt_invoice_hin(const tal_t *ctx UNNEEDED, struct htlc_in *hin UNNEEDED, @@ -733,9 +736,6 @@ u8 *towire_channeld_offer_htlc(const tal_t *ctx UNNEEDED, struct amount_msat amo /* Generated stub for towire_channeld_sending_commitsig_reply */ u8 *towire_channeld_sending_commitsig_reply(const tal_t *ctx UNNEEDED) { fprintf(stderr, "towire_channeld_sending_commitsig_reply called!\n"); abort(); } -/* Generated stub for towire_connectd_discard_peer */ -u8 *towire_connectd_discard_peer(const tal_t *ctx UNNEEDED, const struct node_id *id UNNEEDED) -{ fprintf(stderr, "towire_connectd_discard_peer called!\n"); abort(); } /* Generated stub for towire_connectd_peer_final_msg */ u8 *towire_connectd_peer_final_msg(const tal_t *ctx UNNEEDED, const struct node_id *id UNNEEDED, const u8 *msg UNNEEDED) { fprintf(stderr, "towire_connectd_peer_final_msg called!\n"); abort(); }