gossipd: seeker: try to autoconnect with no peers

Testing autoconnect in --offline mode, the autoconnect never functions
if the seeker has not gotten out of the startup state.  This commit
overloads the  counter to start the autoconnect
attempt on the second round through the seeker_check.

Changelog-None
This commit is contained in:
Alex Myers
2024-11-28 16:43:41 +10:30
committed by Rusty Russell
parent b9984f876c
commit bb30049eca

View File

@@ -815,6 +815,59 @@ static void probe_many_random_scids(struct seeker *seeker)
return probe_random_scids(seeker, 10000);
}
/* Find a random node with an announcement. */
static struct node_id *get_random_node(const tal_t *ctx,
struct seeker *seeker)
{
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
struct gossmap_node *node = gossmap_random_node(gossmap);
if (!node)
return NULL;
for (int i = 0; i<20; i++) {
struct node_id id;
gossmap_node_get_id(gossmap, node, &id);
/* Make sure it *has* an announcement, and we're not
* already connected */
if (gossmap_node_get_announce(tmpctx, gossmap, node)
&& !find_peer(seeker->daemon, &id)) {
return tal_dup(ctx, struct node_id, &id);
}
node = gossmap_next_node(gossmap, node);
if (!node)
node = gossmap_first_node(gossmap);
}
return NULL;
}
/* Ask lightningd for more peers if we're short on gossip streamers. */
static void maybe_get_new_peer(struct seeker *seeker)
{
size_t connected_peers = peer_node_id_map_count(seeker->daemon->peers);
struct node_id *random_node;
/* Respect user-defined autoconnect peer limit. */
if (connected_peers >= seeker->daemon->autoconnect_seeker_peers)
return;
status_debug("seeker: need more peers for gossip (have %zu)",
connected_peers);
random_node = get_random_node(tmpctx, seeker);
if (!random_node) {
status_debug("seeker: no more potential peers found");
return;
}
u8 *msg = towire_gossipd_connect_to_peer(NULL, random_node);
daemon_conn_send(seeker->daemon->master, take(msg));
tal_free(random_node);
}
static void check_firstpeer(struct seeker *seeker)
{
struct peer *peer = seeker->random_peer;
@@ -826,6 +879,10 @@ static void check_firstpeer(struct seeker *seeker)
/* No peer? Wait for a new one to join. */
if (!peer) {
status_debug("seeker: no peers, waiting");
if (seeker->new_gossiper_elapsed)
maybe_get_new_peer(seeker);
else
seeker->new_gossiper_elapsed++;
return;
}
@@ -903,7 +960,7 @@ static bool peer_is_not_gossipper(const struct peer *peer)
static void reset_gossip_performance_metrics(struct seeker *seeker)
{
seeker->new_gossiper_elapsed = 0;
for (int i = 0; i < tal_count(seeker->gossiper); i++) {
for (size_t i = 0; i < tal_count(seeker->gossiper); i++) {
if (seeker->gossiper[i])
seeker->gossiper[i]->gossip_counter = 0;
}
@@ -939,7 +996,7 @@ static void maybe_rotate_gossipers(struct seeker *seeker)
return;
u32 lowest_count = UINT_MAX;
lowest_idx = 0;
for (int j = 0; j < tal_count(seeker->gossiper); j++) {
for (size_t j = 0; j < tal_count(seeker->gossiper); j++) {
if (seeker->gossiper[j]->gossip_counter < lowest_count) {
lowest_count = seeker->gossiper[j]->gossip_counter;
lowest_idx = j;
@@ -970,59 +1027,6 @@ static bool seek_any_unknown_nodes(struct seeker *seeker)
return true;
}
/* Find a random node with an announcement. */
static struct node_id *get_random_node(const tal_t *ctx,
struct seeker *seeker)
{
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
struct gossmap_node *node = gossmap_random_node(gossmap);
if (!node)
return NULL;
for (int i = 0; i<20; i++) {
struct node_id id;
gossmap_node_get_id(gossmap, node, &id);
/* Make sure it *has* an announcement, and we're not
* already connected */
if (gossmap_node_get_announce(tmpctx, gossmap, node)
&& !find_peer(seeker->daemon, &id)) {
return tal_dup(ctx, struct node_id, &id);
}
node = gossmap_next_node(gossmap, node);
if (!node)
node = gossmap_first_node(gossmap);
}
return NULL;
}
/* Ask lightningd for more peers if we're short on gossip streamers. */
static void maybe_get_new_peer(struct seeker *seeker)
{
size_t connected_peers = peer_node_id_map_count(seeker->daemon->peers);
struct node_id *random_node;
/* Respect user-defined autoconnect peer limit. */
if (connected_peers >= seeker->daemon->autoconnect_seeker_peers)
return;
status_debug("seeker: need more peers for gossip (have %zu)",
connected_peers);
random_node = get_random_node(tmpctx, seeker);
if (!random_node) {
status_debug("seeker: no more potential peers found");
return;
}
u8 *msg = towire_gossipd_connect_to_peer(NULL, random_node);
daemon_conn_send(seeker->daemon->master, take(msg));
tal_free(random_node);
}
/* Periodic timer to see how our gossip is going. */
static void seeker_check(struct seeker *seeker)
{