From 4d2b83d01f399f07ca75f36d895ccbe52482a3ec Mon Sep 17 00:00:00 2001 From: sakridge Date: Mon, 23 Mar 2020 08:42:32 -0700 Subject: [PATCH] Add option to disable rocks compaction (#9011) --- core/src/validator.rs | 5 ++++- ledger/src/blockstore.rs | 20 ++++++++++++++------ multinode-demo/bootstrap-validator.sh | 3 +++ multinode-demo/validator.sh | 3 +++ validator/src/main.rs | 8 ++++++++ 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/core/src/validator.rs b/core/src/validator.rs index 1d434b44d..b36716754 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -79,6 +79,7 @@ pub struct ValidatorConfig { pub halt_on_trusted_validators_accounts_hash_mismatch: bool, pub accounts_hash_fault_injection_slots: u64, // 0 = no fault injection pub frozen_accounts: Vec, + pub no_rocksdb_compaction: bool, } impl Default for ValidatorConfig { @@ -104,6 +105,7 @@ impl Default for ValidatorConfig { halt_on_trusted_validators_accounts_hash_mismatch: false, accounts_hash_fault_injection_slots: 0, frozen_accounts: vec![], + no_rocksdb_compaction: false, } } } @@ -589,8 +591,9 @@ fn new_banks_from_blockstore( } } - let (blockstore, ledger_signal_receiver, completed_slots_receiver) = + let (mut blockstore, ledger_signal_receiver, completed_slots_receiver) = Blockstore::open_with_signal(blockstore_path).expect("Failed to open ledger database"); + blockstore.set_no_compaction(config.no_rocksdb_compaction); let process_options = blockstore_processor::ProcessOptions { poh_verify, diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 0a57b4657..058b7c0a7 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -93,6 +93,7 @@ pub struct Blockstore { pub new_shreds_signals: Vec>, pub completed_slots_senders: Vec>>, pub lowest_cleanup_slot: Arc>, + no_compaction: bool, } pub struct IndexMetaWorkingSetEntry { @@ -228,6 +229,7 @@ impl Blockstore { insert_shreds_lock: Arc::new(Mutex::new(())), last_root, lowest_cleanup_slot: Arc::new(RwLock::new(0)), + no_compaction: false, }; Ok(blockstore) } @@ -245,6 +247,10 @@ impl Blockstore { Ok((blockstore, signal_receiver, completed_slots_receiver)) } + pub fn set_no_compaction(&mut self, no_compaction: bool) { + self.no_compaction = no_compaction; + } + pub fn destroy(ledger_path: &Path) -> Result<()> { // Database::destroy() fails if the path doesn't exist fs::create_dir_all(ledger_path)?; @@ -276,12 +282,14 @@ impl Blockstore { while from_slot < batch_end { match self.run_purge(from_slot, batch_end) { Ok(end) => { - if let Err(e) = self.compact_storage(from_slot, batch_end) { - // This error is not fatal and indicates an internal error - error!( - "Error: {:?}; Couldn't compact storage from {:?} to {:?}", - e, from_slot, batch_end - ); + if !self.no_compaction { + if let Err(e) = self.compact_storage(from_slot, batch_end) { + // This error is not fatal and indicates an internal error + error!( + "Error: {:?}; Couldn't compact storage from {:?} to {:?}", + e, from_slot, batch_end + ); + } } if end { diff --git a/multinode-demo/bootstrap-validator.sh b/multinode-demo/bootstrap-validator.sh index d59846f02..0334928b9 100755 --- a/multinode-demo/bootstrap-validator.sh +++ b/multinode-demo/bootstrap-validator.sh @@ -37,6 +37,9 @@ while [[ -n $1 ]]; do args+=("$1" "$2") shift 2 elif [[ $1 = --limit-ledger-size ]]; then + args+=("$1" "$2") + shift 2 + elif [[ $1 = --no-rocksdb-compaction ]]; then args+=("$1") shift elif [[ $1 = --enable-rpc-get-confirmed-block ]]; then diff --git a/multinode-demo/validator.sh b/multinode-demo/validator.sh index 5ffc24a7c..8897bc466 100755 --- a/multinode-demo/validator.sh +++ b/multinode-demo/validator.sh @@ -127,6 +127,9 @@ while [[ -n $1 ]]; do args+=("$1" "$2") shift 2 elif [[ $1 = --limit-ledger-size ]]; then + args+=("$1" "$2") + shift 2 + elif [[ $1 = --no-rocksdb-compaction ]]; then args+=("$1") shift elif [[ $1 = --enable-rpc-get-confirmed-block ]]; then diff --git a/validator/src/main.rs b/validator/src/main.rs index 874eaef31..7af983f09 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -641,6 +641,12 @@ pub fn main() { .takes_value(false) .help("Use the RPC service of trusted validators only") ) + .arg( + Arg::with_name("no_rocksdb_compaction") + .long("no-rocksdb-compaction") + .takes_value(false) + .help("Disable manual compaction of the ledger database. May increase storage requirements.") + ) .arg( clap::Arg::with_name("bind_address") .long("bind-address") @@ -698,6 +704,7 @@ pub fn main() { let no_snapshot_fetch = matches.is_present("no_snapshot_fetch"); let no_check_vote_account = matches.is_present("no_check_vote_account"); let private_rpc = matches.is_present("private_rpc"); + let no_rocksdb_compaction = matches.is_present("no_rocksdb_compaction"); // Canonicalize ledger path to avoid issues with symlink creation let _ = fs::create_dir_all(&ledger_path); @@ -748,6 +755,7 @@ pub fn main() { wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(), trusted_validators, frozen_accounts: values_t!(matches, "frozen_accounts", Pubkey).unwrap_or_default(), + no_rocksdb_compaction, ..ValidatorConfig::default() };