reth_network_p2p/sync.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
//! Traits used when interacting with the sync status of the network.
use reth_primitives::Head;
/// A type that provides information about whether the node is currently syncing and the network is
/// currently serving syncing related requests.
#[auto_impl::auto_impl(&, Arc, Box)]
pub trait SyncStateProvider: Send + Sync {
/// Returns `true` if the network is undergoing sync.
fn is_syncing(&self) -> bool;
/// Returns `true` if the network is undergoing an initial (pipeline) sync.
fn is_initially_syncing(&self) -> bool;
}
/// An updater for updating the [SyncState] and status of the network.
///
/// The node is either syncing, or it is idle.
/// While syncing, the node will download data from the network and process it. The processing
/// consists of several stages, like recovering senders, executing the blocks and indexing.
/// Eventually the node reaches the `Finish` stage and will transition to [`SyncState::Idle`], it
/// which point the node is considered fully synced.
#[auto_impl::auto_impl(&, Arc, Box)]
pub trait NetworkSyncUpdater: std::fmt::Debug + Send + Sync + 'static {
/// Notifies about a [SyncState] update.
fn update_sync_state(&self, state: SyncState);
/// Updates the status of the p2p node
fn update_status(&self, head: Head);
}
/// The state the network is currently in when it comes to synchronization.
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum SyncState {
/// Node sync is complete.
///
/// The network just serves requests to keep up of the chain.
Idle,
/// Network is syncing
Syncing,
}
impl SyncState {
/// Whether the node is currently syncing.
///
/// Note: this does not include keep-up sync when the state is idle.
pub const fn is_syncing(&self) -> bool {
!matches!(self, Self::Idle)
}
}
/// A [`NetworkSyncUpdater`] implementation that does nothing.
#[derive(Clone, Copy, Debug, Default)]
#[non_exhaustive]
pub struct NoopSyncStateUpdater;
impl SyncStateProvider for NoopSyncStateUpdater {
fn is_syncing(&self) -> bool {
false
}
fn is_initially_syncing(&self) -> bool {
false
}
}
impl NetworkSyncUpdater for NoopSyncStateUpdater {
fn update_sync_state(&self, _state: SyncState) {}
fn update_status(&self, _: Head) {}
}