@@ -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+
818871static 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)
903960static 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. */
10271031static void seeker_check (struct seeker * seeker )
10281032{
0 commit comments