From 07cf2feaadfd61ec237cb69ae7fae5a900fdcf10 Mon Sep 17 00:00:00 2001 From: houseme Date: Sun, 1 Feb 2026 00:12:55 +0800 Subject: [PATCH] fix(pprof): Fixed the problem that `pprof` crate does not support the window platform (#1681) Signed-off-by: houseme Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Cargo.lock | 126 ++------------------------------------ crates/scanner/Cargo.toml | 6 +- rustfs/Cargo.toml | 7 ++- rustfs/src/main.rs | 9 ++- rustfs/src/profiling.rs | 41 ++++++++++++- 5 files changed, 57 insertions(+), 132 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 53619f2eb..668f4b350 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1225,15 +1225,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -1538,7 +1529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ "chrono", - "phf 0.12.1", + "phf", ] [[package]] @@ -3205,15 +3196,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" -[[package]] -name = "doxygen-rs" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415b6ec780d34dcf624666747194393603d0373b7141eef01d12ee58881507d9" -dependencies = [ - "phf 0.11.3", -] - [[package]] name = "dunce" version = "1.0.5" @@ -4301,44 +4283,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "heed" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a56c94661ddfb51aa9cdfbf102cfcc340aa69267f95ebccc4af08d7c530d393" -dependencies = [ - "bitflags 2.10.0", - "byteorder", - "heed-traits", - "heed-types", - "libc", - "lmdb-master-sys", - "once_cell", - "page_size", - "serde", - "synchronoise", - "url", -] - -[[package]] -name = "heed-traits" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3130048d404c57ce5a1ac61a903696e8fcde7e8c2991e9fcfc1f27c3ef74ff" - -[[package]] -name = "heed-types" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c255bdf46e07fb840d120a36dcc81f385140d7191c76a7391672675c01a55d" -dependencies = [ - "bincode", - "byteorder", - "heed-traits", - "serde", - "serde_json", -] - [[package]] name = "hermit-abi" version = "0.5.2" @@ -5348,17 +5292,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" -[[package]] -name = "lmdb-master-sys" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864808e0b19fb6dd3b70ba94ee671b82fce17554cf80aeb0a155c65bb08027df" -dependencies = [ - "cc", - "doxygen-rs", - "libc", -] - [[package]] name = "local-ip-address" version = "0.6.9" @@ -6417,55 +6350,13 @@ dependencies = [ "subtle", ] -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared 0.11.3", -] - [[package]] name = "phf" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ - "phf_shared 0.12.1", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", + "phf_shared", ] [[package]] @@ -8313,11 +8204,9 @@ dependencies = [ name = "rustfs-scanner" version = "0.0.5" dependencies = [ - "anyhow", "async-trait", "chrono", "futures", - "heed", "http 1.4.0", "path-clean", "rand 0.10.0-rc.6", @@ -8331,11 +8220,13 @@ dependencies = [ "s3s", "serde", "serde_json", + "serial_test", "thiserror 2.0.18", "time", "tokio", "tokio-util", "tracing", + "tracing-subscriber", "uuid", ] @@ -9671,15 +9562,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "synchronoise" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dbc01390fc626ce8d1cffe3376ded2b72a11bb70e1c75f404a210e4daa4def2" -dependencies = [ - "crossbeam-queue", -] - [[package]] name = "synstructure" version = "0.12.6" diff --git a/crates/scanner/Cargo.toml b/crates/scanner/Cargo.toml index 00ec11fab..62f6c3539 100644 --- a/crates/scanner/Cargo.toml +++ b/crates/scanner/Cargo.toml @@ -38,8 +38,6 @@ tracing = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } thiserror = { workspace = true } -uuid = { workspace = true, features = ["v4", "serde"] } -anyhow = { workspace = true } async-trait = { workspace = true } futures = { workspace = true } time = { workspace = true } @@ -55,8 +53,6 @@ rand = { workspace = true } s3s = { workspace = true } [dev-dependencies] -tokio-test = { workspace = true } tracing-subscriber = { workspace = true } -tempfile = { workspace = true } serial_test = { workspace = true } -heed = { version = "0.22.0" } \ No newline at end of file +uuid = { workspace = true, features = ["v4", "serde"] } diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index ab5eef243..fa38b28b4 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -125,7 +125,6 @@ urlencoding = { workspace = true } uuid = { workspace = true } zip = { workspace = true } libc = { workspace = true } -pprof = { workspace = true } # Observability and Metrics metrics = { workspace = true } @@ -141,14 +140,20 @@ libsystemd.workspace = true [target.'cfg(not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")))'.dependencies] mimalloc = { workspace = true } + +# Note: If you want to *explicitly* exclude Windows from a target dependency set, +# you can use a cfg like the following instead: +[target.'cfg(all(not(target_os = "windows"), not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64"))))'.dependencies] starshard = { workspace = true } backtrace = { workspace = true } rand = { workspace = true } +pprof = { workspace = true } [target.'cfg(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64"))'.dependencies] tikv-jemallocator = { workspace = true } tikv-jemalloc-ctl = { workspace = true } jemalloc_pprof = { workspace = true } +pprof = { workspace = true } [dev-dependencies] uuid = { workspace = true, features = ["v4"] } diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 725ecc2f4..77a44b1b9 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -70,11 +70,18 @@ use tracing::{debug, error, info, instrument, warn}; #[global_allocator] static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; -#[cfg(not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")))] +#[cfg(all( + not(target_os = "windows"), + not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")) +))] #[global_allocator] static GLOBAL: profiling::allocator::TracingAllocator = profiling::allocator::TracingAllocator::new(mimalloc::MiMalloc); +#[cfg(target_os = "windows")] +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + fn main() { let runtime = server::get_tokio_runtime_builder() .build() diff --git a/rustfs/src/profiling.rs b/rustfs/src/profiling.rs index 9d2699f2c..29688e33d 100644 --- a/rustfs/src/profiling.rs +++ b/rustfs/src/profiling.rs @@ -12,10 +12,42 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[cfg(not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")))] +#[cfg(all( + not(target_os = "windows"), + not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")) +))] pub mod allocator; -#[cfg(not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")))] +#[cfg(target_os = "windows")] +mod windows_impl { + use std::path::PathBuf; + use std::time::Duration; + use tracing::info; + + pub async fn init_from_env() { + info!("Profiling initialization skipped on Windows platform (not supported)"); + } + + /// Stop all background profiling tasks + pub fn shutdown_profiling() { + info!("profiling: shutdown called on Windows platform (no-op)"); + } + + pub async fn dump_cpu_pprof_for(_duration: Duration) -> Result { + Err("CPU profiling is not supported on Windows platform".to_string()) + } + + pub async fn dump_memory_pprof_now() -> Result { + Err("Memory profiling is not supported on Windows platform".to_string()) + } +} +#[cfg(target_os = "windows")] +pub use windows_impl::{dump_cpu_pprof_for, dump_memory_pprof_now, init_from_env, shutdown_profiling}; + +#[cfg(all( + not(target_os = "windows"), + not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")) +))] mod generic_impl { use super::allocator; use rustfs_config::{ @@ -123,7 +155,10 @@ mod generic_impl { } } -#[cfg(not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")))] +#[cfg(all( + not(target_os = "windows"), + not(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64")) +))] pub use generic_impl::{dump_cpu_pprof_for, dump_memory_pprof_now, init_from_env, shutdown_profiling}; #[cfg(all(target_os = "linux", target_env = "gnu", target_arch = "x86_64"))]