use std::sync::atomic::{AtomicU8, AtomicUsize, Ordering};
pub const DEFAULT_METADATA_JOURNAL_RETENTION: usize = 32;
pub const OPT_IN_METADATA_JOURNAL_RETENTION: usize = 4;
static META_JSON_SIDECAR_POLICY: AtomicU8 = AtomicU8::new(0);
pub fn set_meta_json_sidecar_enabled(enabled: bool) {
META_JSON_SIDECAR_POLICY.store(if enabled { 1 } else { 2 }, Ordering::Relaxed);
}
pub fn meta_json_sidecar_enabled() -> bool {
match META_JSON_SIDECAR_POLICY.load(Ordering::Relaxed) {
1 => true,
2 => false,
_ => env_flag("REDDB_META_JSON_SIDECAR"),
}
}
static SEQN_JOURNAL_POLICY: AtomicU8 = AtomicU8::new(0);
static SEQN_JOURNAL_RETENTION: AtomicUsize = AtomicUsize::new(0);
pub fn set_seqn_journal_enabled(enabled: bool) {
SEQN_JOURNAL_POLICY.store(if enabled { 1 } else { 2 }, Ordering::Relaxed);
}
pub fn seqn_journal_enabled() -> bool {
match SEQN_JOURNAL_POLICY.load(Ordering::Relaxed) {
1 => true,
2 => false,
_ => env_flag("REDDB_SEQN_JOURNAL"),
}
}
static FOLD_PAGER_META_POLICY: AtomicU8 = AtomicU8::new(0);
pub fn set_fold_pager_meta_enabled(enabled: bool) {
FOLD_PAGER_META_POLICY.store(if enabled { 1 } else { 2 }, Ordering::Relaxed);
}
pub fn fold_pager_meta_enabled() -> bool {
match FOLD_PAGER_META_POLICY.load(Ordering::Relaxed) {
1 => true,
2 => false,
_ => env_flag("REDDB_FOLD_PAGER_META"),
}
}
static FOLD_DWB_INTO_WAL_POLICY: AtomicU8 = AtomicU8::new(0);
pub fn set_fold_dwb_into_wal_enabled(enabled: bool) {
FOLD_DWB_INTO_WAL_POLICY.store(if enabled { 1 } else { 2 }, Ordering::Relaxed);
}
pub fn fold_dwb_into_wal_enabled() -> bool {
match FOLD_DWB_INTO_WAL_POLICY.load(Ordering::Relaxed) {
1 => true,
2 => false,
_ => env_flag("REDDB_FOLD_DWB_INTO_WAL"),
}
}
pub fn set_seqn_journal_retention(retention: usize) {
SEQN_JOURNAL_RETENTION.store(retention, Ordering::Relaxed);
}
pub fn seqn_journal_retention() -> usize {
let stored = SEQN_JOURNAL_RETENTION.load(Ordering::Relaxed);
if stored > 0 {
return stored;
}
std::env::var("REDDB_SEQN_JOURNAL_RETENTION")
.ok()
.and_then(|v| v.parse::<usize>().ok())
.filter(|v| *v > 0)
.unwrap_or(OPT_IN_METADATA_JOURNAL_RETENTION)
}
fn env_flag(name: &str) -> bool {
std::env::var(name)
.ok()
.map(|v| matches!(v.as_str(), "1" | "true" | "TRUE" | "yes" | "on"))
.unwrap_or(false)
}
#[cfg(test)]
fn reset_physical_metadata_policy_for_test() {
META_JSON_SIDECAR_POLICY.store(0, Ordering::Relaxed);
SEQN_JOURNAL_POLICY.store(0, Ordering::Relaxed);
FOLD_PAGER_META_POLICY.store(0, Ordering::Relaxed);
FOLD_DWB_INTO_WAL_POLICY.store(0, Ordering::Relaxed);
SEQN_JOURNAL_RETENTION.store(0, Ordering::Relaxed);
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Mutex;
static POLICY_TEST_LOCK: Mutex<()> = Mutex::new(());
fn set_env(name: &str, value: &str) {
unsafe {
std::env::set_var(name, value);
}
}
fn remove_env(name: &str) {
unsafe {
std::env::remove_var(name);
}
}
#[test]
fn env_flags_and_explicit_overrides_drive_sidecar_policies() {
let _guard = POLICY_TEST_LOCK.lock().unwrap();
reset_physical_metadata_policy_for_test();
for value in ["1", "true", "TRUE", "yes", "on"] {
set_env("REDDB_META_JSON_SIDECAR", value);
assert!(meta_json_sidecar_enabled(), "{value}");
}
set_env("REDDB_META_JSON_SIDECAR", "false");
assert!(!meta_json_sidecar_enabled());
set_meta_json_sidecar_enabled(true);
set_env("REDDB_META_JSON_SIDECAR", "false");
assert!(meta_json_sidecar_enabled());
set_meta_json_sidecar_enabled(false);
set_env("REDDB_META_JSON_SIDECAR", "1");
assert!(!meta_json_sidecar_enabled());
remove_env("REDDB_META_JSON_SIDECAR");
}
#[test]
fn journal_and_fold_policy_overrides_are_independent() {
let _guard = POLICY_TEST_LOCK.lock().unwrap();
reset_physical_metadata_policy_for_test();
set_env("REDDB_SEQN_JOURNAL", "1");
assert!(seqn_journal_enabled());
set_seqn_journal_enabled(false);
assert!(!seqn_journal_enabled());
set_seqn_journal_enabled(true);
assert!(seqn_journal_enabled());
remove_env("REDDB_SEQN_JOURNAL");
set_env("REDDB_FOLD_PAGER_META", "yes");
assert!(fold_pager_meta_enabled());
set_fold_pager_meta_enabled(false);
assert!(!fold_pager_meta_enabled());
set_fold_pager_meta_enabled(true);
assert!(fold_pager_meta_enabled());
remove_env("REDDB_FOLD_PAGER_META");
set_env("REDDB_FOLD_DWB_INTO_WAL", "on");
assert!(fold_dwb_into_wal_enabled());
set_fold_dwb_into_wal_enabled(false);
assert!(!fold_dwb_into_wal_enabled());
set_fold_dwb_into_wal_enabled(true);
assert!(fold_dwb_into_wal_enabled());
remove_env("REDDB_FOLD_DWB_INTO_WAL");
}
#[test]
fn seqn_journal_retention_prefers_override_then_env_then_default() {
let _guard = POLICY_TEST_LOCK.lock().unwrap();
reset_physical_metadata_policy_for_test();
remove_env("REDDB_SEQN_JOURNAL_RETENTION");
assert_eq!(seqn_journal_retention(), OPT_IN_METADATA_JOURNAL_RETENTION);
set_env("REDDB_SEQN_JOURNAL_RETENTION", "12");
assert_eq!(seqn_journal_retention(), 12);
set_env("REDDB_SEQN_JOURNAL_RETENTION", "0");
assert_eq!(seqn_journal_retention(), OPT_IN_METADATA_JOURNAL_RETENTION);
set_env("REDDB_SEQN_JOURNAL_RETENTION", "bad");
assert_eq!(seqn_journal_retention(), OPT_IN_METADATA_JOURNAL_RETENTION);
set_seqn_journal_retention(99);
assert_eq!(seqn_journal_retention(), 99);
set_seqn_journal_retention(0);
assert_eq!(seqn_journal_retention(), OPT_IN_METADATA_JOURNAL_RETENTION);
remove_env("REDDB_SEQN_JOURNAL_RETENTION");
}
}