diff --git a/crates/config/README.md b/crates/config/README.md index ea694b3a6..f4d15e5ad 100644 --- a/crates/config/README.md +++ b/crates/config/README.md @@ -49,6 +49,12 @@ Current guidance: - Deprecated example: - `RUSTFS_ENABLE_SCANNER` -> `RUSTFS_SCANNER_ENABLED` - `RUSTFS_ENABLE_HEAL` -> `RUSTFS_HEAL_ENABLED` + - `RUSTFS_DATA_SCANNER_START_DELAY_SECS` -> `RUSTFS_SCANNER_START_DELAY_SECS` + +## Scanner environment aliases + +- `RUSTFS_SCANNER_START_DELAY_SECS` (canonical) +- `RUSTFS_DATA_SCANNER_START_DELAY_SECS` (deprecated alias for compatibility) ## 📄 License diff --git a/crates/config/src/constants/scanner.rs b/crates/config/src/constants/scanner.rs index 28aab6f0b..cfbbbe89d 100644 --- a/crates/config/src/constants/scanner.rs +++ b/crates/config/src/constants/scanner.rs @@ -14,10 +14,15 @@ use std::time::Duration; -/// Environment variable name that specifies the data scanner start delay in seconds. +/// Canonical environment variable name that specifies the scanner start delay in seconds. /// If set, this overrides the cycle interval derived from `RUSTFS_SCANNER_SPEED`. /// - Unit: seconds (u64). -/// - Example: `export RUSTFS_DATA_SCANNER_START_DELAY_SECS=10` +/// - Example: `export RUSTFS_SCANNER_START_DELAY_SECS=10` +pub const ENV_SCANNER_START_DELAY_SECS: &str = "RUSTFS_SCANNER_START_DELAY_SECS"; + +/// Deprecated compatibility alias for scanner start delay. +/// Prefer `RUSTFS_SCANNER_START_DELAY_SECS`. +#[deprecated(note = "Use RUSTFS_SCANNER_START_DELAY_SECS instead")] pub const ENV_DATA_SCANNER_START_DELAY_SECS: &str = "RUSTFS_DATA_SCANNER_START_DELAY_SECS"; /// Environment variable that selects the scanner speed preset. diff --git a/crates/scanner/src/scanner.rs b/crates/scanner/src/scanner.rs index 91b131705..0638812aa 100644 --- a/crates/scanner/src/scanner.rs +++ b/crates/scanner/src/scanner.rs @@ -22,7 +22,10 @@ use crate::{DataUsageInfo, ScannerError}; use chrono::{DateTime, Utc}; use rustfs_common::heal_channel::HealScanMode; use rustfs_common::metrics::{CurrentCycle, Metric, Metrics, emit_scan_cycle_complete, global_metrics}; -use rustfs_config::{DEFAULT_SCANNER_SPEED, ENV_DATA_SCANNER_START_DELAY_SECS, ENV_SCANNER_SPEED, ScannerSpeed}; +use rustfs_config::DEFAULT_SCANNER_SPEED; +use rustfs_config::ENV_SCANNER_SPEED; +use rustfs_config::ENV_SCANNER_START_DELAY_SECS; +use rustfs_config::ScannerSpeed; use rustfs_ecstore::StorageAPI as _; use rustfs_ecstore::config::com::{read_config, save_config}; use rustfs_ecstore::disk::RUSTFS_META_BUCKET; @@ -35,17 +38,25 @@ use tokio::time::{Duration, Instant}; use tokio_util::sync::CancellationToken; use tracing::{debug, error, info, instrument, warn}; -/// Returns the base cycle interval. If `RUSTFS_DATA_SCANNER_START_DELAY_SECS` -/// is set, it takes precedence; otherwise the value is derived from the +const ENV_SCANNER_START_DELAY_SECS_DEPRECATED: &str = "RUSTFS_DATA_SCANNER_START_DELAY_SECS"; + +/// Returns the base cycle interval. If `RUSTFS_SCANNER_START_DELAY_SECS` +/// is set (or `RUSTFS_DATA_SCANNER_START_DELAY_SECS` as deprecated alias), +/// it takes precedence; otherwise the value is derived from the /// `RUSTFS_SCANNER_SPEED` preset. fn cycle_interval() -> Duration { - if let Some(secs) = rustfs_utils::get_env_opt_u64(ENV_DATA_SCANNER_START_DELAY_SECS) { + if let Some(secs) = scanner_start_delay_secs() { return Duration::from_secs(secs); } let speed_str = rustfs_utils::get_env_str(ENV_SCANNER_SPEED, DEFAULT_SCANNER_SPEED); ScannerSpeed::from_env_str(&speed_str).cycle_interval() } +fn scanner_start_delay_secs() -> Option { + let deprecated = [ENV_SCANNER_START_DELAY_SECS_DEPRECATED]; + rustfs_utils::get_env_opt_u64_with_aliases(ENV_SCANNER_START_DELAY_SECS, &deprecated) +} + /// Compute a randomized inter-cycle sleep. // Delay is scan interval +- 10%, with a floor of 1 second. fn randomized_cycle_delay() -> Duration { diff --git a/crates/utils/src/envs.rs b/crates/utils/src/envs.rs index 1c19cd881..a32eaec0a 100644 --- a/crates/utils/src/envs.rs +++ b/crates/utils/src/envs.rs @@ -310,6 +310,28 @@ pub fn get_env_u64(key: &str, default: u64) -> u64 { env::var(key).ok().and_then(|v| v.parse().ok()).unwrap_or(default) } +/// Retrieve an environment variable as an unsigned 64-bit integer, returning `None` if not set or parsing fails. +/// Deprecated aliases are also supported with warning logging. +/// +/// #Parameters +/// - `key`: The canonical environment variable key to look up. +/// - `deprecated`: A list of deprecated keys kept for compatibility. +/// +/// #Returns +/// - `Option`: The parsed value if a key is found and valid, otherwise `None`. +/// +pub fn get_env_opt_u64_with_aliases(key: &str, deprecated: &[&str]) -> Option { + let (used_key, value) = resolve_env_with_aliases(key, deprecated)?; + value + .parse::() + .map_err(|_| { + log_once(&format!("env_invalid_u64:{used_key}"), || { + format!("Invalid u64 value for {used_key}: {value}. Using default behavior.") + }); + }) + .ok() +} + /// Retrieve an environment variable as a specific type, returning None if not set or parsing fails. /// /// #Parameters