@@ -815,6 +815,59 @@ static void probe_many_random_scids(struct seeker *seeker)
815
815
return probe_random_scids (seeker , 10000 );
816
816
}
817
817
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
+
818
871
static void check_firstpeer (struct seeker * seeker )
819
872
{
820
873
struct peer * peer = seeker -> random_peer ;
@@ -826,6 +879,10 @@ static void check_firstpeer(struct seeker *seeker)
826
879
/* No peer? Wait for a new one to join. */
827
880
if (!peer ) {
828
881
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 ++ ;
829
886
return ;
830
887
}
831
888
@@ -903,7 +960,7 @@ static bool peer_is_not_gossipper(const struct peer *peer)
903
960
static void reset_gossip_performance_metrics (struct seeker * seeker )
904
961
{
905
962
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 ++ ) {
907
964
if (seeker -> gossiper [i ])
908
965
seeker -> gossiper [i ]-> gossip_counter = 0 ;
909
966
}
@@ -939,7 +996,7 @@ static void maybe_rotate_gossipers(struct seeker *seeker)
939
996
return ;
940
997
u32 lowest_count = UINT_MAX ;
941
998
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 ++ ) {
943
1000
if (seeker -> gossiper [j ]-> gossip_counter < lowest_count ) {
944
1001
lowest_count = seeker -> gossiper [j ]-> gossip_counter ;
945
1002
lowest_idx = j ;
@@ -970,59 +1027,6 @@ static bool seek_any_unknown_nodes(struct seeker *seeker)
970
1027
return true;
971
1028
}
972
1029
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
-
1026
1030
/* Periodic timer to see how our gossip is going. */
1027
1031
static void seeker_check (struct seeker * seeker )
1028
1032
{
0 commit comments