From 027f3ff26e12670bc1d3d077658ec91806ed95e3 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Tue, 5 Nov 2024 10:21:11 +1100 Subject: [PATCH] Implement set-oldest-blob-slot --- database_manager/src/cli.rs | 14 +++++++++++++ database_manager/src/lib.rs | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/database_manager/src/cli.rs b/database_manager/src/cli.rs index 5521b97805..36e0caa9f0 100644 --- a/database_manager/src/cli.rs +++ b/database_manager/src/cli.rs @@ -3,6 +3,7 @@ use clap_utils::get_color_style; use clap_utils::FLAG_HEADER; use serde::{Deserialize, Serialize}; use std::path::PathBuf; +use types::Slot; use crate::InspectTarget; @@ -79,6 +80,7 @@ pub enum DatabaseManagerSubcommand { PruneBlobs(PruneBlobs), PruneStates(PruneStates), Compact(Compact), + SetOldestBlobSlot(SetOldestBlobSlot), } #[derive(Parser, Clone, Deserialize, Serialize, Debug)] @@ -227,3 +229,15 @@ pub struct Compact { )] pub output_dir: Option, } + +#[derive(Parser, Clone, Deserialize, Serialize, Debug)] +#[clap(about = "Manually override the database's view of the oldest blob known.")] +pub struct SetOldestBlobSlot { + #[clap( + long, + value_name = "SLOT", + help = "Slot of the oldest blob in the database.", + display_order = 0 + )] + pub slot: Slot, +} diff --git a/database_manager/src/lib.rs b/database_manager/src/lib.rs index 3d55631848..47d543c75a 100644 --- a/database_manager/src/lib.rs +++ b/database_manager/src/lib.rs @@ -473,6 +473,41 @@ pub fn prune_states( Ok(()) } +fn set_oldest_blob_slot( + slot: Slot, + client_config: ClientConfig, + runtime_context: &RuntimeContext, + log: Logger, +) -> Result<(), Error> { + let spec = &runtime_context.eth2_config.spec; + let hot_path = client_config.get_db_path(); + let cold_path = client_config.get_freezer_db_path(); + let blobs_path = client_config.get_blobs_db_path(); + + let db = HotColdDB::, LevelDB>::open( + &hot_path, + &cold_path, + &blobs_path, + |_, _, _| Ok(()), + client_config.store, + spec.clone(), + log.clone(), + )?; + + let old_blob_info = db.get_blob_info(); + let mut new_blob_info = old_blob_info.clone(); + new_blob_info.oldest_blob_slot = Some(slot); + + info!( + log, + "Updating oldest blob slot"; + "previous" => ?old_blob_info.oldest_blob_slot, + "new" => slot, + ); + + db.compare_and_set_blob_info_with_write(old_blob_info, new_blob_info) +} + /// Run the database manager, returning an error string if the operation did not succeed. pub fn run( cli_args: &ArgMatches, @@ -530,5 +565,9 @@ pub fn run( let compact_config = parse_compact_config(compact_config)?; compact_db::(compact_config, client_config, log).map_err(format_err) } + cli::DatabaseManagerSubcommand::SetOldestBlobSlot(blob_slot_config) => { + set_oldest_blob_slot(blob_slot_config.slot, client_config, &context, log) + .map_err(format_err) + } } }