comparison rust/hg-core/src/utils.rs @ 50321:14b57943ae6d stable

rust: fix thread cap (for real this time) Both e2f8ed37201c and c52435820bbd failed to put a *default* ceiling on the number of threads used by Rayon to prevent a contention issue. Calling `rayon::available_parallelism()` creates the global threadpool, which made our whole dance useless last time.
author Rapha?l Gom?s <rgomes@octobus.net>
date Thu, 23 Mar 2023 19:10:15 +0100
parents a6b8b1ab9116
children 331a3cbe1c9e
comparison
equal deleted inserted replaced
50320:9c5e743e400c 50321:14b57943ae6d
496 iter.filter_map(move |result| match result { 496 iter.filter_map(move |result| match result {
497 Ok(node) => f(node).transpose(), 497 Ok(node) => f(node).transpose(),
498 Err(e) => Some(Err(e)), 498 Err(e) => Some(Err(e)),
499 }) 499 })
500 } 500 }
501
502 /// Force the global rayon threadpool to not exceed 16 concurrent threads
503 /// unless the user has specified a value.
504 /// This is a stop-gap measure until we figure out why using more than 16
505 /// threads makes `status` slower for each additional thread.
506 ///
507 /// TODO find the underlying cause and fix it, then remove this.
508 ///
509 /// # Errors
510 ///
511 /// Returns an error if the global threadpool has already been initialized if
512 /// we try to initialize it.
513 pub fn cap_default_rayon_threads() -> Result<(), rayon::ThreadPoolBuildError> {
514 const THREAD_CAP: usize = 16;
515
516 if std::env::var("RAYON_NUM_THREADS").is_err() {
517 let available_parallelism = std::thread::available_parallelism()
518 .map(usize::from)
519 .unwrap_or(1);
520 let new_thread_count = THREAD_CAP.min(available_parallelism);
521 let res = rayon::ThreadPoolBuilder::new()
522 .num_threads(new_thread_count)
523 .build_global();
524 if res.is_ok() {
525 log::trace!(
526 "Capped the rayon threadpool to {new_thread_count} threads",
527 );
528 }
529 return res;
530 }
531 Ok(())
532 }