Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
5b429fa
move tx_lookup hash calculation to db crate
joshieDo Oct 6, 2023
8090431
update doc on tx hash calc
joshieDo Oct 6, 2023
f5762b4
Merge remote-tracking branch 'origin/main' into joshie/snapshot-bin-2
joshieDo Oct 12, 2023
8eaab06
use databaseprovider instead
joshieDo Oct 12, 2023
95e0574
add find_transaction_range
joshieDo Oct 12, 2023
e03a3c0
cargo deps
joshieDo Oct 12, 2023
16e4457
add TransactionsProviderExt
joshieDo Oct 12, 2023
a6edbc4
add transactions snapshot segment
joshieDo Oct 12, 2023
765ea2e
snapshot benches compare results
joshieDo Oct 12, 2023
1b41008
add TransactionNotFound error
joshieDo Oct 12, 2023
b6789e4
add additional empty provider impls to SnapshotProvider
joshieDo Oct 12, 2023
a900860
add SegmentHeader to snapshot jars
joshieDo Oct 13, 2023
9ae5939
add wip transaction_by_hash
joshieDo Oct 13, 2023
96f77fc
fix doc test
joshieDo Oct 13, 2023
16c33a7
fmt
joshieDo Oct 13, 2023
d14a483
add with_hash to walk bench as well
joshieDo Oct 13, 2023
055a818
fix recover_hashes range
joshieDo Oct 13, 2023
5bef37f
Merge remote-tracking branch 'origin/main' into joshie/snapshot-bin-2
joshieDo Oct 16, 2023
a66b603
fix doc test
joshieDo Oct 16, 2023
f327d91
fix test_snap
joshieDo Oct 16, 2023
5582db3
share dataset_for_compression implementation
joshieDo Oct 16, 2023
13136ed
add snapshot segment
joshieDo Oct 16, 2023
d4c8b33
add receipts command
joshieDo Oct 16, 2023
36fa32f
Merge remote-tracking branch 'origin/main' into joshie/snapshot-bin-2
joshieDo Oct 19, 2023
b4d1d1e
Update bin/reth/src/db/snapshots/receipts.rs
joshieDo Oct 24, 2023
79c72db
Update bin/reth/src/db/snapshots/transactions.rs
joshieDo Oct 24, 2023
8880d6f
Update bin/reth/src/db/snapshots/transactions.rs
joshieDo Oct 24, 2023
6224354
Update bin/reth/src/db/snapshots/receipts.rs
joshieDo Oct 24, 2023
8e56d1d
Update crates/interfaces/src/provider.rs
joshieDo Oct 24, 2023
4fb1871
add transaction_hashes_by_range to provider
joshieDo Oct 24, 2023
9ab6333
add TxHashOrNumber type
joshieDo Oct 24, 2023
c562e0c
Update bin/reth/src/db/snapshots/receipts.rs
joshieDo Oct 24, 2023
27d6ab2
Update bin/reth/src/db/snapshots/transactions.rs
joshieDo Oct 24, 2023
21edb80
Merge remote-tracking branch 'origin/main' into joshie/snapshot-bin-2
joshieDo Oct 24, 2023
2f8d303
clippy
joshieDo Oct 24, 2023
e5e71be
yes clippy
joshieDo Oct 24, 2023
e920318
fix doc
joshieDo Oct 25, 2023
30c4748
Merge remote-tracking branch 'origin/main' into joshie/snapshot-bin-2
joshieDo Oct 26, 2023
efeb602
fmt
joshieDo Oct 26, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 16 additions & 10 deletions bin/reth/src/db/snapshots/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use reth_primitives::{
ChainSpec, SnapshotSegment,
};
use reth_provider::{DatabaseProviderRO, ProviderFactory};
use std::{sync::Arc, time::Instant};
use std::{fmt::Debug, sync::Arc, time::Instant};

#[derive(Debug)]
pub(crate) enum BenchKind {
Expand All @@ -14,7 +14,7 @@ pub(crate) enum BenchKind {
RandomHash,
}

pub(crate) fn bench<F1, F2>(
pub(crate) fn bench<F1, F2, R>(
bench_kind: BenchKind,
db: (DatabaseEnvRO, Arc<ChainSpec>),
segment: SnapshotSegment,
Expand All @@ -24,28 +24,34 @@ pub(crate) fn bench<F1, F2>(
database_method: F2,
) -> eyre::Result<()>
where
F1: FnMut() -> eyre::Result<()>,
F2: Fn(DatabaseProviderRO<'_, DatabaseEnvRO>) -> eyre::Result<()>,
F1: FnMut() -> eyre::Result<R>,
F2: Fn(DatabaseProviderRO<'_, DatabaseEnvRO>) -> eyre::Result<R>,
R: Debug + PartialEq,
{
let (db, chain) = db;

println!();
println!("############");
println!("## [{segment:?}] [{compression:?}] [{filters:?}] [{bench_kind:?}]");
{
let snap_result = {
let start = Instant::now();
snapshot_method()?;
let result = snapshot_method()?;
let end = start.elapsed().as_micros();
println!("# snapshot {bench_kind:?} | {end} μs");
}
{
result
};

let db_result = {
let factory = ProviderFactory::new(db, chain);
let provider = factory.provider()?;
let start = Instant::now();
database_method(provider)?;
let result = database_method(provider)?;
let end = start.elapsed().as_micros();
println!("# database {bench_kind:?} | {end} μs");
}
result
};

assert_eq!(snap_result, db_result);

Ok(())
}
30 changes: 13 additions & 17 deletions bin/reth/src/db/snapshots/headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,22 @@ use super::{
bench::{bench, BenchKind},
Command,
};
use crate::utils::DbTool;
use rand::{seq::SliceRandom, Rng};
use reth_db::{database::Database, open_db_read_only, table::Decompress, DatabaseEnvRO};
use reth_db::{database::Database, open_db_read_only, table::Decompress};
use reth_interfaces::db::LogLevel;
use reth_nippy_jar::NippyJar;
use reth_primitives::{
snapshot::{Compression, Filters, InclusionFilter, PerfectHashingFunction},
ChainSpec, Header, SnapshotSegment,
};
use reth_provider::{HeaderProvider, ProviderError, ProviderFactory};
use reth_provider::{DatabaseProviderRO, HeaderProvider, ProviderError, ProviderFactory};
use reth_snapshot::segments::{get_snapshot_segment_file_name, Headers, Segment};
use std::{path::Path, sync::Arc};

impl Command {
pub(crate) fn generate_headers_snapshot(
pub(crate) fn generate_headers_snapshot<DB: Database>(
&self,
tool: &DbTool<'_, DatabaseEnvRO>,
provider: &DatabaseProviderRO<'_, DB>,
compression: Compression,
inclusion_filter: InclusionFilter,
phf: PerfectHashingFunction,
Expand All @@ -31,7 +30,7 @@ impl Command {
Filters::WithoutFilters
},
);
segment.snapshot(&tool.db.tx()?, self.from..=(self.from + self.block_interval - 1))?;
segment.snapshot::<DB>(provider, self.from..=(self.from + self.block_interval - 1))?;

Ok(())
}
Expand All @@ -56,7 +55,7 @@ impl Command {
let mut row_indexes = range.clone().collect::<Vec<_>>();
let mut rng = rand::thread_rng();
let mut dictionaries = None;
let mut jar = NippyJar::load_without_header(&get_snapshot_segment_file_name(
let mut jar = NippyJar::load(&get_snapshot_segment_file_name(
SnapshotSegment::Headers,
filters,
compression,
Expand Down Expand Up @@ -114,18 +113,16 @@ impl Command {
filters,
compression,
|| {
Header::decompress(
Ok(Header::decompress(
cursor
.row_by_number_with_cols::<0b01, 2>((num - self.from) as usize)?
.ok_or(ProviderError::HeaderNotFound((num as u64).into()))?[0],
)?;
Ok(())
)?)
},
|provider| {
provider
Ok(provider
.header_by_number(num as u64)?
.ok_or(ProviderError::HeaderNotFound((num as u64).into()))?;
Ok(())
.ok_or(ProviderError::HeaderNotFound((num as u64).into()))?)
},
)?;
}
Expand Down Expand Up @@ -154,13 +151,12 @@ impl Command {

// Might be a false positive, so in the real world we have to validate it
assert_eq!(header.hash_slow(), header_hash);
Ok(())
Ok(header)
},
|provider| {
provider
Ok(provider
.header(&header_hash)?
.ok_or(ProviderError::HeaderNotFound(header_hash.into()))?;
Ok(())
.ok_or(ProviderError::HeaderNotFound(header_hash.into()))?)
},
)?;
}
Expand Down
82 changes: 46 additions & 36 deletions bin/reth/src/db/snapshots/mod.rs
Original file line number Diff line number Diff line change
@@ -1,44 +1,26 @@
use crate::{db::genesis_value_parser, utils::DbTool};
use clap::Parser;
use itertools::Itertools;
use reth_db::open_db_read_only;
use reth_db::{open_db_read_only, DatabaseEnvRO};
use reth_interfaces::db::LogLevel;
use reth_nippy_jar::{
compression::{DecoderDictionary, Decompressor},
NippyJar,
};
use reth_primitives::{
snapshot::{Compression, InclusionFilter, PerfectHashingFunction},
snapshot::{Compression, InclusionFilter, PerfectHashingFunction, SegmentHeader},
BlockNumber, ChainSpec, SnapshotSegment,
};
use reth_provider::providers::SnapshotProvider;
use reth_provider::{providers::SnapshotProvider, ProviderFactory};
use std::{path::Path, sync::Arc};

mod bench;
mod headers;
mod receipts;
mod transactions;

#[derive(Parser, Debug)]
/// Arguments for the `reth db snapshot` command.
pub struct Command {
/// The chain this node is running.
///
/// Possible values are either a built-in chain or the path to a chain specification file.
///
/// Built-in chains:
/// - mainnet
/// - goerli
/// - sepolia
/// - holesky
#[arg(
long,
value_name = "CHAIN_OR_PATH",
verbatim_doc_comment,
default_value = "mainnet",
value_parser = genesis_value_parser,
global = true,
)]
chain: Arc<ChainSpec>,

/// Snapshot segments to generate.
segments: Vec<SnapshotSegment>,

Expand Down Expand Up @@ -87,19 +69,33 @@ impl Command {

{
let db = open_db_read_only(db_path, None)?;
let tool = DbTool::new(&db, chain.clone())?;
let factory = ProviderFactory::new(db, chain.clone());
let provider = factory.provider()?;

if !self.only_bench {
for ((mode, compression), phf) in all_combinations.clone() {
match mode {
SnapshotSegment::Headers => self.generate_headers_snapshot(
&tool,
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
SnapshotSegment::Transactions => todo!(),
SnapshotSegment::Receipts => todo!(),
SnapshotSegment::Headers => self
.generate_headers_snapshot::<DatabaseEnvRO>(
&provider,
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
SnapshotSegment::Transactions => self
.generate_transactions_snapshot::<DatabaseEnvRO>(
&provider,
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
SnapshotSegment::Receipts => self
.generate_receipts_snapshot::<DatabaseEnvRO>(
&provider,
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
}
}
}
Expand All @@ -116,8 +112,22 @@ impl Command {
InclusionFilter::Cuckoo,
*phf,
)?,
SnapshotSegment::Transactions => todo!(),
SnapshotSegment::Receipts => todo!(),
SnapshotSegment::Transactions => self.bench_transactions_snapshot(
db_path,
log_level,
chain.clone(),
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
SnapshotSegment::Receipts => self.bench_receipts_snapshot(
db_path,
log_level,
chain.clone(),
*compression,
InclusionFilter::Cuckoo,
*phf,
)?,
}
}
}
Expand All @@ -129,7 +139,7 @@ impl Command {
/// [`DecoderDictionary`] and [`Decompressor`] if necessary.
fn prepare_jar_provider<'a>(
&self,
jar: &'a mut NippyJar,
jar: &'a mut NippyJar<SegmentHeader>,
dictionaries: &'a mut Option<Vec<DecoderDictionary<'_>>>,
) -> eyre::Result<(SnapshotProvider<'a>, Vec<Decompressor<'a>>)> {
let mut decompressors: Vec<Decompressor<'_>> = vec![];
Expand All @@ -140,6 +150,6 @@ impl Command {
}
}

Ok((SnapshotProvider { jar: &*jar, jar_start_block: self.from }, decompressors))
Ok((SnapshotProvider { jar: &*jar }, decompressors))
}
}
Loading