Skip to content

Commit e6b8948

Browse files
authored
Merge pull request #2025 from mintlayer/p2p_pass_rng_to_peer_manager
Make peer manager use a provided RNG instead of creating a new one each time
2 parents 7512b34 + 12ba705 commit e6b8948

35 files changed

+1264
-493
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

p2p/benches/benches.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,14 @@ pub fn peer_db(c: &mut Criterion) {
3131
let db_store = peerdb_inmemory_store();
3232
let chain_config = create_unit_test_config();
3333
let p2p_config = Arc::new(test_p2p_config());
34-
let mut peerdb =
35-
PeerDb::<_>::new(&chain_config, p2p_config, Default::default(), db_store).unwrap();
34+
let mut peerdb = PeerDb::<_>::new(
35+
&chain_config,
36+
p2p_config,
37+
Default::default(),
38+
db_store,
39+
&mut rng,
40+
)
41+
.unwrap();
3642

3743
for _ in 0..100000 {
3844
peerdb.peer_discovered(TestAddressMaker::new_random_address(&mut rng).into());
@@ -54,7 +60,12 @@ pub fn peer_db(c: &mut Criterion) {
5460

5561
c.bench_function("PeerDb", |b| {
5662
b.iter(|| {
57-
peerdb.select_non_reserved_outbound_addresses(&outbound_addr_groups, &|_| true, 11)
63+
peerdb.select_non_reserved_outbound_addresses(
64+
&outbound_addr_groups,
65+
&|_| true,
66+
11,
67+
&mut rng,
68+
)
5869
})
5970
});
6071
}

p2p/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ use networking::transport::{
5757
TcpTransportSocket,
5858
};
5959
use peer_manager::peerdb::storage::PeerDbStorage;
60+
use randomness::make_true_rng;
6061
use types::socket_address::SocketAddress;
6162

6263
use crate::{
@@ -155,6 +156,8 @@ where
155156
peer_mgr_event_receiver,
156157
time_getter.clone(),
157158
peerdb_storage,
159+
// Note: a "true" rng is not really needed here, but `make_pseudo_rng`'s result is not `Send`.
160+
make_true_rng(),
158161
)?;
159162
let shutdown_ = Arc::clone(&shutdown);
160163
let peer_manager_task = tokio_spawn_in_current_tracing_span(

p2p/src/peer_manager/addr_list_response_cache.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::{
2020
};
2121

2222
use common::primitives::time::Time;
23-
use randomness::{make_pseudo_rng, Rng};
23+
use randomness::Rng;
2424

2525
use super::{peer_context::PeerContext, peerdb::salt::Salt};
2626

@@ -50,7 +50,13 @@ impl AddrListResponseCache {
5050
}
5151
}
5252

53-
pub fn get_or_create<F>(&mut self, peer_ctx: &PeerContext, now: Time, create: F) -> &Addresses
53+
pub fn get_or_create<F>(
54+
&mut self,
55+
peer_ctx: &PeerContext,
56+
now: Time,
57+
create: F,
58+
rng: &mut impl Rng,
59+
) -> &Addresses
5460
where
5561
F: FnOnce() -> Addresses,
5662
{
@@ -61,13 +67,13 @@ impl AddrListResponseCache {
6167
let cache_entry = match self.cache.entry(id) {
6268
Entry::Vacant(entry) => entry.insert(CacheEntry {
6369
addresses: create(),
64-
expiration_time: Self::new_expiration_time_from_now(now),
70+
expiration_time: Self::new_expiration_time_from_now(now, rng),
6571
}),
6672
Entry::Occupied(mut entry) => {
6773
if entry.get().expiration_time <= now {
6874
*entry.get_mut() = CacheEntry {
6975
addresses: create(),
70-
expiration_time: Self::new_expiration_time_from_now(now),
76+
expiration_time: Self::new_expiration_time_from_now(now, rng),
7177
};
7278
}
7379
entry.into_mut()
@@ -101,10 +107,10 @@ impl AddrListResponseCache {
101107
hasher.finish()
102108
}
103109

104-
fn new_expiration_time_from_now(now: Time) -> Time {
110+
fn new_expiration_time_from_now(now: Time, rng: &mut impl Rng) -> Time {
105111
let min_secs = EXPIRATION_INTERVAL_MIN.as_secs();
106112
let max_secs = EXPIRATION_INTERVAL_MAX.as_secs();
107-
let secs = make_pseudo_rng().gen_range(min_secs..=max_secs);
113+
let secs = rng.gen_range(min_secs..=max_secs);
108114
(now + Duration::from_secs(secs)).expect("Unexpected time overflow")
109115
}
110116
}

p2p/src/peer_manager/dns_seed.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@
1616
use std::sync::Arc;
1717

1818
use async_trait::async_trait;
19+
1920
use common::chain::ChainConfig;
2021
use logging::log;
2122
use p2p_types::{peer_address::PeerAddress, socket_address::SocketAddress};
22-
use randomness::{make_pseudo_rng, seq::IteratorRandom};
23+
use randomness::{seq::IteratorRandom, RngCore};
2324

2425
use crate::config::P2pConfig;
2526

2627
#[async_trait]
2728
pub trait DnsSeed: Send + Sync {
28-
async fn obtain_addresses(&self) -> Vec<SocketAddress>;
29+
async fn obtain_addresses(&self, rng: &mut (dyn RngCore + Send)) -> Vec<SocketAddress>;
2930
}
3031

3132
pub struct DefaultDnsSeed {
@@ -47,7 +48,7 @@ const MAX_DNS_RECORDS: usize = 10;
4748

4849
#[async_trait]
4950
impl DnsSeed for DefaultDnsSeed {
50-
async fn obtain_addresses(&self) -> Vec<SocketAddress> {
51+
async fn obtain_addresses(&self, rng: &mut (dyn RngCore + Send)) -> Vec<SocketAddress> {
5152
let dns_seeds = self.chain_config.dns_seeds();
5253

5354
if dns_seeds.is_empty() {
@@ -73,7 +74,7 @@ impl DnsSeed for DefaultDnsSeed {
7374
)
7475
})
7576
// Randomize selection because records can be sorted by type (A and AAAA)
76-
.choose_multiple(&mut make_pseudo_rng(), MAX_DNS_RECORDS)
77+
.choose_multiple(rng, MAX_DNS_RECORDS)
7778
.into_iter()
7879
.for_each(|addr| {
7980
addresses.push(addr);

0 commit comments

Comments
 (0)