From 22eac967502bc465cb63bfcf337e23e552ec0465 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 20 Dec 2022 06:42:39 +1030 Subject: [PATCH] connectd: don't ask DNS seeds for addresses on every reconnect. We were stressing the servers if node cannot be found. Only do lookup on manual connect commands. Signed-off-by: Rusty Russell Changelog-Protocol: lightningd: Only use DNS server address lookup on manual `connect` commands, not normal reconnection attempts. --- connectd/connectd.c | 11 +++++++---- connectd/connectd_wire.csv | 1 + lightningd/connect_control.c | 18 +++++++++++++----- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/connectd/connectd.c b/connectd/connectd.c index debe87693..f66abd13f 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -1716,7 +1716,8 @@ static void add_gossip_addrs(struct wireaddr_internal **addrs, static void try_connect_peer(struct daemon *daemon, const struct node_id *id, struct wireaddr *gossip_addrs, - struct wireaddr_internal *addrhint STEALS) + struct wireaddr_internal *addrhint STEALS, + bool dns_fallback) { struct wireaddr_internal *addrs; bool use_proxy = daemon->always_use_proxy; @@ -1762,7 +1763,7 @@ static void try_connect_peer(struct daemon *daemon, chainparams_get_ln_port(chainparams)); tal_arr_expand(&addrs, unresolved); } - } else if (daemon->use_dns) { + } else if (daemon->use_dns && dns_fallback) { add_seed_addrs(&addrs, id, daemon->broken_resolver_response); } @@ -1804,12 +1805,14 @@ static void connect_to_peer(struct daemon *daemon, const u8 *msg) struct node_id id; struct wireaddr_internal *addrhint; struct wireaddr *addrs; + bool dns_fallback; if (!fromwire_connectd_connect_to_peer(tmpctx, msg, - &id, &addrs, &addrhint)) + &id, &addrs, &addrhint, + &dns_fallback)) master_badmsg(WIRE_CONNECTD_CONNECT_TO_PEER, msg); - try_connect_peer(daemon, &id, addrs, addrhint); + try_connect_peer(daemon, &id, addrs, addrhint, dns_fallback); } /* lightningd tells us a peer should be disconnected. */ diff --git a/connectd/connectd_wire.csv b/connectd/connectd_wire.csv index 16c6953d8..d8b77d0a4 100644 --- a/connectd/connectd_wire.csv +++ b/connectd/connectd_wire.csv @@ -50,6 +50,7 @@ msgdata,connectd_connect_to_peer,id,node_id, msgdata,connectd_connect_to_peer,len,u32, msgdata,connectd_connect_to_peer,addrs,wireaddr,len msgdata,connectd_connect_to_peer,addrhint,?wireaddr_internal, +msgdata,connectd_connect_to_peer,dns_fallback,bool, # Connectd->master: connect failed. msgtype,connectd_connect_failed,2020 diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 61a6bcca8..b85e3bd95 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -76,7 +76,8 @@ static void try_connect(const tal_t *ctx, struct lightningd *ld, const struct node_id *id, u32 seconds_delay, - const struct wireaddr_internal *addrhint); + const struct wireaddr_internal *addrhint, + bool dns_fallback); struct id_and_addr { struct node_id id; @@ -226,7 +227,7 @@ static struct command_result *json_connect(struct command *cmd, &peer->addr); } - try_connect(cmd, cmd->ld, &id_addr.id, 0, addr); + try_connect(cmd, cmd->ld, &id_addr.id, 0, addr, true); /* Leave this here for peer_connected, connect_failed or peer_disconnect_done. */ new_connect(cmd->ld, &id_addr.id, cmd); @@ -248,6 +249,7 @@ struct delayed_reconnect { struct lightningd *ld; struct node_id id; struct wireaddr_internal *addrhint; + bool dns_fallback; }; static void gossipd_got_addrs(struct subd *subd, @@ -265,7 +267,8 @@ static void gossipd_got_addrs(struct subd *subd, connectmsg = towire_connectd_connect_to_peer(NULL, &d->id, addrs, - d->addrhint); + d->addrhint, + d->dns_fallback); subd_send_msg(d->ld->connectd, take(connectmsg)); tal_free(d); } @@ -282,7 +285,8 @@ static void try_connect(const tal_t *ctx, struct lightningd *ld, const struct node_id *id, u32 seconds_delay, - const struct wireaddr_internal *addrhint) + const struct wireaddr_internal *addrhint, + bool dns_fallback) { struct delayed_reconnect *d; struct peer *peer; @@ -291,6 +295,7 @@ static void try_connect(const tal_t *ctx, d->ld = ld; d->id = *id; d->addrhint = tal_dup_or_null(d, struct wireaddr_internal, addrhint); + d->dns_fallback = dns_fallback; if (!seconds_delay) { do_connect(d); @@ -347,11 +352,14 @@ void try_reconnect(const tal_t *ctx, } else peer->reconnect_delay = INITIAL_WAIT_SECONDS; + /* We only do DNS fallback lookups for manual connections, to + * avoid stressing DNS servers for private nodes (sorry!) */ try_connect(ctx, peer->ld, &peer->id, peer->reconnect_delay, - addrhint); + addrhint, + false); } /* We were trying to connect, but they disconnected. */