Skip to content

Commit 69c252e

Browse files
committed
gossmap: implement gossmap_random_node(), use it in gossipd.
It's easy for gossmap, since it has access to the htable. Signed-off-by: Rusty Russell <[email protected]>
1 parent 363b721 commit 69c252e

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

common/gossmap.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,14 @@ struct gossmap_node *gossmap_next_node(const struct gossmap *map,
13901390
return node_iter(map, prev - map->node_arr + 1);
13911391
}
13921392

1393+
struct gossmap_node *gossmap_random_node(const struct gossmap *map)
1394+
{
1395+
ptrint_t *pi = nodeidx_htable_pick(map->nodes, pseudorand_u64(), NULL);
1396+
if (pi)
1397+
return ptrint2node(pi);
1398+
return NULL;
1399+
}
1400+
13931401
size_t gossmap_num_chans(const struct gossmap *map)
13941402
{
13951403
return chanidx_htable_count(map->channels);

common/gossmap.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,9 @@ struct gossmap_node *gossmap_first_node(const struct gossmap *map);
279279
struct gossmap_node *gossmap_next_node(const struct gossmap *map,
280280
const struct gossmap_node *prev);
281281

282+
/* Get me a random node */
283+
struct gossmap_node *gossmap_random_node(const struct gossmap *map);
284+
282285
/* Unsorted iterate through (do not add/remove channels or nodes!) */
283286
size_t gossmap_num_chans(const struct gossmap *map);
284287

gossipd/seeker.c

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -979,41 +979,24 @@ static struct node_and_addrs *get_random_node(const tal_t *ctx,
979979
struct seeker *seeker)
980980
{
981981
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
982-
if (gossmap_num_nodes(gossmap) < 1)
983-
return NULL;
984-
u32 max_idx = gossmap_max_node_idx(gossmap);
985-
if (max_idx < 1)
982+
struct gossmap_node *node = gossmap_random_node(gossmap);
983+
984+
if (!node)
986985
return NULL;
987986

988-
struct gossmap_node *random_node;
989-
struct node_and_addrs *found_node = NULL;
990987
for (int i = 0; i<20; i++) {
991-
u32 random = pseudorand(max_idx);
992-
random_node = gossmap_node_byidx(gossmap, random);
993-
if (!random_node) {
994-
continue;
995-
}
996-
found_node = tal(ctx, struct node_and_addrs);
988+
struct node_and_addrs *found_node = tal(ctx, struct node_and_addrs);
997989
found_node->id = tal(found_node, struct node_id);
998-
gossmap_node_get_id(gossmap, random_node, found_node->id);
999-
if (node_id_eq(found_node->id, &seeker->daemon->id)) {
1000-
found_node = tal_free(found_node);
1001-
continue;
1002-
}
990+
gossmap_node_get_id(gossmap, node, found_node->id);
1003991
found_node->addrs =
1004992
gossmap_manage_get_node_addresses(found_node,
1005993
seeker->daemon->gm,
1006994
found_node->id);
1007-
if (!found_node->addrs || tal_count(found_node->addrs) == 0) {
1008-
found_node = tal_free(found_node);
1009-
continue;
1010-
}
1011-
1012-
break;
995+
if (found_node->addrs && tal_count(found_node->addrs) != 0)
996+
return found_node;
997+
tal_free(found_node);
1013998
}
1014-
1015-
return found_node;
1016-
999+
return NULL;
10171000
}
10181001

10191002
/* Ask lightningd for more peers if we're short on gossip streamers. */

0 commit comments

Comments
 (0)