From fe91ce06019167e87eaca4f7f2705073f5f4cc95 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 25 Mar 2024 16:51:55 -0700 Subject: [PATCH] add conf items for rocksdb repair and read-only modes. Signed-off-by: Jason Volk --- src/config/mod.rs | 6 +++++ src/database/abstraction/rocksdb.rs | 38 +++++++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 786168a6..c4b5fc3e 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -207,6 +207,10 @@ pub struct Config { pub rocksdb_bottommost_compression: bool, #[serde(default = "default_rocksdb_recovery_mode")] pub rocksdb_recovery_mode: u8, + #[serde(default)] + pub rocksdb_repair: bool, + #[serde(default)] + pub rocksdb_read_only: bool, pub emergency_password: Option, @@ -629,6 +633,8 @@ impl fmt::Display for Config { ), #[cfg(feature = "rocksdb")] ("RocksDB Recovery Mode", &self.rocksdb_recovery_mode.to_string()), + ("RocksDB Repair Mode", &self.rocksdb_repair.to_string()), + ("RocksDB Read-only Mode", &self.rocksdb_read_only.to_string()), ("Prevent Media Downloads From", { let mut lst = vec![]; for domain in &self.prevent_media_downloads_from { diff --git a/src/database/abstraction/rocksdb.rs b/src/database/abstraction/rocksdb.rs index 23043e10..27c6c962 100644 --- a/src/database/abstraction/rocksdb.rs +++ b/src/database/abstraction/rocksdb.rs @@ -7,16 +7,17 @@ use std::{ use chrono::{DateTime, Utc}; use rust_rocksdb::{ backup::{BackupEngine, BackupEngineOptions}, + DBWithThreadMode as Db, LogLevel::{Debug, Error, Fatal, Info, Warn}, - WriteBatchWithTransaction, + MultiThreaded, WriteBatchWithTransaction, }; -use tracing::{debug, error, info}; +use tracing::{debug, error, info, warn}; use super::{super::Config, watchers::Watchers, KeyValueDatabaseEngine, KvTree}; use crate::{utils, Result}; pub(crate) struct Engine { - rocks: rust_rocksdb::DBWithThreadMode, + rocks: Db, row_cache: rust_rocksdb::Cache, col_cache: rust_rocksdb::Cache, old_cfs: Vec, @@ -145,19 +146,30 @@ impl KeyValueDatabaseEngine for Arc { let db_opts = db_options(config, &db_env, &row_cache, &col_cache); debug!("Listing column families in database"); - let cfs = - rust_rocksdb::DBWithThreadMode::::list_cf(&db_opts, &config.database_path) - .unwrap_or_default(); + let cfs = Db::::list_cf(&db_opts, &config.database_path).unwrap_or_default(); - debug!("Opening column family descriptors in database"); + if config.rocksdb_repair { + warn!("Starting database repair. This may take a long time..."); + if let Err(e) = Db::::repair(&db_opts, &config.database_path) { + error!("Repair failed: {:?}", e); + } + } + + debug!("Opening {} column family descriptors in database", cfs.len()); info!("RocksDB database compaction will take place now, a delay in startup is expected"); - let db = rust_rocksdb::DBWithThreadMode::::open_cf_descriptors( - &db_opts, - &config.database_path, - cfs.iter() - .map(|name| rust_rocksdb::ColumnFamilyDescriptor::new(name, db_opts.clone())), - )?; + let cfds = cfs + .iter() + .map(|name| rust_rocksdb::ColumnFamilyDescriptor::new(name, db_opts.clone())) + .collect::>(); + + let db = if config.rocksdb_read_only { + Db::::open_cf_for_read_only(&db_opts, &config.database_path, cfs.clone(), false)? + } else { + Db::::open_cf_descriptors(&db_opts, &config.database_path, cfds)? + }; + + debug!("Opened database at sequence number {}", db.latest_sequence_number()); Ok(Arc::new(Engine { rocks: db, row_cache,