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 <rusty@rustcorp.com.au>
Changelog-Protocol: lightningd: Only use DNS server address lookup on manual `connect` commands, not normal reconnection attempts.
This commit is contained in:
Rusty Russell 2022-12-20 06:42:39 +10:30
parent 5a4c8402a7
commit 22eac96750
3 changed files with 21 additions and 9 deletions

View File

@ -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. */

View File

@ -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

1 #include <bitcoin/block.h>
50 msgdata,connectd_connect_failed,id,node_id, msgtype,connectd_connect_failed,2020
51 msgdata,connectd_connect_failed,failcode,enum jsonrpc_errcode, msgdata,connectd_connect_failed,id,node_id,
52 msgdata,connectd_connect_failed,failreason,wirestring, msgdata,connectd_connect_failed,failcode,enum jsonrpc_errcode,
53 msgdata,connectd_connect_failed,failreason,wirestring,
54 msgdata,connectd_connect_failed,addrhint,?wireaddr_internal,
55 # Connectd -> master: we got a peer.
56 msgtype,connectd_peer_connected,2002

View File

@ -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. */