From 8c7bb2d2508473fc83c7d6692699ce913a550ed9 Mon Sep 17 00:00:00 2001 From: mc-ditto Date: Tue, 14 Apr 2026 13:38:37 -0400 Subject: [PATCH 1/3] fix(registry): add large-thread-count feature to raise slab MAX_THREADS Adds a `large-thread-count` feature (off by default) that raises the sharded-slab MAX_THREADS limit from 4 096 to 131 072. This prevents tracing_subscriber from panicking on high-core nodes where large numbers of native threads are spawned (e.g. by the Ditto SDK in load-gen pods). When the feature is disabled the upstream default of 4 096 is used via the Config trait's default impl, so there is no behaviour change for existing consumers. Co-Authored-By: Claude Sonnet 4.6 --- tracing-subscriber/Cargo.toml | 3 +++ tracing-subscriber/src/registry/sharded.rs | 24 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tracing-subscriber/Cargo.toml b/tracing-subscriber/Cargo.toml index 807880b8cd..5822ddd922 100644 --- a/tracing-subscriber/Cargo.toml +++ b/tracing-subscriber/Cargo.toml @@ -31,6 +31,9 @@ env-filter = ["matchers", "regex", "once_cell", "tracing", "std", "thread_local" fmt = ["registry", "std"] ansi = ["fmt", "nu-ansi-term"] registry = ["sharded-slab", "thread_local", "std"] +# Raises the sharded-slab MAX_THREADS limit from 4 096 to 131 072. +# Enable on high-core nodes where many native threads are spawned. +large-thread-count = [] json = ["tracing-serde", "serde", "serde_json"] valuable = ["tracing-core/valuable", "valuable_crate", "valuable-serde", "tracing-serde/valuable"] # Enables support for local time when using the `time` crate timestamp diff --git a/tracing-subscriber/src/registry/sharded.rs b/tracing-subscriber/src/registry/sharded.rs index 544a5dc344..812c823c31 100644 --- a/tracing-subscriber/src/registry/sharded.rs +++ b/tracing-subscriber/src/registry/sharded.rs @@ -1,4 +1,20 @@ -use sharded_slab::{pool::Ref, Clear, Pool}; +use sharded_slab::{pool::Ref, Clear, Config, Pool}; + +/// Custom [`sharded_slab::Config`] for the span registry pool. +/// +/// When the `large-thread-count` feature is enabled, `MAX_THREADS` is raised +/// from the upstream default of 4 096 to 131 072, preventing panics on +/// high-core machines where large numbers of native threads are spawned. +/// When the feature is disabled the trait default (4 096) is used unchanged. +#[derive(Debug)] +struct SlabConfig; + +impl Config for SlabConfig { + /// 131 072 threads = 2^17. Only active with the `large-thread-count` + /// feature; otherwise falls back to the trait default of 4 096. + #[cfg(feature = "large-thread-count")] + const MAX_THREADS: usize = 131_072; +} use thread_local::ThreadLocal; use super::stack::SpanStack; @@ -90,7 +106,7 @@ use tracing_core::{ #[cfg_attr(docsrs, doc(cfg(all(feature = "registry", feature = "std"))))] #[derive(Debug)] pub struct Registry { - spans: Pool, + spans: Pool, current_spans: ThreadLocal>, next_filter_id: u8, } @@ -109,7 +125,7 @@ pub struct Registry { #[derive(Debug)] pub struct Data<'a> { /// Immutable reference to the pooled `DataInner` entry. - inner: Ref<'a, DataInner>, + inner: Ref<'a, DataInner, SlabConfig>, } /// Stored data associated with a span. @@ -180,7 +196,7 @@ pub(crate) struct CloseGuard<'a> { } impl Registry { - fn get(&self, id: &Id) -> Option> { + fn get(&self, id: &Id) -> Option> { self.spans.get(id_to_idx(id)) } From 19c1fd9107aefa19f2391b54c1a24d250a16d088 Mon Sep 17 00:00:00 2001 From: mc-ditto Date: Tue, 14 Apr 2026 13:52:44 -0400 Subject: [PATCH 2/3] test(registry): assert SlabConfig MAX_THREADS when large-thread-count enabled Co-Authored-By: Claude Sonnet 4.6 --- tracing-subscriber/src/registry/sharded.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tracing-subscriber/src/registry/sharded.rs b/tracing-subscriber/src/registry/sharded.rs index 812c823c31..252b297c86 100644 --- a/tracing-subscriber/src/registry/sharded.rs +++ b/tracing-subscriber/src/registry/sharded.rs @@ -921,4 +921,13 @@ mod tests { state.assert_closed_in_order(["child", "parent", "grandparent"]); }); } + + #[cfg(feature = "large-thread-count")] + #[test] + fn large_thread_count_raises_max_threads() { + assert_eq!(SlabConfig::MAX_THREADS, 131_072); + // Confirm the registry pool is parameterised on SlabConfig at the type + // level — this is a compile-time check dressed as a runtime test. + let _: &Pool = &Pool::new(); + } } From 2f485256d785a4e4007c7c45da616b3057cf2824 Mon Sep 17 00:00:00 2001 From: mc-ditto Date: Tue, 14 Apr 2026 13:55:49 -0400 Subject: [PATCH 3/3] fix(registry): use Pool::new_with_config for SlabConfig; fix test Pool init Co-Authored-By: Claude Sonnet 4.6 --- tracing-subscriber/src/registry/sharded.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracing-subscriber/src/registry/sharded.rs b/tracing-subscriber/src/registry/sharded.rs index 252b297c86..14549ee19c 100644 --- a/tracing-subscriber/src/registry/sharded.rs +++ b/tracing-subscriber/src/registry/sharded.rs @@ -151,7 +151,7 @@ struct DataInner { impl Default for Registry { fn default() -> Self { Self { - spans: Pool::new(), + spans: Pool::new_with_config::(), current_spans: ThreadLocal::new(), next_filter_id: 0, } @@ -928,6 +928,6 @@ mod tests { assert_eq!(SlabConfig::MAX_THREADS, 131_072); // Confirm the registry pool is parameterised on SlabConfig at the type // level — this is a compile-time check dressed as a runtime test. - let _: &Pool = &Pool::new(); + let _: &Pool = &Pool::new_with_config::(); } }