feat: adds StorageLock to StaticFileProvider and mdbx::DatabaseEnv (#8528)

This commit is contained in:
joshieDo
2024-06-03 14:28:56 +02:00
committed by GitHub
parent 063807b3ae
commit db3d1335a8
23 changed files with 216 additions and 75 deletions

View File

@ -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())?,
));
{

View File

@ -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())?;

View File

@ -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(),
)

View File

@ -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(),
)

View File

@ -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(),
)

View File

@ -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(),
)

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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");

View File

@ -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 {