feat(snapshot, prune): highest snapshots tracker (#4721)

This commit is contained in:
Alexey Shekhirin
2023-09-29 10:59:48 +01:00
committed by GitHub
parent 8f3e4a1573
commit 6b2945440b
10 changed files with 122 additions and 23 deletions

View File

@ -16,6 +16,10 @@ reth-primitives.workspace = true
reth-db.workspace = true
reth-provider.workspace = true
reth-interfaces.workspace = true
reth-snapshot = { path = "../snapshot" }
# async
tokio = { workspace = true, features = ["sync"] }
# metrics
reth-metrics.workspace = true

View File

@ -20,6 +20,7 @@ use reth_provider::{
BlockReader, DatabaseProviderRW, ProviderFactory, PruneCheckpointReader, PruneCheckpointWriter,
TransactionsProvider,
};
use reth_snapshot::HighestSnapshotsTracker;
use std::{collections::BTreeMap, ops::RangeInclusive, sync::Arc, time::Instant};
use tokio_stream::wrappers::UnboundedReceiverStream;
use tracing::{debug, error, instrument, trace};
@ -48,6 +49,8 @@ pub struct Pruner<DB> {
/// Maximum entries to prune per block, per prune part.
batch_sizes: PruneBatchSizes,
listeners: EventListeners<PrunerEvent>,
#[allow(dead_code)]
highest_snapshots_tracker: HighestSnapshotsTracker,
}
impl<DB: Database> Pruner<DB> {
@ -58,6 +61,7 @@ impl<DB: Database> Pruner<DB> {
min_block_interval: usize,
modes: PruneModes,
batch_sizes: PruneBatchSizes,
highest_snapshots_tracker: HighestSnapshotsTracker,
) -> Self {
Self {
metrics: Metrics::default(),
@ -67,6 +71,7 @@ impl<DB: Database> Pruner<DB> {
modes,
batch_sizes,
listeners: Default::default(),
highest_snapshots_tracker,
}
}
@ -90,9 +95,11 @@ impl<DB: Database> Pruner<DB> {
let provider = self.provider_factory.provider_rw()?;
let mut done = true;
let mut parts_done = BTreeMap::new();
// TODO(alexey): prune snapshot parts of data (headers, transactions)
// let highest_snapshots = *self.highest_snapshots_tracker.borrow();
if let Some((to_block, prune_mode)) =
self.modes.prune_target_block_receipts(tip_block_number)?
{
@ -951,24 +958,33 @@ mod tests {
use reth_provider::{PruneCheckpointReader, TransactionsProvider};
use reth_stages::test_utils::TestTransaction;
use std::{collections::BTreeMap, ops::AddAssign};
use tokio::sync::watch;
#[test]
fn is_pruning_needed() {
let db = create_test_rw_db();
let pruner =
Pruner::new(db, MAINNET.clone(), 5, PruneModes::none(), PruneBatchSizes::default());
let mut pruner = Pruner::new(
db,
MAINNET.clone(),
5,
PruneModes::none(),
PruneBatchSizes::default(),
watch::channel(None).1,
);
// No last pruned block number was set before
let first_block_number = 1;
assert!(pruner.is_pruning_needed(first_block_number));
pruner.last_pruned_block_number = Some(first_block_number);
// Delta is not less than min block interval
// Tip block number delta is >= than min block interval
let second_block_number = first_block_number + pruner.min_block_interval as u64;
assert!(pruner.is_pruning_needed(second_block_number));
pruner.last_pruned_block_number = Some(second_block_number);
// Delta is less than min block interval
// Tip block number delta is < than min block interval
let third_block_number = second_block_number;
assert!(pruner.is_pruning_needed(third_block_number));
assert!(!pruner.is_pruning_needed(third_block_number));
}
#[test]
@ -1006,6 +1022,7 @@ mod tests {
PruneModes { receipts: Some(prune_mode), ..Default::default() },
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_receipts(10),
watch::channel(None).1,
);
let next_tx_number_to_prune = tx
@ -1100,6 +1117,7 @@ mod tests {
PruneModes { transaction_lookup: Some(prune_mode), ..Default::default() },
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_transaction_lookup(10),
watch::channel(None).1,
);
let next_tx_number_to_prune = tx
@ -1197,6 +1215,7 @@ mod tests {
PruneModes { sender_recovery: Some(prune_mode), ..Default::default() },
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_transaction_senders(10),
watch::channel(None).1,
);
let next_tx_number_to_prune = tx
@ -1303,6 +1322,7 @@ mod tests {
PruneModes { account_history: Some(prune_mode), ..Default::default() },
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_account_history(2000),
watch::channel(None).1,
);
let provider = tx.inner_rw();
@ -1433,6 +1453,7 @@ mod tests {
PruneModes { storage_history: Some(prune_mode), ..Default::default() },
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_storage_history(2000),
watch::channel(None).1,
);
let provider = tx.inner_rw();
@ -1574,7 +1595,8 @@ mod tests {
..Default::default()
},
// Less than total amount of blocks to prune to test the batching logic
PruneBatchSizes::default().with_receipts(10),
PruneBatchSizes::default().with_storage_history(10),
watch::channel(None).1,
);
let result = pruner.prune_receipts_by_logs(&provider, tip);