mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: adds StorageLock to StaticFileProvider and mdbx::DatabaseEnv (#8528)
This commit is contained in:
@ -102,7 +102,7 @@ impl Command {
|
||||
let provider_factory = Arc::new(ProviderFactory::new(
|
||||
db,
|
||||
chain,
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
));
|
||||
|
||||
{
|
||||
|
||||
@ -110,14 +110,10 @@ impl Command {
|
||||
/// Fetches the best block block from the database.
|
||||
///
|
||||
/// If the database is empty, returns the genesis block.
|
||||
fn lookup_best_block(&self, db: Arc<DatabaseEnv>) -> RethResult<Arc<SealedBlock>> {
|
||||
let factory = ProviderFactory::new(
|
||||
db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(
|
||||
self.datadir.unwrap_or_chain_default(self.chain.chain).static_files(),
|
||||
)?,
|
||||
);
|
||||
fn lookup_best_block(
|
||||
&self,
|
||||
factory: ProviderFactory<Arc<DatabaseEnv>>,
|
||||
) -> RethResult<Arc<SealedBlock>> {
|
||||
let provider = factory.provider()?;
|
||||
|
||||
let best_number =
|
||||
@ -158,7 +154,7 @@ impl Command {
|
||||
let provider_factory = ProviderFactory::new(
|
||||
Arc::clone(&db),
|
||||
Arc::clone(&self.chain),
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
);
|
||||
|
||||
let consensus: Arc<dyn Consensus> =
|
||||
@ -173,8 +169,9 @@ impl Command {
|
||||
let blockchain_tree = Arc::new(ShareableBlockchainTree::new(tree));
|
||||
|
||||
// fetch the best block from the database
|
||||
let best_block =
|
||||
self.lookup_best_block(Arc::clone(&db)).wrap_err("the head block is missing")?;
|
||||
let best_block = self
|
||||
.lookup_best_block(provider_factory.clone())
|
||||
.wrap_err("the head block is missing")?;
|
||||
|
||||
let blockchain_db =
|
||||
BlockchainProvider::new(provider_factory.clone(), blockchain_tree.clone())?;
|
||||
|
||||
@ -151,14 +151,11 @@ impl Command {
|
||||
&self,
|
||||
config: &Config,
|
||||
task_executor: TaskExecutor,
|
||||
db: Arc<DatabaseEnv>,
|
||||
provider_factory: ProviderFactory<Arc<DatabaseEnv>>,
|
||||
network_secret_path: PathBuf,
|
||||
default_peers_path: PathBuf,
|
||||
) -> eyre::Result<NetworkHandle> {
|
||||
let secret_key = get_secret_key(&network_secret_path)?;
|
||||
let static_files = StaticFileProvider::read_only(
|
||||
self.datadir.unwrap_or_chain_default(self.chain.chain).static_files(),
|
||||
)?;
|
||||
let network = self
|
||||
.network
|
||||
.network_config(config, self.chain.clone(), secret_key, default_peers_path)
|
||||
@ -168,7 +165,7 @@ impl Command {
|
||||
self.network.discovery.addr,
|
||||
self.network.discovery.port,
|
||||
))
|
||||
.build(ProviderFactory::new(db, self.chain.clone(), static_files))
|
||||
.build(provider_factory.clone())
|
||||
.start_network()
|
||||
.await?;
|
||||
info!(target: "reth::cli", peer_id = %network.peer_id(), local_addr = %network.local_addr(), "Connected to P2P network");
|
||||
@ -228,7 +225,7 @@ impl Command {
|
||||
.build_network(
|
||||
&config,
|
||||
ctx.task_executor.clone(),
|
||||
db.clone(),
|
||||
provider_factory.clone(),
|
||||
network_secret_path,
|
||||
data_dir.known_peers(),
|
||||
)
|
||||
|
||||
@ -80,7 +80,7 @@ impl Command {
|
||||
&self,
|
||||
config: &Config,
|
||||
task_executor: TaskExecutor,
|
||||
db: Arc<DatabaseEnv>,
|
||||
provider_factory: ProviderFactory<Arc<DatabaseEnv>>,
|
||||
network_secret_path: PathBuf,
|
||||
default_peers_path: PathBuf,
|
||||
) -> eyre::Result<NetworkHandle> {
|
||||
@ -94,13 +94,7 @@ impl Command {
|
||||
self.network.discovery.addr,
|
||||
self.network.discovery.port,
|
||||
))
|
||||
.build(ProviderFactory::new(
|
||||
db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(
|
||||
self.datadir.unwrap_or_chain_default(self.chain.chain).static_files(),
|
||||
)?,
|
||||
))
|
||||
.build(provider_factory)
|
||||
.start_network()
|
||||
.await?;
|
||||
info!(target: "reth::cli", peer_id = %network.peer_id(), local_addr = %network.local_addr(), "Connected to P2P network");
|
||||
@ -119,11 +113,9 @@ impl Command {
|
||||
|
||||
// initialize the database
|
||||
let db = Arc::new(init_db(db_path, self.db.database_args())?);
|
||||
let factory = ProviderFactory::new(
|
||||
&db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
);
|
||||
let static_file_provider = StaticFileProvider::read_write(data_dir.static_files())?;
|
||||
let factory =
|
||||
ProviderFactory::new(db.clone(), self.chain.clone(), static_file_provider.clone());
|
||||
let provider = factory.provider()?;
|
||||
|
||||
// Look up merkle checkpoint
|
||||
@ -140,7 +132,7 @@ impl Command {
|
||||
.build_network(
|
||||
&config,
|
||||
ctx.task_executor.clone(),
|
||||
db.clone(),
|
||||
factory.clone(),
|
||||
network_secret_path,
|
||||
data_dir.known_peers(),
|
||||
)
|
||||
|
||||
@ -86,7 +86,7 @@ impl Command {
|
||||
&self,
|
||||
config: &Config,
|
||||
task_executor: TaskExecutor,
|
||||
db: Arc<DatabaseEnv>,
|
||||
provider_factory: ProviderFactory<Arc<DatabaseEnv>>,
|
||||
network_secret_path: PathBuf,
|
||||
default_peers_path: PathBuf,
|
||||
) -> eyre::Result<NetworkHandle> {
|
||||
@ -100,13 +100,7 @@ impl Command {
|
||||
self.network.discovery.addr,
|
||||
self.network.discovery.port,
|
||||
))
|
||||
.build(ProviderFactory::new(
|
||||
db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(
|
||||
self.datadir.unwrap_or_chain_default(self.chain.chain).static_files(),
|
||||
)?,
|
||||
))
|
||||
.build(provider_factory.clone())
|
||||
.start_network()
|
||||
.await?;
|
||||
info!(target: "reth::cli", peer_id = %network.peer_id(), local_addr = %network.local_addr(), "Connected to P2P network");
|
||||
@ -126,9 +120,9 @@ impl Command {
|
||||
// initialize the database
|
||||
let db = Arc::new(init_db(db_path, self.db.database_args())?);
|
||||
let factory = ProviderFactory::new(
|
||||
&db,
|
||||
db.clone(),
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
);
|
||||
let provider_rw = factory.provider_rw()?;
|
||||
|
||||
@ -139,7 +133,7 @@ impl Command {
|
||||
.build_network(
|
||||
&config,
|
||||
ctx.task_executor.clone(),
|
||||
db.clone(),
|
||||
factory.clone(),
|
||||
network_secret_path,
|
||||
data_dir.known_peers(),
|
||||
)
|
||||
|
||||
@ -83,7 +83,7 @@ impl Command {
|
||||
&self,
|
||||
config: &Config,
|
||||
task_executor: TaskExecutor,
|
||||
db: Arc<DatabaseEnv>,
|
||||
provider_factory: ProviderFactory<Arc<DatabaseEnv>>,
|
||||
network_secret_path: PathBuf,
|
||||
default_peers_path: PathBuf,
|
||||
) -> eyre::Result<NetworkHandle> {
|
||||
@ -97,13 +97,7 @@ impl Command {
|
||||
self.network.discovery.addr,
|
||||
self.network.discovery.port,
|
||||
))
|
||||
.build(ProviderFactory::new(
|
||||
db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(
|
||||
self.datadir.unwrap_or_chain_default(self.chain.chain).static_files(),
|
||||
)?,
|
||||
))
|
||||
.build(provider_factory.clone())
|
||||
.start_network()
|
||||
.await?;
|
||||
info!(target: "reth::cli", peer_id = %network.peer_id(), local_addr = %network.local_addr(), "Connected to P2P network");
|
||||
@ -125,7 +119,7 @@ impl Command {
|
||||
let provider_factory = ProviderFactory::new(
|
||||
db.clone(),
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
);
|
||||
|
||||
let consensus: Arc<dyn Consensus> =
|
||||
@ -149,7 +143,7 @@ impl Command {
|
||||
.build_network(
|
||||
&config,
|
||||
ctx.task_executor.clone(),
|
||||
db.clone(),
|
||||
provider_factory.clone(),
|
||||
network_secret_path,
|
||||
data_dir.known_peers(),
|
||||
)
|
||||
|
||||
@ -28,7 +28,7 @@ pub(crate) async fn dump_execution_stage<DB: Database>(
|
||||
ProviderFactory::new(
|
||||
output_db,
|
||||
db_tool.chain.clone(),
|
||||
StaticFileProvider::read_only(output_datadir.static_files())?,
|
||||
StaticFileProvider::read_write(output_datadir.static_files())?,
|
||||
),
|
||||
to,
|
||||
from,
|
||||
|
||||
@ -33,7 +33,7 @@ pub(crate) async fn dump_hashing_account_stage<DB: Database>(
|
||||
ProviderFactory::new(
|
||||
output_db,
|
||||
db_tool.chain.clone(),
|
||||
StaticFileProvider::read_only(output_datadir.static_files())?,
|
||||
StaticFileProvider::read_write(output_datadir.static_files())?,
|
||||
),
|
||||
to,
|
||||
from,
|
||||
|
||||
@ -24,7 +24,7 @@ pub(crate) async fn dump_hashing_storage_stage<DB: Database>(
|
||||
ProviderFactory::new(
|
||||
output_db,
|
||||
db_tool.chain.clone(),
|
||||
StaticFileProvider::read_only(output_datadir.static_files())?,
|
||||
StaticFileProvider::read_write(output_datadir.static_files())?,
|
||||
),
|
||||
to,
|
||||
from,
|
||||
|
||||
@ -48,7 +48,7 @@ pub(crate) async fn dump_merkle_stage<DB: Database>(
|
||||
ProviderFactory::new(
|
||||
output_db,
|
||||
db_tool.chain.clone(),
|
||||
StaticFileProvider::read_only(output_datadir.static_files())?,
|
||||
StaticFileProvider::read_write(output_datadir.static_files())?,
|
||||
),
|
||||
to,
|
||||
from,
|
||||
|
||||
@ -12,8 +12,8 @@ use crate::args::{
|
||||
use clap::Parser;
|
||||
use reth_db::{
|
||||
cursor::DbCursorRO, database::Database, init_db, mdbx::DatabaseArguments,
|
||||
models::client_version::ClientVersion, table::TableImporter, tables, transaction::DbTx,
|
||||
DatabaseEnv,
|
||||
models::client_version::ClientVersion, open_db_read_only, table::TableImporter, tables,
|
||||
transaction::DbTx, DatabaseEnv,
|
||||
};
|
||||
use reth_node_core::dirs::PlatformPath;
|
||||
use reth_primitives::ChainSpec;
|
||||
@ -104,11 +104,11 @@ impl Command {
|
||||
let data_dir = self.datadir.unwrap_or_chain_default(self.chain.chain);
|
||||
let db_path = data_dir.db();
|
||||
info!(target: "reth::cli", path = ?db_path, "Opening database");
|
||||
let db = Arc::new(init_db(db_path, self.db.database_args())?);
|
||||
let db = Arc::new(open_db_read_only(&db_path, self.db.database_args())?);
|
||||
let provider_factory = ProviderFactory::new(
|
||||
db,
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
StaticFileProvider::read_only(data_dir.static_files())?,
|
||||
);
|
||||
|
||||
info!(target: "reth::cli", "Database opened");
|
||||
|
||||
@ -146,12 +146,12 @@ impl Command {
|
||||
let db = Arc::new(init_db(db_path, self.db.database_args())?);
|
||||
info!(target: "reth::cli", "Database opened");
|
||||
|
||||
let factory = ProviderFactory::new(
|
||||
let provider_factory = ProviderFactory::new(
|
||||
Arc::clone(&db),
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
);
|
||||
let mut provider_rw = factory.provider_rw()?;
|
||||
let mut provider_rw = provider_factory.provider_rw()?;
|
||||
|
||||
if let Some(listen_addr) = self.metrics {
|
||||
info!(target: "reth::cli", "Starting metrics endpoint at {}", listen_addr);
|
||||
@ -159,7 +159,7 @@ impl Command {
|
||||
listen_addr,
|
||||
prometheus_exporter::install_recorder()?,
|
||||
Arc::clone(&db),
|
||||
factory.static_file_provider(),
|
||||
provider_factory.static_file_provider(),
|
||||
metrics_process::Collector::default(),
|
||||
ctx.task_executor,
|
||||
)
|
||||
@ -196,12 +196,6 @@ impl Command {
|
||||
|
||||
let default_peers_path = data_dir.known_peers();
|
||||
|
||||
let provider_factory = Arc::new(ProviderFactory::new(
|
||||
db.clone(),
|
||||
self.chain.clone(),
|
||||
StaticFileProvider::read_write(data_dir.static_files())?,
|
||||
));
|
||||
|
||||
let network = self
|
||||
.network
|
||||
.network_config(
|
||||
@ -226,7 +220,7 @@ impl Command {
|
||||
config.stages.bodies.downloader_min_concurrent_requests..=
|
||||
config.stages.bodies.downloader_max_concurrent_requests,
|
||||
)
|
||||
.build(fetch_client, consensus.clone(), provider_factory),
|
||||
.build(fetch_client, consensus.clone(), provider_factory.clone()),
|
||||
);
|
||||
(Box::new(stage), None)
|
||||
}
|
||||
@ -323,7 +317,7 @@ impl Command {
|
||||
|
||||
if self.commit {
|
||||
provider_rw.commit()?;
|
||||
provider_rw = factory.provider_rw()?;
|
||||
provider_rw = provider_factory.provider_rw()?;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -346,7 +340,7 @@ impl Command {
|
||||
}
|
||||
if self.commit {
|
||||
provider_rw.commit()?;
|
||||
provider_rw = factory.provider_rw()?;
|
||||
provider_rw = provider_factory.provider_rw()?;
|
||||
}
|
||||
|
||||
if done {
|
||||
|
||||
Reference in New Issue
Block a user