diff --git a/Cargo.lock b/Cargo.lock index 67bc056297e1bf..c26ef2d1f71bcb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7614,6 +7614,7 @@ dependencies = [ "solana-runtime", "solana-sdk", "solana-unified-scheduler-logic", + "vec_extract_if_polyfill", ] [[package]] @@ -8984,6 +8985,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_extract_if_polyfill" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c9cb5fb67c2692310b6eb3fce7dd4b6e4c9a75be4f2f46b27f0b2b7799759c" + [[package]] name = "vec_map" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index 9f749422730117..c131bbc972335a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -438,6 +438,7 @@ trees = "0.4.2" tungstenite = "0.20.1" uriparse = "0.6.4" url = "2.5.0" +vec_extract_if_polyfill = "0.1.0" wasm-bindgen = "0.2" winapi = "0.3.8" winreg = "0.50" diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 7f7f33a445ac2b..9e2178df2d13ca 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6500,6 +6500,7 @@ dependencies = [ "solana-runtime", "solana-sdk", "solana-unified-scheduler-logic", + "vec_extract_if_polyfill", ] [[package]] @@ -7698,6 +7699,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_extract_if_polyfill" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c9cb5fb67c2692310b6eb3fce7dd4b6e4c9a75be4f2f46b27f0b2b7799759c" + [[package]] name = "vec_map" version = "0.8.2" diff --git a/unified-scheduler-pool/Cargo.toml b/unified-scheduler-pool/Cargo.toml index 69bf63e2be3806..6a46a32b271eac 100644 --- a/unified-scheduler-pool/Cargo.toml +++ b/unified-scheduler-pool/Cargo.toml @@ -21,6 +21,7 @@ solana-program-runtime = { workspace = true } solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-unified-scheduler-logic = { workspace = true } +vec_extract_if_polyfill = { workspace = true } [dev-dependencies] assert_matches = { workspace = true } diff --git a/unified-scheduler-pool/src/lib.rs b/unified-scheduler-pool/src/lib.rs index ec59259c58bfd7..870e137c592224 100644 --- a/unified-scheduler-pool/src/lib.rs +++ b/unified-scheduler-pool/src/lib.rs @@ -51,6 +51,7 @@ use { thread::{self, sleep, JoinHandle}, time::{Duration, Instant}, }, + vec_extract_if_polyfill::MakeExtractIf, }; mod sleepless_testing; @@ -171,29 +172,22 @@ where }; let idle_inner_count = { - let Ok(mut scheduler_inners) = scheduler_pool.scheduler_inners.lock() else { - break; - }; - let mut inners = mem::take(&mut *scheduler_inners); - drop(scheduler_inners); - let now = Instant::now(); - let old_inner_count = inners.len(); - // retain could take long time because it's dropping schedulers! - inners.retain(|(_inner, pooled_at)| { - now.duration_since(*pooled_at) <= max_pooling_duration - }); - let new_inner_count = inners.len(); - let Ok(mut scheduler_inners) = scheduler_pool.scheduler_inners.lock() else { break; }; - scheduler_inners.extend(inners); + // I want to use the fancy ::extract_if() no matter what.... + #[allow(unstable_name_collisions)] + let idle_inners = scheduler_inners + .extract_if(|(_inner, pooled_at)| { + now.duration_since(*pooled_at) > max_pooling_duration + }) + .collect::>(); drop(scheduler_inners); - old_inner_count - .checked_sub(new_inner_count) - .expect("new_inner_count isn't larger") + let idle_inner_count = idle_inners.len(); + drop(idle_inners); + idle_inner_count }; let trashed_inner_count = {