Skip to content

Commit 4a00fca

Browse files
authored
Merge pull request #835 from openmina/fix/transition_frontier/use_random_peers_for_fetch
Transition Frontier Sync: use random peer to fetch staged ledger parts or best tip
2 parents 838282d + a26d932 commit 4a00fca

File tree

6 files changed

+17
-5
lines changed

6 files changed

+17
-5
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.

node/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition = "2021"
55
license = "Apache-2.0"
66

77
[dependencies]
8+
rand = "0.8.0"
89
serde = "1.0.147"
910
serde_json = { version = "1.0.82", features = ["unbounded_depth", "arbitrary_precision"] }
1011
serde_with = { version = "3.6.1", features = ["time_0_3"] }

node/src/effects.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use openmina_core::log::system_time;
2+
use rand::prelude::*;
23

34
use crate::block_producer::{block_producer_effects, BlockProducerAction};
45
use crate::event_source::event_source_effects;
@@ -120,10 +121,12 @@ use mina_p2p_messages::v2::StateHash;
120121

121122
fn request_best_tip<S: Service>(store: &mut Store<S>, _consensus_best_tip_hash: Option<StateHash>) {
122123
let p2p = p2p_ready!(store.state().p2p, "request_best_tip", system_time());
123-
if let Some((peer_id, id)) = p2p.ready_rpc_peers_iter().last() {
124+
125+
let peers = p2p.ready_rpc_peers_iter().collect::<Vec<_>>();
126+
if let Some((peer_id, id)) = peers.choose(&mut store.state().pseudo_rng()) {
124127
store.dispatch(P2pChannelsRpcAction::RequestSend {
125-
peer_id,
126-
id,
128+
peer_id: *peer_id,
129+
id: *id,
127130
request: Box::new(P2pRpcRequest::BestTipWithProof),
128131
on_init: None,
129132
});

node/src/state.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::Arc;
22

33
use mina_p2p_messages::v2::{MinaBaseUserCommandStableV2, MinaBlockBlockStableV2};
4+
use rand::prelude::*;
45

56
use openmina_core::block::BlockWithHash;
67
use openmina_core::requests::RpcId;
@@ -252,6 +253,10 @@ impl State {
252253
self.last_action.time()
253254
}
254255

256+
pub fn pseudo_rng(&self) -> StdRng {
257+
StdRng::seed_from_u64(self.time().into())
258+
}
259+
255260
/// Must be called in the global reducer as the last thing only once
256261
/// and only there!
257262
pub fn action_applied(&mut self, action: &ActionWithMeta) {

node/src/transition_frontier/sync/ledger/staged/transition_frontier_sync_ledger_staged_reducer.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use p2p::{
66
},
77
PeerId,
88
};
9+
use rand::prelude::*;
910

1011
use crate::ledger::write::{LedgerWriteAction, LedgerWriteRequest};
1112

@@ -44,9 +45,10 @@ impl TransitionFrontierSyncLedgerStagedState {
4445
};
4546
let block_hash = staged_ledger.target().staged.block_hash.clone();
4647

47-
let ready_peers = staged_ledger
48+
let mut ready_peers = staged_ledger
4849
.filter_available_peers(p2p.ready_rpc_peers_iter())
4950
.collect::<Vec<_>>();
51+
ready_peers.shuffle(&mut global_state.pseudo_rng());
5052

5153
for (peer_id, rpc_id) in ready_peers {
5254
let enqueued = if p2p.is_libp2p_peer(&peer_id) {

p2p/src/channels/signaling/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl crate::P2pState {
5252
);
5353

5454
/// random shuffle available peers
55-
use rand::{seq::SliceRandom, SeedableRng};
55+
use rand::prelude::*;
5656
let mut rng = rand::rngs::StdRng::seed_from_u64(time.into());
5757
let mut available_peers_ordered = available_peers.iter().copied().collect::<Vec<_>>();
5858
available_peers_ordered.shuffle(&mut rng);

0 commit comments

Comments
 (0)