refactor: Simplify HeaderSyncGapProvider trait (#15819)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
Harrish Bansal
2025-04-22 15:10:56 +05:30
committed by GitHub
parent 97a1977cee
commit 701af23fa5
5 changed files with 35 additions and 35 deletions

View File

@@ -12,7 +12,10 @@ use reth_db_api::{
DbTxUnwindExt, RawKey, RawTable, RawValue,
};
use reth_etl::Collector;
use reth_network_p2p::headers::{downloader::HeaderDownloader, error::HeadersDownloaderError};
use reth_network_p2p::headers::{
downloader::{HeaderDownloader, SyncTarget},
error::HeadersDownloaderError,
};
use reth_primitives_traits::{serde_bincode_compat, FullBlockHeader, NodePrimitives, SealedHeader};
use reth_provider::{
providers::StaticFileWriter, BlockHashReader, DBProvider, HeaderProvider, HeaderSyncGap,
@@ -226,7 +229,9 @@ where
}
// Lookup the head and tip of the sync range
let gap = self.provider.sync_gap(self.tip.clone(), current_checkpoint.block_number)?;
let local_head = self.provider.local_tip_header(current_checkpoint.block_number)?;
let target = SyncTarget::Tip(*self.tip.borrow());
let gap = HeaderSyncGap { local_head, target };
let tip = gap.target.tip();
self.sync_gap = Some(gap.clone());

View File

@@ -42,9 +42,6 @@ alloy-consensus.workspace = true
revm-database.workspace = true
revm-state = { workspace = true, optional = true }
# async
tokio = { workspace = true, features = ["sync", "macros", "rt-multi-thread"] }
# tracing
tracing.workspace = true
@@ -63,6 +60,7 @@ eyre.workspace = true
# test-utils
reth-ethereum-engine-primitives = { workspace = true, optional = true }
tokio = { workspace = true, features = ["sync"], optional = true }
# parallel utils
rayon.workspace = true
@@ -84,6 +82,7 @@ assert_matches.workspace = true
rand.workspace = true
eyre.workspace = true
tokio = { workspace = true, features = ["sync", "macros", "rt-multi-thread"] }
alloy-consensus.workspace = true
[features]
@@ -104,4 +103,5 @@ test-utils = [
"reth-prune-types/test-utils",
"reth-stages-types/test-utils",
"revm-state",
"tokio",
]

View File

@@ -3,7 +3,7 @@ use crate::{
to_range,
traits::{BlockSource, ReceiptProvider},
BlockHashReader, BlockNumReader, BlockReader, ChainSpecProvider, DatabaseProviderFactory,
HashedPostStateProvider, HeaderProvider, HeaderSyncGap, HeaderSyncGapProvider, ProviderError,
HashedPostStateProvider, HeaderProvider, HeaderSyncGapProvider, ProviderError,
PruneCheckpointReader, StageCheckpointReader, StateProviderBox, StaticFileProviderFactory,
TransactionVariant, TransactionsProvider, WithdrawalsProvider,
};
@@ -35,7 +35,7 @@ use std::{
path::Path,
sync::Arc,
};
use tokio::sync::watch;
use tracing::trace;
mod provider;
@@ -228,12 +228,11 @@ impl<N: NodeTypesWithDB> StaticFileProviderFactory for ProviderFactory<N> {
impl<N: ProviderNodeTypes> HeaderSyncGapProvider for ProviderFactory<N> {
type Header = HeaderTy<N>;
fn sync_gap(
fn local_tip_header(
&self,
tip: watch::Receiver<B256>,
highest_uninterrupted_block: BlockNumber,
) -> ProviderResult<HeaderSyncGap<Self::Header>> {
self.provider()?.sync_gap(tip, highest_uninterrupted_block)
) -> ProviderResult<SealedHeader<Self::Header>> {
self.provider()?.local_tip_header(highest_uninterrupted_block)
}
}
@@ -650,8 +649,8 @@ mod tests {
use crate::{
providers::{StaticFileProvider, StaticFileWriter},
test_utils::{blocks::TEST_BLOCK, create_test_provider_factory, MockNodeTypesWithDB},
BlockHashReader, BlockNumReader, BlockWriter, DBProvider, HeaderSyncGapProvider,
StorageLocation, TransactionsProvider,
BlockHashReader, BlockNumReader, BlockWriter, DBProvider, HeaderSyncGap,
HeaderSyncGapProvider, StorageLocation, TransactionsProvider,
};
use alloy_primitives::{TxNumber, B256, U256};
use assert_matches::assert_matches;
@@ -662,6 +661,7 @@ mod tests {
test_utils::{create_test_static_files_dir, ERROR_TEMPDIR},
};
use reth_db_api::tables;
use reth_network_p2p::headers::downloader::SyncTarget;
use reth_primitives_traits::SignedTransaction;
use reth_prune_types::{PruneMode, PruneModes};
use reth_storage_errors::provider::ProviderError;
@@ -806,7 +806,7 @@ mod tests {
// Empty database
assert_matches!(
provider.sync_gap(tip_rx.clone(), checkpoint),
provider.local_tip_header(checkpoint),
Err(ProviderError::HeaderNotFound(block_number))
if block_number.as_number().unwrap() == checkpoint
);
@@ -819,7 +819,9 @@ mod tests {
static_file_writer.commit().unwrap();
drop(static_file_writer);
let gap = provider.sync_gap(tip_rx, checkpoint).unwrap();
let local_head = provider.local_tip_header(checkpoint).unwrap();
let gap = HeaderSyncGap { local_head, target: SyncTarget::Tip(*tip_rx.borrow()) };
assert_eq!(gap.local_head, head);
assert_eq!(gap.target.tip(), consensus_tip.into());
}

View File

@@ -11,13 +11,13 @@ use crate::{
},
AccountReader, BlockBodyWriter, BlockExecutionWriter, BlockHashReader, BlockNumReader,
BlockReader, BlockWriter, BundleStateInit, ChainStateBlockReader, ChainStateBlockWriter,
DBProvider, HashingWriter, HeaderProvider, HeaderSyncGap, HeaderSyncGapProvider,
HistoricalStateProvider, HistoricalStateProviderRef, HistoryWriter, LatestStateProvider,
LatestStateProviderRef, OriginalValuesKnown, ProviderError, PruneCheckpointReader,
PruneCheckpointWriter, RevertsInit, StageCheckpointReader, StateCommitmentProvider,
StateProviderBox, StateWriter, StaticFileProviderFactory, StatsReader, StorageLocation,
StorageReader, StorageTrieWriter, TransactionVariant, TransactionsProvider,
TransactionsProviderExt, TrieWriter, WithdrawalsProvider,
DBProvider, HashingWriter, HeaderProvider, HeaderSyncGapProvider, HistoricalStateProvider,
HistoricalStateProviderRef, HistoryWriter, LatestStateProvider, LatestStateProviderRef,
OriginalValuesKnown, ProviderError, PruneCheckpointReader, PruneCheckpointWriter, RevertsInit,
StageCheckpointReader, StateCommitmentProvider, StateProviderBox, StateWriter,
StaticFileProviderFactory, StatsReader, StorageLocation, StorageReader, StorageTrieWriter,
TransactionVariant, TransactionsProvider, TransactionsProviderExt, TrieWriter,
WithdrawalsProvider,
};
use alloy_consensus::{transaction::TransactionMeta, BlockHeader, Header, TxReceipt};
use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawals, BlockHashOrNumber};
@@ -42,7 +42,6 @@ use reth_db_api::{
BlockNumberList, DatabaseError, PlainAccountState, PlainStorageState,
};
use reth_execution_types::{Chain, ExecutionOutcome};
use reth_network_p2p::headers::downloader::SyncTarget;
use reth_node_types::{BlockTy, BodyTy, HeaderTy, NodeTypes, ReceiptTy, TxTy};
use reth_primitives_traits::{
Account, Block as _, BlockBody as _, Bytecode, GotExpected, NodePrimitives, RecoveredBlock,
@@ -74,7 +73,6 @@ use std::{
ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive},
sync::{mpsc, Arc},
};
use tokio::sync::watch;
use tracing::{debug, trace};
/// A [`DatabaseProvider`] that holds a read-only database transaction.
@@ -939,11 +937,10 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> HeaderSyncGapProvider
{
type Header = HeaderTy<N>;
fn sync_gap(
fn local_tip_header(
&self,
tip: watch::Receiver<B256>,
highest_uninterrupted_block: BlockNumber,
) -> ProviderResult<HeaderSyncGap<Self::Header>> {
) -> ProviderResult<SealedHeader<Self::Header>> {
let static_file_provider = self.static_file_provider();
// Make sure Headers static file is at the same height. If it's further, this
@@ -976,9 +973,7 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> HeaderSyncGapProvider
.sealed_header(highest_uninterrupted_block)?
.ok_or_else(|| ProviderError::HeaderNotFound(highest_uninterrupted_block.into()))?;
let target = SyncTarget::Tip(*tip.borrow());
Ok(HeaderSyncGap { local_head, target })
Ok(local_head)
}
}

View File

@@ -1,10 +1,9 @@
use alloy_consensus::{BlockHeader, Header};
use alloy_eips::BlockHashOrNumber;
use alloy_primitives::{BlockNumber, Sealable, B256};
use alloy_primitives::{BlockNumber, Sealable};
use reth_network_p2p::headers::downloader::SyncTarget;
use reth_primitives_traits::SealedHeader;
use reth_storage_errors::provider::ProviderResult;
use tokio::sync::watch;
/// Represents a gap to sync: from `local_head` to `target`
#[derive(Clone, Debug)]
@@ -37,9 +36,8 @@ pub trait HeaderSyncGapProvider: Send + Sync {
/// uninterrupted block number. Last uninterrupted block represents the block number before
/// which there are no gaps. It's up to the caller to ensure that last uninterrupted block is
/// determined correctly.
fn sync_gap(
fn local_tip_header(
&self,
tip: watch::Receiver<B256>,
highest_uninterrupted_block: BlockNumber,
) -> ProviderResult<HeaderSyncGap<Self::Header>>;
) -> ProviderResult<SealedHeader<Self::Header>>;
}