use crate::environment_config::EnvironmentConfig;
pub struct UnimplementedParam {
pub name: &'static str,
pub is_non_default: fn(&EnvironmentConfig) -> bool,
}
pub static UNIMPLEMENTED_ENV_PARAMS: &[UnimplementedParam] = &[
UnimplementedParam {
name: "env_check_leaks",
is_non_default: |c| !c.env_check_leaks,
},
UnimplementedParam {
name: "env_forced_yield",
is_non_default: |c| c.env_forced_yield,
},
UnimplementedParam {
name: "env_fair_latches",
is_non_default: |c| c.env_fair_latches,
},
UnimplementedParam {
name: "env_latch_timeout_ms",
is_non_default: |c| c.env_latch_timeout_ms != 300_000,
},
UnimplementedParam {
name: "env_ttl_clock_tolerance_ms",
is_non_default: |c| c.env_ttl_clock_tolerance_ms != 0,
},
UnimplementedParam {
name: "env_expiration_enabled",
is_non_default: |c| c.env_expiration_enabled,
},
UnimplementedParam {
name: "env_db_eviction",
is_non_default: |c| c.env_db_eviction,
},
];
pub fn warn_unimplemented_params(config: &EnvironmentConfig) {
for param in UNIMPLEMENTED_ENV_PARAMS {
if (param.is_non_default)(config) {
log::warn!(
"EnvironmentConfig::{} is set to a non-default value but \
is NOT YET IMPLEMENTED as of v3.1. \
The setting has no effect. \
See docs/src/operations/known-limitations.md.",
param.name
);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::environment_config::EnvironmentConfig;
use std::path::PathBuf;
fn env_default() -> EnvironmentConfig {
EnvironmentConfig::new(PathBuf::from("."))
}
#[test]
fn all_unimplemented_params_detect_non_default() {
let default_config = env_default();
for param in UNIMPLEMENTED_ENV_PARAMS {
assert!(
!(param.is_non_default)(&default_config),
"param '{}' is_non_default fired on the DEFAULT config — \
the default check is wrong",
param.name,
);
}
}
#[test]
fn env_check_leaks_warn_on_false() {
let mut c = env_default();
c.set_env_check_leaks(false);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_check_leaks")
.unwrap();
assert!((p.is_non_default)(&c), "should detect non-default");
}
#[test]
fn env_forced_yield_warn_on_true() {
let mut c = env_default();
c.set_env_forced_yield(true);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_forced_yield")
.unwrap();
assert!((p.is_non_default)(&c));
}
#[test]
fn env_fair_latches_warn_on_true() {
let mut c = env_default();
c.set_env_fair_latches(true);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_fair_latches")
.unwrap();
assert!((p.is_non_default)(&c));
}
#[test]
fn env_latch_timeout_ms_warn_on_non_default() {
let mut c = env_default();
c.set_env_latch_timeout_ms(60_000); let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_latch_timeout_ms")
.unwrap();
assert!((p.is_non_default)(&c));
}
#[test]
fn env_latch_timeout_ms_no_warn_on_default() {
let mut c = env_default();
c.set_env_latch_timeout_ms(300_000); let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_latch_timeout_ms")
.unwrap();
assert!(!(p.is_non_default)(&c));
}
#[test]
fn env_ttl_clock_tolerance_ms_warn_on_non_zero() {
let mut c = env_default();
c.set_env_ttl_clock_tolerance_ms(100);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_ttl_clock_tolerance_ms")
.unwrap();
assert!((p.is_non_default)(&c));
}
#[test]
fn env_expiration_enabled_warn_on_true() {
let mut c = env_default();
c.set_env_expiration_enabled(true);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_expiration_enabled")
.unwrap();
assert!((p.is_non_default)(&c));
}
#[test]
fn env_db_eviction_warn_on_true() {
let mut c = env_default();
c.set_env_db_eviction(true);
let p = UNIMPLEMENTED_ENV_PARAMS
.iter()
.find(|p| p.name == "env_db_eviction")
.unwrap();
assert!((p.is_non_default)(&c));
}
}