diff --git a/beacon_node/src/cli.rs b/beacon_node/src/cli.rs index 8932b503f6..510882c366 100644 --- a/beacon_node/src/cli.rs +++ b/beacon_node/src/cli.rs @@ -555,10 +555,19 @@ pub fn cli_app<'a, 'b>() -> App<'a, 'b> { Arg::with_name("prune-blobs") .long("prune-blobs") .help("Prune blobs from Lighthouse's database when they are older than the data \ - data availability boundary relative to the current head.") + data availability boundary relative to the current epoch.") .takes_value(true) .default_value("true") ) + .arg( + Arg::with_name("epochs-per-blob-prune") + .long("epochs-per-blob-prune") + .help("The epoch interval with which to prune blobs from Lighthouse's \ + database when they are older than the data data availability \ + boundary relative to the current epoch.") + .takes_value(true) + .default_value("1") + ) /* * Misc. diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index a435a42fd3..14d40db03b 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -415,6 +415,12 @@ pub fn get_config( client_config.store.prune_blobs = prune_blobs; } + if let Some(epochs_per_blob_prune) = + clap_utils::parse_optional(cli_args, "epochs-per-blob-prune")? + { + client_config.store.epochs_per_blob_prune = epochs_per_blob_prune; + } + /* * Zero-ports * diff --git a/beacon_node/store/src/config.rs b/beacon_node/store/src/config.rs index 13ac674dff..b3b5285262 100644 --- a/beacon_node/store/src/config.rs +++ b/beacon_node/store/src/config.rs @@ -8,6 +8,7 @@ pub const PREV_DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 2048; pub const DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 8192; pub const DEFAULT_BLOCK_CACHE_SIZE: usize = 5; pub const DEFAULT_BLOB_CACHE_SIZE: usize = 5; +pub const DEFAULT_EPOCHS_PER_BLOB_PRUNE: u64 = 1; /// Database configuration parameters. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -28,6 +29,8 @@ pub struct StoreConfig { pub prune_payloads: bool, /// Whether to prune blobs older than the blob data availability boundary. pub prune_blobs: bool, + /// Frequency of blob pruning. Default: every epoch. + pub epochs_per_blob_prune: u64, } /// Variant of `StoreConfig` that gets written to disk. Contains immutable configuration params. @@ -53,6 +56,7 @@ impl Default for StoreConfig { compact_on_prune: true, prune_payloads: true, prune_blobs: true, + epochs_per_blob_prune: DEFAULT_EPOCHS_PER_BLOB_PRUNE, } } } diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 927f5fe8a7..22af4b3b5b 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -1721,9 +1721,13 @@ impl, Cold: ItemStore> HotColdDB } }; - if blob_info.last_pruned_epoch == blob_info.next_epoch_to_prune && !force { - info!(self.log, "Blobs sidecars are pruned"); - return Ok(()); + if !force { + let epochs_per_blob_prune = + Epoch::new(self.get_config().epochs_per_blob_prune * E::slots_per_epoch()); + if blob_info.last_pruned_epoch + epochs_per_blob_prune > blob_info.next_epoch_to_prune { + info!(self.log, "Blobs sidecars are pruned"); + return Ok(()); + } } let dab_state_root = blob_info.data_availability_boundary.state_root; @@ -1840,7 +1844,7 @@ pub fn migrate_database, Cold: ItemStore>( } // Prune blobs before migration. - store.try_prune_blobs(false)?; + store.try_prune_blobs(true)?; let mut hot_db_ops: Vec> = Vec::new();