mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
fix: use the same ProviderFactory in reth node (#5778)
This commit is contained in:
@ -304,7 +304,8 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
debug!(target: "reth::cli", "configured blockchain tree");
|
debug!(target: "reth::cli", "configured blockchain tree");
|
||||||
|
|
||||||
// fetch the head block from the database
|
// fetch the head block from the database
|
||||||
let head = self.lookup_head(Arc::clone(&db)).wrap_err("the head block is missing")?;
|
let head =
|
||||||
|
self.lookup_head(provider_factory.clone()).wrap_err("the head block is missing")?;
|
||||||
|
|
||||||
// setup the blockchain provider
|
// setup the blockchain provider
|
||||||
let blockchain_db =
|
let blockchain_db =
|
||||||
@ -346,7 +347,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
let default_peers_path = data_dir.known_peers_path();
|
let default_peers_path = data_dir.known_peers_path();
|
||||||
let network_config = self.load_network_config(
|
let network_config = self.load_network_config(
|
||||||
&config,
|
&config,
|
||||||
Arc::clone(&db),
|
provider_factory.clone(),
|
||||||
ctx.task_executor.clone(),
|
ctx.task_executor.clone(),
|
||||||
head,
|
head,
|
||||||
secret_key,
|
secret_key,
|
||||||
@ -389,7 +390,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
let max_block = if let Some(block) = self.debug.max_block {
|
let max_block = if let Some(block) = self.debug.max_block {
|
||||||
Some(block)
|
Some(block)
|
||||||
} else if let Some(tip) = self.debug.tip {
|
} else if let Some(tip) = self.debug.tip {
|
||||||
Some(self.lookup_or_fetch_tip(&db, &network_client, tip).await?)
|
Some(self.lookup_or_fetch_tip(provider_factory.clone(), &network_client, tip).await?)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
@ -425,7 +426,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
&config.stages,
|
&config.stages,
|
||||||
client.clone(),
|
client.clone(),
|
||||||
Arc::clone(&consensus),
|
Arc::clone(&consensus),
|
||||||
provider_factory,
|
provider_factory.clone(),
|
||||||
&ctx.task_executor,
|
&ctx.task_executor,
|
||||||
sync_metrics_tx,
|
sync_metrics_tx,
|
||||||
prune_config.clone(),
|
prune_config.clone(),
|
||||||
@ -445,7 +446,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
&config.stages,
|
&config.stages,
|
||||||
network_client.clone(),
|
network_client.clone(),
|
||||||
Arc::clone(&consensus),
|
Arc::clone(&consensus),
|
||||||
provider_factory,
|
provider_factory.clone(),
|
||||||
&ctx.task_executor,
|
&ctx.task_executor,
|
||||||
sync_metrics_tx,
|
sync_metrics_tx,
|
||||||
prune_config.clone(),
|
prune_config.clone(),
|
||||||
@ -476,7 +477,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
let pruner_events = if let Some(prune_config) = prune_config {
|
let pruner_events = if let Some(prune_config) = prune_config {
|
||||||
let mut pruner = self.build_pruner(
|
let mut pruner = self.build_pruner(
|
||||||
&prune_config,
|
&prune_config,
|
||||||
db.clone(),
|
provider_factory,
|
||||||
tree_config,
|
tree_config,
|
||||||
snapshotter.highest_snapshot_receiver(),
|
snapshotter.highest_snapshot_receiver(),
|
||||||
);
|
);
|
||||||
@ -747,8 +748,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
/// Fetches the head block from the database.
|
/// Fetches the head block from the database.
|
||||||
///
|
///
|
||||||
/// If the database is empty, returns the genesis block.
|
/// If the database is empty, returns the genesis block.
|
||||||
fn lookup_head<DB: Database>(&self, db: DB) -> RethResult<Head> {
|
fn lookup_head<DB: Database>(&self, factory: ProviderFactory<DB>) -> RethResult<Head> {
|
||||||
let factory = ProviderFactory::new(db, self.chain.clone());
|
|
||||||
let provider = factory.provider()?;
|
let provider = factory.provider()?;
|
||||||
|
|
||||||
let head = provider.get_stage_checkpoint(StageId::Finish)?.unwrap_or_default().block_number;
|
let head = provider.get_stage_checkpoint(StageId::Finish)?.unwrap_or_default().block_number;
|
||||||
@ -780,7 +780,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
/// NOTE: The download is attempted with infinite retries.
|
/// NOTE: The download is attempted with infinite retries.
|
||||||
async fn lookup_or_fetch_tip<DB, Client>(
|
async fn lookup_or_fetch_tip<DB, Client>(
|
||||||
&self,
|
&self,
|
||||||
db: DB,
|
provider_factory: ProviderFactory<DB>,
|
||||||
client: Client,
|
client: Client,
|
||||||
tip: B256,
|
tip: B256,
|
||||||
) -> RethResult<u64>
|
) -> RethResult<u64>
|
||||||
@ -788,7 +788,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
DB: Database,
|
DB: Database,
|
||||||
Client: HeadersClient,
|
Client: HeadersClient,
|
||||||
{
|
{
|
||||||
Ok(self.fetch_tip(db, client, BlockHashOrNumber::Hash(tip)).await?.number)
|
Ok(self.fetch_tip(provider_factory, client, BlockHashOrNumber::Hash(tip)).await?.number)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempt to look up the block with the given number and return the header.
|
/// Attempt to look up the block with the given number and return the header.
|
||||||
@ -796,7 +796,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
/// NOTE: The download is attempted with infinite retries.
|
/// NOTE: The download is attempted with infinite retries.
|
||||||
async fn fetch_tip<DB, Client>(
|
async fn fetch_tip<DB, Client>(
|
||||||
&self,
|
&self,
|
||||||
db: DB,
|
factory: ProviderFactory<DB>,
|
||||||
client: Client,
|
client: Client,
|
||||||
tip: BlockHashOrNumber,
|
tip: BlockHashOrNumber,
|
||||||
) -> RethResult<SealedHeader>
|
) -> RethResult<SealedHeader>
|
||||||
@ -804,7 +804,6 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
DB: Database,
|
DB: Database,
|
||||||
Client: HeadersClient,
|
Client: HeadersClient,
|
||||||
{
|
{
|
||||||
let factory = ProviderFactory::new(db, self.chain.clone());
|
|
||||||
let provider = factory.provider()?;
|
let provider = factory.provider()?;
|
||||||
|
|
||||||
let header = provider.header_by_hash_or_number(tip)?;
|
let header = provider.header_by_hash_or_number(tip)?;
|
||||||
@ -832,7 +831,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
fn load_network_config<DB: Database>(
|
fn load_network_config<DB: Database>(
|
||||||
&self,
|
&self,
|
||||||
config: &Config,
|
config: &Config,
|
||||||
db: DB,
|
provider_factory: ProviderFactory<DB>,
|
||||||
executor: TaskExecutor,
|
executor: TaskExecutor,
|
||||||
head: Head,
|
head: Head,
|
||||||
secret_key: SecretKey,
|
secret_key: SecretKey,
|
||||||
@ -862,7 +861,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
.sequencer_endpoint(self.rollup.sequencer_http.clone())
|
.sequencer_endpoint(self.rollup.sequencer_http.clone())
|
||||||
.disable_tx_gossip(self.rollup.disable_txpool_gossip);
|
.disable_tx_gossip(self.rollup.disable_txpool_gossip);
|
||||||
|
|
||||||
cfg_builder.build(ProviderFactory::new(db, self.chain.clone()))
|
cfg_builder.build(provider_factory)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
@ -980,7 +979,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
fn build_pruner<DB: Database>(
|
fn build_pruner<DB: Database>(
|
||||||
&self,
|
&self,
|
||||||
config: &PruneConfig,
|
config: &PruneConfig,
|
||||||
db: DB,
|
provider_factory: ProviderFactory<DB>,
|
||||||
tree_config: BlockchainTreeConfig,
|
tree_config: BlockchainTreeConfig,
|
||||||
highest_snapshots_rx: HighestSnapshotsTracker,
|
highest_snapshots_rx: HighestSnapshotsTracker,
|
||||||
) -> Pruner<DB> {
|
) -> Pruner<DB> {
|
||||||
@ -1014,8 +1013,7 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
Pruner::new(
|
Pruner::new(
|
||||||
db,
|
provider_factory,
|
||||||
self.chain.clone(),
|
|
||||||
segments.into_vec(),
|
segments.into_vec(),
|
||||||
config.block_interval,
|
config.block_interval,
|
||||||
self.chain.prune_delete_limit,
|
self.chain.prune_delete_limit,
|
||||||
|
|||||||
@ -514,11 +514,11 @@ where
|
|||||||
BlockchainTree::new(externals, config, None).expect("failed to create tree"),
|
BlockchainTree::new(externals, config, None).expect("failed to create tree"),
|
||||||
);
|
);
|
||||||
let latest = self.base_config.chain_spec.genesis_header().seal_slow();
|
let latest = self.base_config.chain_spec.genesis_header().seal_slow();
|
||||||
let blockchain_provider = BlockchainProvider::with_latest(provider_factory, tree, latest);
|
let blockchain_provider =
|
||||||
|
BlockchainProvider::with_latest(provider_factory.clone(), tree, latest);
|
||||||
|
|
||||||
let pruner = Pruner::new(
|
let pruner = Pruner::new(
|
||||||
db.clone(),
|
provider_factory,
|
||||||
self.base_config.chain_spec.clone(),
|
|
||||||
vec![],
|
vec![],
|
||||||
5,
|
5,
|
||||||
self.base_config.chain_spec.prune_delete_limit,
|
self.base_config.chain_spec.prune_delete_limit,
|
||||||
|
|||||||
@ -6,7 +6,7 @@ use crate::{
|
|||||||
Metrics, PrunerError, PrunerEvent,
|
Metrics, PrunerError, PrunerEvent,
|
||||||
};
|
};
|
||||||
use reth_db::database::Database;
|
use reth_db::database::Database;
|
||||||
use reth_primitives::{BlockNumber, ChainSpec, PruneMode, PruneProgress, PruneSegment};
|
use reth_primitives::{BlockNumber, PruneMode, PruneProgress, PruneSegment};
|
||||||
use reth_provider::{ProviderFactory, PruneCheckpointReader};
|
use reth_provider::{ProviderFactory, PruneCheckpointReader};
|
||||||
use reth_snapshot::HighestSnapshotsTracker;
|
use reth_snapshot::HighestSnapshotsTracker;
|
||||||
use reth_tokio_util::EventListeners;
|
use reth_tokio_util::EventListeners;
|
||||||
@ -46,8 +46,7 @@ pub struct Pruner<DB> {
|
|||||||
impl<DB: Database> Pruner<DB> {
|
impl<DB: Database> Pruner<DB> {
|
||||||
/// Creates a new [Pruner].
|
/// Creates a new [Pruner].
|
||||||
pub fn new(
|
pub fn new(
|
||||||
db: DB,
|
provider_factory: ProviderFactory<DB>,
|
||||||
chain_spec: Arc<ChainSpec>,
|
|
||||||
segments: Vec<Arc<dyn Segment<DB>>>,
|
segments: Vec<Arc<dyn Segment<DB>>>,
|
||||||
min_block_interval: usize,
|
min_block_interval: usize,
|
||||||
delete_limit: usize,
|
delete_limit: usize,
|
||||||
@ -55,7 +54,7 @@ impl<DB: Database> Pruner<DB> {
|
|||||||
highest_snapshots_tracker: HighestSnapshotsTracker,
|
highest_snapshots_tracker: HighestSnapshotsTracker,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
provider_factory: ProviderFactory::new(db, chain_spec),
|
provider_factory,
|
||||||
segments,
|
segments,
|
||||||
min_block_interval,
|
min_block_interval,
|
||||||
previous_tip_block_number: None,
|
previous_tip_block_number: None,
|
||||||
@ -267,12 +266,14 @@ mod tests {
|
|||||||
use crate::Pruner;
|
use crate::Pruner;
|
||||||
use reth_db::test_utils::create_test_rw_db;
|
use reth_db::test_utils::create_test_rw_db;
|
||||||
use reth_primitives::MAINNET;
|
use reth_primitives::MAINNET;
|
||||||
|
use reth_provider::ProviderFactory;
|
||||||
use tokio::sync::watch;
|
use tokio::sync::watch;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn is_pruning_needed() {
|
fn is_pruning_needed() {
|
||||||
let db = create_test_rw_db();
|
let db = create_test_rw_db();
|
||||||
let mut pruner = Pruner::new(db, MAINNET.clone(), vec![], 5, 0, 5, watch::channel(None).1);
|
let provider_factory = ProviderFactory::new(db, MAINNET.clone());
|
||||||
|
let mut pruner = Pruner::new(provider_factory, vec![], 5, 0, 5, watch::channel(None).1);
|
||||||
|
|
||||||
// No last pruned block number was set before
|
// No last pruned block number was set before
|
||||||
let first_block_number = 1;
|
let first_block_number = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user