fix: update block interval properly (#11546)

This commit is contained in:
Matthias Seitz
2024-10-16 23:59:58 +02:00
committed by GitHub
parent 82862fabd7
commit d2ca8f3a2b
2 changed files with 33 additions and 21 deletions

View File

@ -14,6 +14,9 @@ use std::{
const EXTENSION: &str = "toml"; const EXTENSION: &str = "toml";
/// The default prune block interval
pub const DEFAULT_BLOCK_INTERVAL: usize = 5;
/// Configuration for the reth node. /// Configuration for the reth node.
#[derive(Debug, Clone, Default, Deserialize, PartialEq, Eq, Serialize)] #[derive(Debug, Clone, Default, Deserialize, PartialEq, Eq, Serialize)]
#[serde(default)] #[serde(default)]
@ -383,7 +386,7 @@ pub struct PruneConfig {
impl Default for PruneConfig { impl Default for PruneConfig {
fn default() -> Self { fn default() -> Self {
Self { block_interval: 5, segments: PruneModes::none() } Self { block_interval: DEFAULT_BLOCK_INTERVAL, segments: PruneModes::none() }
} }
} }
@ -397,27 +400,33 @@ impl PruneConfig {
/// if the corresponding value in this config is not set. /// if the corresponding value in this config is not set.
pub fn merge(&mut self, other: Option<Self>) { pub fn merge(&mut self, other: Option<Self>) {
let Some(other) = other else { return }; let Some(other) = other else { return };
let Self {
block_interval,
segments:
PruneModes {
sender_recovery,
transaction_lookup,
receipts,
account_history,
storage_history,
receipts_log_filter,
},
} = other;
// Merge block_interval // Merge block_interval, only update if it's the default interval
if self.block_interval == 0 { if self.block_interval == DEFAULT_BLOCK_INTERVAL {
self.block_interval = other.block_interval; self.block_interval = block_interval;
} }
// Merge the various segment prune modes // Merge the various segment prune modes
self.segments.sender_recovery = self.segments.sender_recovery = self.segments.sender_recovery.or(sender_recovery);
self.segments.sender_recovery.or(other.segments.sender_recovery); self.segments.transaction_lookup = self.segments.transaction_lookup.or(transaction_lookup);
self.segments.transaction_lookup = self.segments.receipts = self.segments.receipts.or(receipts);
self.segments.transaction_lookup.or(other.segments.transaction_lookup); self.segments.account_history = self.segments.account_history.or(account_history);
self.segments.receipts = self.segments.receipts.or(other.segments.receipts); self.segments.storage_history = self.segments.storage_history.or(storage_history);
self.segments.account_history =
self.segments.account_history.or(other.segments.account_history);
self.segments.storage_history =
self.segments.storage_history.or(other.segments.storage_history);
if self.segments.receipts_log_filter.0.is_empty() && if self.segments.receipts_log_filter.0.is_empty() && !receipts_log_filter.0.is_empty() {
!other.segments.receipts_log_filter.0.is_empty() self.segments.receipts_log_filter = receipts_log_filter;
{
self.segments.receipts_log_filter = other.segments.receipts_log_filter;
} }
} }
} }
@ -961,7 +970,7 @@ receipts = 'full'
// Check that the configuration has been merged. Any configuration present in config1 // Check that the configuration has been merged. Any configuration present in config1
// should not be overwritten by config2 // should not be overwritten by config2
assert_eq!(config1.block_interval, 5); assert_eq!(config1.block_interval, 10);
assert_eq!(config1.segments.sender_recovery, Some(PruneMode::Full)); assert_eq!(config1.segments.sender_recovery, Some(PruneMode::Full));
assert_eq!(config1.segments.transaction_lookup, Some(PruneMode::Full)); assert_eq!(config1.segments.transaction_lookup, Some(PruneMode::Full));
assert_eq!(config1.segments.receipts, Some(PruneMode::Distance(1000))); assert_eq!(config1.segments.receipts, Some(PruneMode::Distance(1000)));

View File

@ -2,7 +2,7 @@
use crate::args::error::ReceiptsLogError; use crate::args::error::ReceiptsLogError;
use alloy_primitives::{Address, BlockNumber}; use alloy_primitives::{Address, BlockNumber};
use clap::Args; use clap::{builder::RangedU64ValueParser, Args};
use reth_chainspec::EthChainSpec; use reth_chainspec::EthChainSpec;
use reth_config::config::PruneConfig; use reth_config::config::PruneConfig;
use reth_prune_types::{PruneMode, PruneModes, ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE}; use reth_prune_types::{PruneMode, PruneModes, ReceiptsLogPruneConfig, MINIMUM_PRUNING_DISTANCE};
@ -17,7 +17,7 @@ pub struct PruningArgs {
pub full: bool, pub full: bool,
/// Minimum pruning interval measured in blocks. /// Minimum pruning interval measured in blocks.
#[arg(long, default_value = None)] #[arg(long, value_parser = RangedU64ValueParser::<u64>::new().range(1..),)]
pub block_interval: Option<u64>, pub block_interval: Option<u64>,
// Sender Recovery // Sender Recovery
@ -99,7 +99,7 @@ impl PruningArgs {
// If --full is set, use full node defaults. // If --full is set, use full node defaults.
if self.full { if self.full {
config = PruneConfig { config = PruneConfig {
block_interval: 5, block_interval: config.block_interval,
segments: PruneModes { segments: PruneModes {
sender_recovery: Some(PruneMode::Full), sender_recovery: Some(PruneMode::Full),
transaction_lookup: None, transaction_lookup: None,
@ -123,6 +123,9 @@ impl PruningArgs {
} }
// Override with any explicitly set prune.* flags. // Override with any explicitly set prune.* flags.
if let Some(block_interval) = self.block_interval {
config.block_interval = block_interval as usize;
}
if let Some(mode) = self.sender_recovery_prune_mode() { if let Some(mode) = self.sender_recovery_prune_mode() {
config.segments.sender_recovery = Some(mode); config.segments.sender_recovery = Some(mode);
} }