mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 21:35:11 +01:00
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 <rusty@rustcorp.com.au>
This commit is contained in:
parent
363b721cd3
commit
69c252e06f
@ -1390,6 +1390,14 @@ struct gossmap_node *gossmap_next_node(const struct gossmap *map,
|
|||||||
return node_iter(map, prev - map->node_arr + 1);
|
return node_iter(map, prev - map->node_arr + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct gossmap_node *gossmap_random_node(const struct gossmap *map)
|
||||||
|
{
|
||||||
|
ptrint_t *pi = nodeidx_htable_pick(map->nodes, pseudorand_u64(), NULL);
|
||||||
|
if (pi)
|
||||||
|
return ptrint2node(pi);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
size_t gossmap_num_chans(const struct gossmap *map)
|
size_t gossmap_num_chans(const struct gossmap *map)
|
||||||
{
|
{
|
||||||
return chanidx_htable_count(map->channels);
|
return chanidx_htable_count(map->channels);
|
||||||
|
@ -279,6 +279,9 @@ struct gossmap_node *gossmap_first_node(const struct gossmap *map);
|
|||||||
struct gossmap_node *gossmap_next_node(const struct gossmap *map,
|
struct gossmap_node *gossmap_next_node(const struct gossmap *map,
|
||||||
const struct gossmap_node *prev);
|
const struct gossmap_node *prev);
|
||||||
|
|
||||||
|
/* Get me a random node */
|
||||||
|
struct gossmap_node *gossmap_random_node(const struct gossmap *map);
|
||||||
|
|
||||||
/* Unsorted iterate through (do not add/remove channels or nodes!) */
|
/* Unsorted iterate through (do not add/remove channels or nodes!) */
|
||||||
size_t gossmap_num_chans(const struct gossmap *map);
|
size_t gossmap_num_chans(const struct gossmap *map);
|
||||||
|
|
||||||
|
@ -979,41 +979,24 @@ static struct node_and_addrs *get_random_node(const tal_t *ctx,
|
|||||||
struct seeker *seeker)
|
struct seeker *seeker)
|
||||||
{
|
{
|
||||||
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
|
struct gossmap *gossmap = gossmap_manage_get_gossmap(seeker->daemon->gm);
|
||||||
if (gossmap_num_nodes(gossmap) < 1)
|
struct gossmap_node *node = gossmap_random_node(gossmap);
|
||||||
return NULL;
|
|
||||||
u32 max_idx = gossmap_max_node_idx(gossmap);
|
if (!node)
|
||||||
if (max_idx < 1)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
struct gossmap_node *random_node;
|
|
||||||
struct node_and_addrs *found_node = NULL;
|
|
||||||
for (int i = 0; i<20; i++) {
|
for (int i = 0; i<20; i++) {
|
||||||
u32 random = pseudorand(max_idx);
|
struct node_and_addrs *found_node = tal(ctx, struct node_and_addrs);
|
||||||
random_node = gossmap_node_byidx(gossmap, random);
|
|
||||||
if (!random_node) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
found_node = tal(ctx, struct node_and_addrs);
|
|
||||||
found_node->id = tal(found_node, struct node_id);
|
found_node->id = tal(found_node, struct node_id);
|
||||||
gossmap_node_get_id(gossmap, random_node, found_node->id);
|
gossmap_node_get_id(gossmap, node, found_node->id);
|
||||||
if (node_id_eq(found_node->id, &seeker->daemon->id)) {
|
|
||||||
found_node = tal_free(found_node);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
found_node->addrs =
|
found_node->addrs =
|
||||||
gossmap_manage_get_node_addresses(found_node,
|
gossmap_manage_get_node_addresses(found_node,
|
||||||
seeker->daemon->gm,
|
seeker->daemon->gm,
|
||||||
found_node->id);
|
found_node->id);
|
||||||
if (!found_node->addrs || tal_count(found_node->addrs) == 0) {
|
if (found_node->addrs && tal_count(found_node->addrs) != 0)
|
||||||
found_node = tal_free(found_node);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return found_node;
|
return found_node;
|
||||||
|
tal_free(found_node);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask lightningd for more peers if we're short on gossip streamers. */
|
/* Ask lightningd for more peers if we're short on gossip streamers. */
|
||||||
|
Loading…
Reference in New Issue
Block a user