diff --git a/Cargo.lock b/Cargo.lock index e356e6027..875747acc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3419,18 +3419,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.113", -] - [[package]] name = "enum_dispatch" version = "0.3.13" @@ -7767,6 +7755,7 @@ dependencies = [ "hyper", "hyper-util", "jemalloc_pprof", + "libc", "libsystemd", "libunftp", "matchit 0.9.1", @@ -7815,7 +7804,6 @@ dependencies = [ "socket2", "ssh-key", "subtle", - "sysctl", "sysinfo", "thiserror 2.0.17", "tikv-jemalloc-ctl", @@ -9680,20 +9668,6 @@ dependencies = [ "syn 2.0.113", ] -[[package]] -name = "sysctl" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca424247104946a59dacd27eaad296223b7feec3d168a6dd04585183091eb0b" -dependencies = [ - "bitflags 2.10.0", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 2.0.17", - "walkdir", -] - [[package]] name = "sysinfo" version = "0.37.2" diff --git a/Cargo.toml b/Cargo.toml index 90ec90650..083860d27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -234,7 +234,6 @@ snafu = "0.8.9" snap = "1.1.1" starshard = { version = "0.6.0", features = ["rayon", "async", "serde"] } strum = { version = "0.27.2", features = ["derive"] } -sysctl = "0.7.1" sysinfo = "0.37.2" temp-env = "0.3.6" tempfile = "3.24.0" diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index c50548cd1..df2f23d9a 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -125,6 +125,7 @@ url = { workspace = true } urlencoding = { workspace = true } uuid = { workspace = true } zip = { workspace = true } +libc = { workspace = true } # Observability and Metrics metrics = { workspace = true } @@ -135,9 +136,6 @@ russh = { workspace = true } russh-sftp = { workspace = true } ssh-key = { workspace = true } -[target.'cfg(any(target_os = "macos", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd"))'.dependencies] -sysctl = { workspace = true } - [target.'cfg(target_os = "linux")'.dependencies] libsystemd.workspace = true diff --git a/rustfs/src/server/http.rs b/rustfs/src/server/http.rs index 3f3473b71..90589dd49 100644 --- a/rustfs/src/server/http.rs +++ b/rustfs/src/server/http.rs @@ -743,34 +743,58 @@ fn check_auth(req: Request<()>) -> std::result::Result, Status> { Ok(req) } +// For macOS and BSD variants use the syscall way of getting the connection queue length. +#[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd"))] +#[allow(unsafe_code)] +fn get_conn_queue_len() -> i32 { + const DEFAULT_BACKLOG: i32 = 1024; + + #[cfg(target_os = "openbsd")] + let mut name = [libc::CTL_KERN, libc::KERN_SOMAXCONN]; + #[cfg(any(target_os = "netbsd", target_os = "macos", target_os = "freebsd"))] + let mut name = [libc::CTL_KERN, libc::KERN_IPC, libc::KIPC_SOMAXCONN]; + let mut buf = [0; 1]; + let mut buf_len = std::mem::size_of_val(&buf); + + if unsafe { + libc::sysctl( + name.as_mut_ptr(), + name.len() as u32, + buf.as_mut_ptr() as *mut libc::c_void, + &mut buf_len, + std::ptr::null_mut(), + 0, + ) + } != 0 + { + return DEFAULT_BACKLOG; + } + + buf[0] +} + /// Determines the listen backlog size. /// /// It tries to read the system's maximum connection queue length (`somaxconn`). /// If reading fails, it falls back to a default value (e.g., 1024). /// This makes the backlog size adaptive to the system configuration. fn get_listen_backlog() -> i32 { - const DEFAULT_BACKLOG: i32 = 1024; - #[cfg(target_os = "linux")] { + const DEFAULT_BACKLOG: i32 = 1024; + // For Linux, read from /proc/sys/net/core/somaxconn match std::fs::read_to_string("/proc/sys/net/core/somaxconn") { Ok(s) => s.trim().parse().unwrap_or(DEFAULT_BACKLOG), Err(_) => DEFAULT_BACKLOG, } } + #[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd"))] { - // For macOS and BSD variants, use sysctl - use sysctl::Sysctl; - match sysctl::Ctl::new("kern.ipc.somaxconn") { - Ok(ctl) => match ctl.value() { - Ok(sysctl::CtlValue::Int(val)) => val, - _ => DEFAULT_BACKLOG, - }, - Err(_) => DEFAULT_BACKLOG, - } + get_conn_queue_len() } + #[cfg(not(any( target_os = "linux", target_os = "macos",