Skip to content

Commit bb30049

Browse files
endothermicdevrustyrussell
authored andcommitted
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
1 parent b9984f8 commit bb30049

File tree

1 file changed

+59
-55
lines changed

1 file changed

+59
-55
lines changed

gossipd/seeker.c

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,59 @@ static void probe_many_random_scids(struct seeker *seeker)
815815
return probe_random_scids(seeker, 10000);
816816
}
817817

818+
/* Find a random node with an announcement. */
819+
static struct node_id *get_random_node(const tal_t *ctx,
820+
struct seeker *seeker)
821+
{
822+
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
823+
struct gossmap_node *node = gossmap_random_node(gossmap);
824+
825+
if (!node)
826+
return NULL;
827+
828+
for (int i = 0; i<20; i++) {
829+
struct node_id id;
830+
831+
gossmap_node_get_id(gossmap, node, &id);
832+
/* Make sure it *has* an announcement, and we're not
833+
* already connected */
834+
if (gossmap_node_get_announce(tmpctx, gossmap, node)
835+
&& !find_peer(seeker->daemon, &id)) {
836+
return tal_dup(ctx, struct node_id, &id);
837+
}
838+
839+
node = gossmap_next_node(gossmap, node);
840+
if (!node)
841+
node = gossmap_first_node(gossmap);
842+
}
843+
844+
return NULL;
845+
}
846+
847+
/* Ask lightningd for more peers if we're short on gossip streamers. */
848+
static void maybe_get_new_peer(struct seeker *seeker)
849+
{
850+
size_t connected_peers = peer_node_id_map_count(seeker->daemon->peers);
851+
struct node_id *random_node;
852+
853+
/* Respect user-defined autoconnect peer limit. */
854+
if (connected_peers >= seeker->daemon->autoconnect_seeker_peers)
855+
return;
856+
857+
status_debug("seeker: need more peers for gossip (have %zu)",
858+
connected_peers);
859+
860+
random_node = get_random_node(tmpctx, seeker);
861+
if (!random_node) {
862+
status_debug("seeker: no more potential peers found");
863+
return;
864+
}
865+
866+
u8 *msg = towire_gossipd_connect_to_peer(NULL, random_node);
867+
daemon_conn_send(seeker->daemon->master, take(msg));
868+
tal_free(random_node);
869+
}
870+
818871
static void check_firstpeer(struct seeker *seeker)
819872
{
820873
struct peer *peer = seeker->random_peer;
@@ -826,6 +879,10 @@ static void check_firstpeer(struct seeker *seeker)
826879
/* No peer? Wait for a new one to join. */
827880
if (!peer) {
828881
status_debug("seeker: no peers, waiting");
882+
if (seeker->new_gossiper_elapsed)
883+
maybe_get_new_peer(seeker);
884+
else
885+
seeker->new_gossiper_elapsed++;
829886
return;
830887
}
831888

@@ -903,7 +960,7 @@ static bool peer_is_not_gossipper(const struct peer *peer)
903960
static void reset_gossip_performance_metrics(struct seeker *seeker)
904961
{
905962
seeker->new_gossiper_elapsed = 0;
906-
for (int i = 0; i < tal_count(seeker->gossiper); i++) {
963+
for (size_t i = 0; i < tal_count(seeker->gossiper); i++) {
907964
if (seeker->gossiper[i])
908965
seeker->gossiper[i]->gossip_counter = 0;
909966
}
@@ -939,7 +996,7 @@ static void maybe_rotate_gossipers(struct seeker *seeker)
939996
return;
940997
u32 lowest_count = UINT_MAX;
941998
lowest_idx = 0;
942-
for (int j = 0; j < tal_count(seeker->gossiper); j++) {
999+
for (size_t j = 0; j < tal_count(seeker->gossiper); j++) {
9431000
if (seeker->gossiper[j]->gossip_counter < lowest_count) {
9441001
lowest_count = seeker->gossiper[j]->gossip_counter;
9451002
lowest_idx = j;
@@ -970,59 +1027,6 @@ static bool seek_any_unknown_nodes(struct seeker *seeker)
9701027
return true;
9711028
}
9721029

973-
/* Find a random node with an announcement. */
974-
static struct node_id *get_random_node(const tal_t *ctx,
975-
struct seeker *seeker)
976-
{
977-
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
978-
struct gossmap_node *node = gossmap_random_node(gossmap);
979-
980-
if (!node)
981-
return NULL;
982-
983-
for (int i = 0; i<20; i++) {
984-
struct node_id id;
985-
986-
gossmap_node_get_id(gossmap, node, &id);
987-
/* Make sure it *has* an announcement, and we're not
988-
* already connected */
989-
if (gossmap_node_get_announce(tmpctx, gossmap, node)
990-
&& !find_peer(seeker->daemon, &id)) {
991-
return tal_dup(ctx, struct node_id, &id);
992-
}
993-
994-
node = gossmap_next_node(gossmap, node);
995-
if (!node)
996-
node = gossmap_first_node(gossmap);
997-
}
998-
999-
return NULL;
1000-
}
1001-
1002-
/* Ask lightningd for more peers if we're short on gossip streamers. */
1003-
static void maybe_get_new_peer(struct seeker *seeker)
1004-
{
1005-
size_t connected_peers = peer_node_id_map_count(seeker->daemon->peers);
1006-
struct node_id *random_node;
1007-
1008-
/* Respect user-defined autoconnect peer limit. */
1009-
if (connected_peers >= seeker->daemon->autoconnect_seeker_peers)
1010-
return;
1011-
1012-
status_debug("seeker: need more peers for gossip (have %zu)",
1013-
connected_peers);
1014-
1015-
random_node = get_random_node(tmpctx, seeker);
1016-
if (!random_node) {
1017-
status_debug("seeker: no more potential peers found");
1018-
return;
1019-
}
1020-
1021-
u8 *msg = towire_gossipd_connect_to_peer(NULL, random_node);
1022-
daemon_conn_send(seeker->daemon->master, take(msg));
1023-
tal_free(random_node);
1024-
}
1025-
10261030
/* Periodic timer to see how our gossip is going. */
10271031
static void seeker_check(struct seeker *seeker)
10281032
{

0 commit comments

Comments
 (0)