Ver Fonte

Revert "Thread manager instantiation in the validator (#4603)" (#5132)

This reverts commit e48672c122baf62e936d4d489d20ff7ad7ba53f9.
steviez há 8 meses atrás
pai
commit
30c95ff6e8

+ 0 - 1
Cargo.lock

@@ -7202,7 +7202,6 @@ name = "solana-core"
 version = "2.3.0"
 dependencies = [
  "agave-banking-stage-ingress-types",
- "agave-thread-manager",
  "agave-transaction-view",
  "ahash 0.8.11",
  "anyhow",

+ 0 - 1
core/Cargo.toml

@@ -15,7 +15,6 @@ codecov = { repository = "solana-labs/solana", branch = "master", service = "git
 
 [dependencies]
 agave-banking-stage-ingress-types = { workspace = true }
-agave-thread-manager = { workspace = true }
 agave-transaction-view = { workspace = true }
 ahash = { workspace = true }
 anyhow = { workspace = true }

+ 0 - 7
core/src/validator.rs

@@ -30,7 +30,6 @@ use {
         tpu::{Tpu, TpuSockets, DEFAULT_TPU_COALESCE},
         tvu::{Tvu, TvuConfig, TvuSockets},
     },
-    agave_thread_manager::{ThreadManager, ThreadManagerConfig},
     anyhow::{anyhow, Context, Result},
     crossbeam_channel::{bounded, unbounded, Receiver},
     lazy_static::lazy_static,
@@ -315,7 +314,6 @@ pub struct ValidatorConfig {
     pub replay_forks_threads: NonZeroUsize,
     pub replay_transactions_threads: NonZeroUsize,
     pub tvu_shred_sigverify_threads: NonZeroUsize,
-    pub thread_manager_config: ThreadManagerConfig,
     pub delay_leader_block_for_pending_fork: bool,
 }
 
@@ -388,7 +386,6 @@ impl Default for ValidatorConfig {
             rayon_global_threads: NonZeroUsize::new(1).expect("1 is non-zero"),
             replay_forks_threads: NonZeroUsize::new(1).expect("1 is non-zero"),
             replay_transactions_threads: NonZeroUsize::new(1).expect("1 is non-zero"),
-            thread_manager_config: ThreadManagerConfig::default_for_agave(),
             tvu_shred_sigverify_threads: NonZeroUsize::new(1).expect("1 is non-zero"),
             delay_leader_block_for_pending_fork: false,
         }
@@ -592,7 +589,6 @@ pub struct Validator {
     repair_quic_endpoints: Option<[Endpoint; 3]>,
     repair_quic_endpoints_runtime: Option<TokioRuntime>,
     repair_quic_endpoints_join_handle: Option<repair::quic_endpoint::AsyncTryJoinHandle>,
-    thread_manager: ThreadManager,
 }
 
 impl Validator {
@@ -624,7 +620,6 @@ impl Validator {
 
         let start_time = Instant::now();
 
-        let thread_manager = ThreadManager::new(&config.thread_manager_config)?;
         // Initialize the global rayon pool first to ensure the value in config
         // is honored. Otherwise, some code accessing the global pool could
         // cause it to get initialized with Rayon's default (not ours)
@@ -1666,7 +1661,6 @@ impl Validator {
             repair_quic_endpoints,
             repair_quic_endpoints_runtime,
             repair_quic_endpoints_join_handle,
-            thread_manager,
         })
     }
 
@@ -1822,7 +1816,6 @@ impl Validator {
         self.poh_timing_report_service
             .join()
             .expect("poh_timing_report_service");
-        self.thread_manager.destroy();
     }
 }
 

+ 0 - 1
local-cluster/src/validator_configs.rs

@@ -73,7 +73,6 @@ pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig {
         replay_forks_threads: config.replay_forks_threads,
         replay_transactions_threads: config.replay_transactions_threads,
         tvu_shred_sigverify_threads: config.tvu_shred_sigverify_threads,
-        thread_manager_config: config.thread_manager_config.clone(),
         delay_leader_block_for_pending_fork: config.delay_leader_block_for_pending_fork,
     }
 }

+ 3 - 93
programs/sbf/Cargo.lock

@@ -63,18 +63,6 @@ dependencies = [
  "zeroize",
 ]
 
-[[package]]
-name = "affinity"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763e484feceb7dd021b21c5c6f81aee06b1594a743455ec7efbf72e6355e447b"
-dependencies = [
- "cfg-if 1.0.0",
- "errno",
- "libc",
- "num_cpus",
-]
-
 [[package]]
 name = "agave-banking-stage-ingress-types"
 version = "2.3.0"
@@ -95,23 +83,6 @@ dependencies = [
  "thiserror 2.0.11",
 ]
 
-[[package]]
-name = "agave-thread-manager"
-version = "2.3.0"
-dependencies = [
- "affinity",
- "anyhow",
- "cfg-if 1.0.0",
- "log",
- "num_cpus",
- "rayon",
- "serde",
- "solana-metrics",
- "thread-priority",
- "tokio",
- "toml 0.8.12",
-]
-
 [[package]]
 name = "agave-transaction-view"
 version = "2.3.0"
@@ -3924,7 +3895,7 @@ version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
 dependencies = [
- "toml 0.5.11",
+ "toml",
 ]
 
 [[package]]
@@ -3933,7 +3904,7 @@ version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
 dependencies = [
- "toml_edit 0.21.1",
+ "toml_edit",
 ]
 
 [[package]]
@@ -4789,15 +4760,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "serde_spanned"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
-dependencies = [
- "serde",
-]
-
 [[package]]
 name = "serde_urlencoded"
 version = "0.7.1"
@@ -5722,7 +5684,6 @@ name = "solana-core"
 version = "2.3.0"
 dependencies = [
  "agave-banking-stage-ingress-types",
- "agave-thread-manager",
  "agave-transaction-view",
  "ahash 0.8.11",
  "anyhow",
@@ -9855,20 +9816,6 @@ dependencies = [
  "syn 2.0.87",
 ]
 
-[[package]]
-name = "thread-priority"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfe075d7053dae61ac5413a34ea7d4913b6e6207844fd726bdd858b37ff72bf5"
-dependencies = [
- "bitflags 2.8.0",
- "cfg-if 1.0.0",
- "libc",
- "log",
- "rustversion",
- "winapi 0.3.9",
-]
-
 [[package]]
 name = "thread_local"
 version = "1.1.8"
@@ -10113,26 +10060,11 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "toml"
-version = "0.8.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit 0.22.12",
-]
-
 [[package]]
 name = "toml_datetime"
 version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
-dependencies = [
- "serde",
-]
 
 [[package]]
 name = "toml_edit"
@@ -10142,20 +10074,7 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
 dependencies = [
  "indexmap 2.7.1",
  "toml_datetime",
- "winnow 0.5.25",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
-dependencies = [
- "indexmap 2.7.1",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "winnow 0.6.24",
+ "winnow",
 ]
 
 [[package]]
@@ -10919,15 +10838,6 @@ dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "winnow"
-version = "0.6.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a"
-dependencies = [
- "memchr",
-]
-
 [[package]]
 name = "winreg"
 version = "0.50.0"

+ 1 - 71
svm/examples/Cargo.lock

@@ -63,18 +63,6 @@ dependencies = [
  "zeroize",
 ]
 
-[[package]]
-name = "affinity"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763e484feceb7dd021b21c5c6f81aee06b1594a743455ec7efbf72e6355e447b"
-dependencies = [
- "cfg-if 1.0.0",
- "errno",
- "libc",
- "num_cpus",
-]
-
 [[package]]
 name = "agave-banking-stage-ingress-types"
 version = "2.3.0"
@@ -95,23 +83,6 @@ dependencies = [
  "thiserror 2.0.11",
 ]
 
-[[package]]
-name = "agave-thread-manager"
-version = "2.3.0"
-dependencies = [
- "affinity",
- "anyhow",
- "cfg-if 1.0.0",
- "log",
- "num_cpus",
- "rayon",
- "serde",
- "solana-metrics",
- "thread-priority",
- "tokio",
- "toml 0.8.19",
-]
-
 [[package]]
 name = "agave-transaction-view"
 version = "2.3.0"
@@ -3807,7 +3778,7 @@ version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
 dependencies = [
- "toml 0.5.11",
+ "toml",
 ]
 
 [[package]]
@@ -4653,15 +4624,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "serde_spanned"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
-dependencies = [
- "serde",
-]
-
 [[package]]
 name = "serde_urlencoded"
 version = "0.7.1"
@@ -5575,7 +5537,6 @@ name = "solana-core"
 version = "2.3.0"
 dependencies = [
  "agave-banking-stage-ingress-types",
- "agave-thread-manager",
  "agave-transaction-view",
  "ahash 0.8.11",
  "anyhow",
@@ -9184,20 +9145,6 @@ dependencies = [
  "syn 2.0.96",
 ]
 
-[[package]]
-name = "thread-priority"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfe075d7053dae61ac5413a34ea7d4913b6e6207844fd726bdd858b37ff72bf5"
-dependencies = [
- "bitflags 2.8.0",
- "cfg-if 1.0.0",
- "libc",
- "log",
- "rustversion",
- "winapi 0.3.9",
-]
-
 [[package]]
 name = "thread_local"
 version = "1.1.8"
@@ -9422,26 +9369,11 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "toml"
-version = "0.8.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit",
-]
-
 [[package]]
 name = "toml_datetime"
 version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
-dependencies = [
- "serde",
-]
 
 [[package]]
 name = "toml_edit"
@@ -9450,8 +9382,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
 dependencies = [
  "indexmap 2.7.1",
- "serde",
- "serde_spanned",
  "toml_datetime",
  "winnow",
 ]

+ 1 - 1
thread-manager/Cargo.toml

@@ -19,7 +19,6 @@ serde = { workspace = true, features = ["derive"] }
 solana-metrics = { workspace = true }
 thread-priority = { workspace = true }
 tokio = { workspace = true, features = ["time", "rt-multi-thread"] }
-toml = { workspace = true }
 
 [target.'cfg(target_os = "linux")'.dependencies]
 affinity = "0.1.2"
@@ -30,6 +29,7 @@ axum = { workspace = true }
 env_logger = { workspace = true }
 hyper = { workspace = true, features = ["http1", "client", "stream", "tcp"] }
 serde_json = { workspace = true }
+toml = { workspace = true }
 tower = { workspace = true }
 
 [features]

+ 1 - 1
thread-manager/examples/core_contention_basics.rs

@@ -24,7 +24,7 @@ fn main() -> anyhow::Result<()> {
         std::fs::File::open(conf_file)?.read_to_string(&mut buf)?;
         let cfg: ThreadManagerConfig = toml::from_str(&buf)?;
 
-        let manager = ThreadManager::new(&cfg).unwrap();
+        let manager = ThreadManager::new(cfg).unwrap();
         let tokio1 = manager.get_tokio("axum1");
         tokio1.start_metrics_sampling(Duration::from_secs(1));
         let tokio2 = manager.get_tokio("axum2");

+ 3 - 3
thread-manager/examples/core_contention_sweep.rs

@@ -76,15 +76,15 @@ fn main() -> anyhow::Result<()> {
             info!("Running {core_count} cores under {regime:?}");
             let (tokio1, tokio2) = match regime {
                 Regime::Shared => {
-                    manager = ThreadManager::new(&make_config_shared(core_count)).unwrap();
+                    manager = ThreadManager::new(make_config_shared(core_count)).unwrap();
                     (manager.get_tokio("axum1"), manager.get_tokio("axum2"))
                 }
                 Regime::Dedicated => {
-                    manager = ThreadManager::new(&make_config_dedicated(core_count)).unwrap();
+                    manager = ThreadManager::new(make_config_dedicated(core_count)).unwrap();
                     (manager.get_tokio("axum1"), manager.get_tokio("axum2"))
                 }
                 Regime::Single => {
-                    manager = ThreadManager::new(&make_config_shared(core_count)).unwrap();
+                    manager = ThreadManager::new(make_config_shared(core_count)).unwrap();
                     (manager.get_tokio("axum1"), manager.get_tokio("axum2"))
                 }
             };

+ 0 - 70
thread-manager/src/config.rs

@@ -1,70 +0,0 @@
-use {
-    crate::{CoreAllocation, NativeConfig, RayonConfig, TokioConfig},
-    serde::{Deserialize, Serialize},
-    std::collections::HashMap,
-    toml::de::Error,
-};
-
-#[derive(Clone, Debug, Serialize, Deserialize)]
-#[serde(default)]
-pub struct ThreadManagerConfig {
-    /// Configurations for the native OS thread pools
-    pub native_configs: HashMap<String, NativeConfig>,
-    /// Mapping from lookup name to the config name for Native
-    pub native_runtime_mapping: HashMap<String, String>,
-
-    /// Configurations for the rayon runtimes
-    pub rayon_configs: HashMap<String, RayonConfig>,
-    /// Mapping from lookup name to the config name for Rayon
-    pub rayon_runtime_mapping: HashMap<String, String>,
-
-    /// Configurations for the Tokio runtimes
-    pub tokio_configs: HashMap<String, TokioConfig>,
-    /// Mapping from lookup name to the config name for Tokio
-    pub tokio_runtime_mapping: HashMap<String, String>,
-
-    pub default_core_allocation: CoreAllocation,
-}
-
-impl Default for ThreadManagerConfig {
-    // Default is mostly to keep Deserialize implementation happy. This is not intended to be a valid config
-    fn default() -> Self {
-        Self {
-            native_configs: HashMap::from([("default".to_owned(), NativeConfig::default())]),
-            native_runtime_mapping: HashMap::new(),
-            rayon_configs: HashMap::from([("default".to_owned(), RayonConfig::default())]),
-            rayon_runtime_mapping: HashMap::new(),
-            tokio_configs: HashMap::from([("default".to_owned(), TokioConfig::default())]),
-            tokio_runtime_mapping: HashMap::new(),
-            default_core_allocation: CoreAllocation::OsDefault,
-        }
-    }
-}
-
-impl ThreadManagerConfig {
-    /// Returns a valid "built-in" configuration for Agave that is safe to use in most cases.
-    /// Most operators will likely use this.
-    pub fn default_for_agave() -> Self {
-        let config_str = include_str!("default_config.toml");
-        toml::from_str(config_str).expect("Parsing the built-in config should never fail")
-    }
-
-    /// Loads configuration from a given str, filling in the gaps from what default_for_agave returns
-    pub fn from_toml_str(toml: &str) -> Result<Self, Error> {
-        let mut loaded: ThreadManagerConfig = toml::from_str(toml)?;
-        let mut result = Self::default_for_agave();
-        macro_rules! upsert {
-            ($name:ident) => {
-                result.$name.extend(loaded.$name.drain());
-            };
-        }
-        upsert!(native_configs);
-        upsert!(native_runtime_mapping);
-        upsert!(rayon_configs);
-        upsert!(rayon_runtime_mapping);
-        upsert!(tokio_configs);
-        upsert!(tokio_runtime_mapping);
-        result.default_core_allocation = loaded.default_core_allocation;
-        Ok(result)
-    }
-}

+ 0 - 1
thread-manager/src/default_config.toml

@@ -1 +0,0 @@
-# This is deliberately left empty to populate as integration process proceeds.

+ 40 - 41
thread-manager/src/lib.rs

@@ -1,27 +1,22 @@
 use {
-    log::{debug, error, warn},
-    std::{
-        collections::HashMap,
-        ops::Deref,
-        sync::{atomic::Ordering, Arc},
-    },
+    anyhow::Ok,
+    serde::{Deserialize, Serialize},
+    std::{collections::HashMap, ops::Deref, sync::Arc},
 };
 
-pub mod config;
 pub mod native_thread_runtime;
 pub mod policy;
 pub mod rayon_runtime;
 pub mod tokio_runtime;
 
 pub use {
-    config::ThreadManagerConfig,
     native_thread_runtime::{JoinHandle, NativeConfig, NativeThreadRuntime},
     policy::CoreAllocation,
     rayon_runtime::{RayonConfig, RayonRuntime},
     tokio_runtime::{TokioConfig, TokioRuntime},
 };
 
-pub const MAX_THREAD_NAME_CHARS: usize = 16;
+pub const MAX_THREAD_NAME_CHARS: usize = 12;
 
 #[derive(Default, Debug)]
 pub struct ThreadManagerInner {
@@ -79,6 +74,35 @@ impl Deref for ThreadManager {
     }
 }
 
+#[derive(Clone, Debug, Serialize, Deserialize)]
+#[serde(default)]
+pub struct ThreadManagerConfig {
+    pub native_configs: HashMap<String, NativeConfig>,
+    pub native_runtime_mapping: HashMap<String, String>,
+
+    pub rayon_configs: HashMap<String, RayonConfig>,
+    pub rayon_runtime_mapping: HashMap<String, String>,
+
+    pub tokio_configs: HashMap<String, TokioConfig>,
+    pub tokio_runtime_mapping: HashMap<String, String>,
+
+    pub default_core_allocation: CoreAllocation,
+}
+
+impl Default for ThreadManagerConfig {
+    fn default() -> Self {
+        Self {
+            native_configs: HashMap::from([("default".to_owned(), NativeConfig::default())]),
+            native_runtime_mapping: HashMap::new(),
+            rayon_configs: HashMap::from([("default".to_owned(), RayonConfig::default())]),
+            rayon_runtime_mapping: HashMap::new(),
+            tokio_configs: HashMap::from([("default".to_owned(), TokioConfig::default())]),
+            tokio_runtime_mapping: HashMap::new(),
+            default_core_allocation: CoreAllocation::OsDefault,
+        }
+    }
+}
+
 impl ThreadManager {
     /// Will lookup a runtime by given name. If not found, will try to lookup by name "default". If all fails, returns None.
     fn lookup<'a, T>(
@@ -91,7 +115,7 @@ impl ThreadManager {
             Some(n) => runtimes.get(n),
             None => match mapping.get("default") {
                 Some(n) => {
-                    warn!("Falling back to default runtime for {name}");
+                    log::warn!("Falling back to default runtime for {name}");
                     runtimes.get(n)
                 }
                 None => None,
@@ -144,11 +168,11 @@ impl ThreadManager {
         Ok(chosen_cores_mask)
     }
 
-    pub fn new(config: &ThreadManagerConfig) -> anyhow::Result<Self> {
+    pub fn new(config: ThreadManagerConfig) -> anyhow::Result<Self> {
         let mut core_allocations = HashMap::<String, Vec<usize>>::new();
-        Self::set_process_affinity(config)?;
+        Self::set_process_affinity(&config)?;
         let mut manager = ThreadManagerInner::default();
-        manager.populate_mappings(config);
+        manager.populate_mappings(&config);
         for (name, cfg) in config.native_configs.iter() {
             let nrt = NativeThreadRuntime::new(name.clone(), cfg.clone());
             manager.native_thread_runtimes.insert(name.clone(), nrt);
@@ -168,31 +192,6 @@ impl ThreadManager {
             inner: Arc::new(manager),
         })
     }
-
-    pub fn destroy(self) {
-        let Ok(mut inner) = Arc::try_unwrap(self.inner) else {
-            error!(
-                      "References to Thread Manager are still active, clean shutdown may not be possible!"
-                  );
-            return;
-        };
-
-        for (name, runtime) in inner.tokio_runtimes.drain() {
-            let active_cnt = runtime.counters.active_threads_cnt.load(Ordering::SeqCst);
-            match active_cnt {
-                0 => debug!("Shutting down Tokio runtime {name}"),
-                _ => warn!("Tokio runtime {name} has active workers during shutdown!"),
-            }
-            runtime.tokio.shutdown_background();
-        }
-        for (name, runtime) in inner.native_thread_runtimes.drain() {
-            let active_cnt = runtime.running_count.load(Ordering::SeqCst);
-            match active_cnt {
-                0 => debug!("Shutting down Native thread pool {name}"),
-                _ => warn!("Native pool {name} has active threads during shutdown!"),
-            }
-        }
-    }
 }
 
 #[cfg(test)]
@@ -263,7 +262,7 @@ mod tests {
             ..Default::default()
         };
 
-        let manager = ThreadManager::new(&conf).unwrap();
+        let manager = ThreadManager::new(conf).unwrap();
         let high = manager.get_native("high");
         let low = manager.get_native("low");
         let default = manager.get_native("default");
@@ -324,7 +323,7 @@ mod tests {
             ..Default::default()
         };
 
-        let manager = ThreadManager::new(&conf).unwrap();
+        let manager = ThreadManager::new(conf).unwrap();
         let runtime = manager.get_native("test");
 
         let thread1 = runtime
@@ -365,7 +364,7 @@ mod tests {
             ..Default::default()
         };
 
-        let manager = ThreadManager::new(&conf).unwrap();
+        let manager = ThreadManager::new(conf).unwrap();
         let rayon_runtime = manager.get_rayon("test");
 
         let _rr = rayon_runtime.rayon_pool.broadcast(|ctx| {

+ 1 - 1
thread-manager/src/native_thread_runtime.rs

@@ -103,7 +103,7 @@ impl<T> Drop for JoinHandle<T> {
 
 impl NativeThreadRuntime {
     pub fn new(name: String, cfg: NativeConfig) -> Self {
-        debug_assert!(name.len() <= MAX_THREAD_NAME_CHARS, "Thread name too long");
+        debug_assert!(name.len() < MAX_THREAD_NAME_CHARS, "Thread name too long");
         Self {
             inner: Arc::new(NativeThreadRuntimeInner {
                 id_count: AtomicUsize::new(0),

+ 1 - 1
thread-manager/src/rayon_runtime.rs

@@ -62,7 +62,7 @@ impl Deref for RayonRuntime {
 
 impl RayonRuntime {
     pub fn new(name: String, config: RayonConfig) -> anyhow::Result<Self> {
-        debug_assert!(name.len() <= MAX_THREAD_NAME_CHARS, "Thread name too long");
+        debug_assert!(name.len() < MAX_THREAD_NAME_CHARS, "Thread name too long");
         let core_allocation = config.core_allocation.clone();
         let chosen_cores_mask = Mutex::new(core_allocation.as_core_mask_vector());
         let priority = config.priority;

+ 1 - 1
thread-manager/src/tokio_runtime.rs

@@ -69,7 +69,7 @@ impl TokioRuntime {
     }
 
     pub fn new(name: String, cfg: TokioConfig) -> anyhow::Result<Self> {
-        debug_assert!(name.len() <= MAX_THREAD_NAME_CHARS, "Thread name too long");
+        debug_assert!(name.len() < MAX_THREAD_NAME_CHARS, "Thread name too long");
         let num_workers = if cfg.worker_threads == 0 {
             num_cpus::get()
         } else {