Skip to content

Commit

Permalink
connectd: don't ask DNS seeds for addresses on every reconnect.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
rustyrussell committed Jan 3, 2023
1 parent 5a4c840 commit 22eac96
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 9 deletions.
11 changes: 7 additions & 4 deletions connectd/connectd.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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. */
Expand Down
1 change: 1 addition & 0 deletions connectd/connectd_wire.csv
Expand Up @@ -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
Expand Down
18 changes: 13 additions & 5 deletions lightningd/connect_control.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand All @@ -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);
}
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit 22eac96

Please sign in to comment.