feat: search for a snapshot that fulfills a queried BlockHash or TxHash (#5373)

Co-authored-by: Alexey Shekhirin <a.shekhirin@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
joshieDo
2023-11-15 16:53:28 +00:00
committed by GitHub
parent dc72cad838
commit a389a2b42d
11 changed files with 519 additions and 131 deletions

View File

@ -10,7 +10,8 @@ use reth_primitives::{
BlockHash, ChainSpec, Header, SnapshotSegment,
};
use reth_provider::{
providers::SnapshotProvider, DatabaseProviderRO, HeaderProvider, ProviderError, ProviderFactory,
providers::SnapshotProvider, DatabaseProviderRO, HeaderProvider, ProviderError,
ProviderFactory, TransactionsProviderExt,
};
use reth_snapshot::{segments, segments::Segment};
use std::{
@ -38,9 +39,15 @@ impl Command {
segment.snapshot::<DB>(provider, PathBuf::default(), range.clone())?;
// Default name doesn't have any configuration
let tx_range = provider.transaction_range_by_block_range(range.clone())?;
reth_primitives::fs::rename(
SnapshotSegment::Headers.filename(&range),
SnapshotSegment::Headers.filename_with_configuration(filters, compression, &range),
SnapshotSegment::Headers.filename(&range, &tx_range),
SnapshotSegment::Headers.filename_with_configuration(
filters,
compression,
&range,
&tx_range,
),
)?;
Ok(())
@ -61,16 +68,24 @@ impl Command {
Filters::WithoutFilters
};
let range = self.block_range();
let block_range = self.block_range();
let mut row_indexes = range.clone().collect::<Vec<_>>();
let mut row_indexes = block_range.clone().collect::<Vec<_>>();
let mut rng = rand::thread_rng();
let path = SnapshotSegment::Headers
.filename_with_configuration(filters, compression, &range)
let tx_range = ProviderFactory::new(open_db_read_only(db_path, log_level)?, chain.clone())
.provider()?
.transaction_range_by_block_range(block_range.clone())?;
let path: PathBuf = SnapshotSegment::Headers
.filename_with_configuration(filters, compression, &block_range, &tx_range)
.into();
let provider = SnapshotProvider::default();
let jar_provider =
provider.get_segment_provider(SnapshotSegment::Headers, self.from, Some(path))?;
let jar_provider = provider.get_segment_provider_from_block(
SnapshotSegment::Headers,
self.from,
Some(&path),
)?;
let mut cursor = jar_provider.cursor()?;
for bench_kind in [BenchKind::Walk, BenchKind::RandomAll] {

View File

@ -27,21 +27,26 @@ impl Command {
inclusion_filter: InclusionFilter,
phf: PerfectHashingFunction,
) -> eyre::Result<()> {
let range = self.block_range();
let block_range = self.block_range();
let filters = if self.with_filters {
Filters::WithFilters(inclusion_filter, phf)
} else {
Filters::WithoutFilters
};
let segment = segments::Receipts::new(compression, filters);
segment.snapshot::<DB>(provider, PathBuf::default(), range.clone())?;
let segment: segments::Receipts = segments::Receipts::new(compression, filters);
segment.snapshot::<DB>(provider, PathBuf::default(), block_range.clone())?;
// Default name doesn't have any configuration
let tx_range = provider.transaction_range_by_block_range(block_range.clone())?;
reth_primitives::fs::rename(
SnapshotSegment::Receipts.filename(&range),
SnapshotSegment::Receipts.filename_with_configuration(filters, compression, &range),
SnapshotSegment::Receipts.filename(&block_range, &tx_range),
SnapshotSegment::Receipts.filename_with_configuration(
filters,
compression,
&block_range,
&tx_range,
),
)?;
Ok(())
@ -62,7 +67,7 @@ impl Command {
Filters::WithoutFilters
};
let block_range = self.from..=(self.from + self.block_interval - 1);
let block_range = self.block_range();
let mut rng = rand::thread_rng();
@ -72,13 +77,16 @@ impl Command {
let mut row_indexes = tx_range.clone().collect::<Vec<_>>();
let path = SnapshotSegment::Receipts
.filename_with_configuration(filters, compression, &block_range)
let path: PathBuf = SnapshotSegment::Receipts
.filename_with_configuration(filters, compression, &block_range, &tx_range)
.into();
let provider = SnapshotProvider::default();
let jar_provider =
provider.get_segment_provider(SnapshotSegment::Receipts, self.from, Some(path))?;
let jar_provider = provider.get_segment_provider_from_block(
SnapshotSegment::Receipts,
self.from,
Some(&path),
)?;
let mut cursor = jar_provider.cursor()?;
for bench_kind in [BenchKind::Walk, BenchKind::RandomAll] {

View File

@ -27,7 +27,7 @@ impl Command {
inclusion_filter: InclusionFilter,
phf: PerfectHashingFunction,
) -> eyre::Result<()> {
let range = self.block_range();
let block_range = self.block_range();
let filters = if self.with_filters {
Filters::WithFilters(inclusion_filter, phf)
} else {
@ -36,12 +36,18 @@ impl Command {
let segment = segments::Transactions::new(compression, filters);
segment.snapshot::<DB>(provider, PathBuf::default(), range.clone())?;
segment.snapshot::<DB>(provider, PathBuf::default(), block_range.clone())?;
// Default name doesn't have any configuration
let tx_range = provider.transaction_range_by_block_range(block_range.clone())?;
reth_primitives::fs::rename(
SnapshotSegment::Transactions.filename(&range),
SnapshotSegment::Transactions.filename_with_configuration(filters, compression, &range),
SnapshotSegment::Transactions.filename(&block_range, &tx_range),
SnapshotSegment::Transactions.filename_with_configuration(
filters,
compression,
&block_range,
&tx_range,
),
)?;
Ok(())
@ -62,7 +68,7 @@ impl Command {
Filters::WithoutFilters
};
let block_range = self.from..=(self.from + self.block_interval - 1);
let block_range = self.block_range();
let mut rng = rand::thread_rng();
@ -72,12 +78,15 @@ impl Command {
let mut row_indexes = tx_range.clone().collect::<Vec<_>>();
let path = SnapshotSegment::Transactions
.filename_with_configuration(filters, compression, &block_range)
let path: PathBuf = SnapshotSegment::Transactions
.filename_with_configuration(filters, compression, &block_range, &tx_range)
.into();
let provider = SnapshotProvider::default();
let jar_provider =
provider.get_segment_provider(SnapshotSegment::Transactions, self.from, Some(path))?;
let jar_provider = provider.get_segment_provider_from_block(
SnapshotSegment::Transactions,
self.from,
Some(&path),
)?;
let mut cursor = jar_provider.cursor()?;
for bench_kind in [BenchKind::Walk, BenchKind::RandomAll] {