diff --git a/Cargo.lock b/Cargo.lock index 80f15677c..750b0869d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9906,6 +9906,7 @@ dependencies = [ "regex", "rmp", "rmp-serde", + "rustfs-config", "rustfs-utils", "s3s", "serde", diff --git a/crates/config/src/constants/api.rs b/crates/config/src/constants/api.rs index fedb49b95..6bbccbf00 100644 --- a/crates/config/src/constants/api.rs +++ b/crates/config/src/constants/api.rs @@ -100,5 +100,10 @@ pub const DEFAULT_API_MAX_CONNECTIONS: usize = 0; /// Example: RUSTFS_API_OBJECT_MAX_VERSIONS=50000 pub const ENV_API_OBJECT_MAX_VERSIONS: &str = "RUSTFS_API_OBJECT_MAX_VERSIONS"; -/// Default for `RUSTFS_API_OBJECT_MAX_VERSIONS`. -pub const DEFAULT_API_OBJECT_MAX_VERSIONS: u64 = 9_223_372_036_854_775_807; +/// Default and maximum accepted value for `RUSTFS_API_OBJECT_MAX_VERSIONS`. +#[cfg(target_pointer_width = "64")] +pub const DEFAULT_API_OBJECT_MAX_VERSIONS: usize = 9_223_372_036_854_775_807; + +/// Default and maximum accepted value for `RUSTFS_API_OBJECT_MAX_VERSIONS`. +#[cfg(not(target_pointer_width = "64"))] +pub const DEFAULT_API_OBJECT_MAX_VERSIONS: usize = usize::MAX; diff --git a/crates/filemeta/Cargo.toml b/crates/filemeta/Cargo.toml index ef6095d65..369978881 100644 --- a/crates/filemeta/Cargo.toml +++ b/crates/filemeta/Cargo.toml @@ -44,6 +44,7 @@ tokio = { workspace = true, features = ["io-util", "macros", "sync", "fs", "rt-m xxhash-rust = { workspace = true, features = ["xxh64", "xxh3"] } bytes = { workspace = true, features = ["serde"] } rustfs-utils = { workspace = true, features = ["hash", "http"] } +rustfs-config = { workspace = true, features = ["constants"] } byteorder = { workspace = true } tracing.workspace = true thiserror.workspace = true diff --git a/crates/filemeta/src/filemeta.rs b/crates/filemeta/src/filemeta.rs index 05e8b5119..18f5690d6 100644 --- a/crates/filemeta/src/filemeta.rs +++ b/crates/filemeta/src/filemeta.rs @@ -70,12 +70,8 @@ const _XL_FLAG_INLINE_DATA: u8 = 1 << 2; const META_DATA_READ_DEFAULT: usize = 4 << 10; const MSGP_UINT32_SIZE: usize = 5; -/// Default max object versions per object, aligned with MinIO's default. -pub const DEFAULT_OBJECT_MAX_VERSIONS: usize = if usize::BITS >= 64 { - 9_223_372_036_854_775_807 -} else { - usize::MAX -}; +/// Default max object versions per object. +pub const DEFAULT_OBJECT_MAX_VERSIONS: usize = rustfs_config::DEFAULT_API_OBJECT_MAX_VERSIONS; static OBJECT_MAX_VERSIONS: AtomicUsize = AtomicUsize::new(DEFAULT_OBJECT_MAX_VERSIONS); diff --git a/rustfs/src/startup_runtime.rs b/rustfs/src/startup_runtime.rs index 0d6947bdd..a7d538c3f 100644 --- a/rustfs/src/startup_runtime.rs +++ b/rustfs/src/startup_runtime.rs @@ -17,7 +17,7 @@ use crate::{ startup_runtime_hooks::{init_profiling_runtime, install_default_crypto_provider, log_startup_runtime_diagnostics}, startup_tls_material::init_outbound_tls_material, }; -use rustfs_config::ENV_API_OBJECT_MAX_VERSIONS; +use rustfs_config::{DEFAULT_API_OBJECT_MAX_VERSIONS, ENV_API_OBJECT_MAX_VERSIONS}; use rustfs_utils::EnvParseOutcome; use std::io::{Error, Result}; @@ -32,13 +32,8 @@ pub(crate) async fn init_startup_runtime_foundation(config: &Config) -> Result<( fn init_object_max_versions_config() -> Result<()> { let limit = match rustfs_utils::get_env_parse_outcome::(ENV_API_OBJECT_MAX_VERSIONS) { - EnvParseOutcome::Absent => rustfs_filemeta::DEFAULT_OBJECT_MAX_VERSIONS, - EnvParseOutcome::Invalid => { - return Err(Error::other(format!( - "{ENV_API_OBJECT_MAX_VERSIONS} must be a positive integer no greater than {}", - usize::MAX - ))); - } + EnvParseOutcome::Absent => DEFAULT_API_OBJECT_MAX_VERSIONS, + EnvParseOutcome::Invalid => return Err(object_max_versions_config_error()), EnvParseOutcome::Parsed(value) => object_max_versions_limit_from_u64(value)?, }; @@ -47,18 +42,20 @@ fn init_object_max_versions_config() -> Result<()> { fn object_max_versions_limit_from_u64(value: u64) -> Result { if value == 0 { - return Err(Error::other(format!( - "{ENV_API_OBJECT_MAX_VERSIONS} must be a positive integer no greater than {}", - usize::MAX - ))); + return Err(object_max_versions_config_error()); } - usize::try_from(value).map_err(|_| { - Error::other(format!( - "{ENV_API_OBJECT_MAX_VERSIONS} must be a positive integer no greater than {}", - usize::MAX - )) - }) + let limit = usize::try_from(value).map_err(|_| object_max_versions_config_error())?; + if limit > DEFAULT_API_OBJECT_MAX_VERSIONS { + return Err(object_max_versions_config_error()); + } + Ok(limit) +} + +fn object_max_versions_config_error() -> Error { + Error::other(format!( + "{ENV_API_OBJECT_MAX_VERSIONS} must be a positive integer no greater than {DEFAULT_API_OBJECT_MAX_VERSIONS}" + )) } #[cfg(test)]