use {
crate::blockstore_db::{default_num_compaction_threads, default_num_flush_threads},
rocksdb::{DBCompressionType as RocksCompressionType, DBRecoveryMode},
std::num::NonZeroUsize,
};
pub const BLOCKSTORE_DIRECTORY_ROCKS_LEVEL: &str = "rocksdb";
#[derive(Debug, Clone, PartialEq)]
pub struct BlockstoreOptions {
pub access_type: AccessType,
pub recovery_mode: Option<BlockstoreRecoveryMode>,
pub column_options: LedgerColumnOptions,
pub num_rocksdb_compaction_threads: NonZeroUsize,
pub num_rocksdb_flush_threads: NonZeroUsize,
}
impl Default for BlockstoreOptions {
fn default() -> Self {
Self {
access_type: AccessType::Primary,
recovery_mode: None,
column_options: LedgerColumnOptions::default(),
num_rocksdb_compaction_threads: default_num_compaction_threads(),
num_rocksdb_flush_threads: default_num_flush_threads(),
}
}
}
impl BlockstoreOptions {
pub fn default_for_tests() -> Self {
BlockstoreOptions::default()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum AccessType {
Primary,
PrimaryForMaintenance,
Secondary,
}
#[derive(Debug, Clone, PartialEq)]
pub enum BlockstoreRecoveryMode {
TolerateCorruptedTailRecords,
AbsoluteConsistency,
PointInTime,
SkipAnyCorruptedRecord,
}
impl From<&str> for BlockstoreRecoveryMode {
fn from(string: &str) -> Self {
match string {
"tolerate_corrupted_tail_records" => {
BlockstoreRecoveryMode::TolerateCorruptedTailRecords
}
"absolute_consistency" => BlockstoreRecoveryMode::AbsoluteConsistency,
"point_in_time" => BlockstoreRecoveryMode::PointInTime,
"skip_any_corrupted_record" => BlockstoreRecoveryMode::SkipAnyCorruptedRecord,
bad_mode => panic!("Invalid recovery mode: {bad_mode}"),
}
}
}
impl From<BlockstoreRecoveryMode> for DBRecoveryMode {
fn from(brm: BlockstoreRecoveryMode) -> Self {
match brm {
BlockstoreRecoveryMode::TolerateCorruptedTailRecords => {
DBRecoveryMode::TolerateCorruptedTailRecords
}
BlockstoreRecoveryMode::AbsoluteConsistency => DBRecoveryMode::AbsoluteConsistency,
BlockstoreRecoveryMode::PointInTime => DBRecoveryMode::PointInTime,
BlockstoreRecoveryMode::SkipAnyCorruptedRecord => {
DBRecoveryMode::SkipAnyCorruptedRecord
}
}
}
}
#[derive(Default, Debug, Clone, PartialEq)]
pub struct LedgerColumnOptions {
pub compression_type: BlockstoreCompressionType,
pub rocks_perf_sample_interval: usize,
}
impl LedgerColumnOptions {
pub fn get_compression_type_string(&self) -> &'static str {
match self.compression_type {
BlockstoreCompressionType::None => "None",
BlockstoreCompressionType::Snappy => "Snappy",
BlockstoreCompressionType::Lz4 => "Lz4",
BlockstoreCompressionType::Zlib => "Zlib",
}
}
}
#[derive(Debug, Clone, PartialEq, Default)]
pub enum BlockstoreCompressionType {
#[default]
None,
Snappy,
Lz4,
Zlib,
}
impl BlockstoreCompressionType {
pub(crate) fn to_rocksdb_compression_type(&self) -> RocksCompressionType {
match self {
Self::None => RocksCompressionType::None,
Self::Snappy => RocksCompressionType::Snappy,
Self::Lz4 => RocksCompressionType::Lz4,
Self::Zlib => RocksCompressionType::Zlib,
}
}
}