diff --git a/unified-scheduler-pool/src/lib.rs b/unified-scheduler-pool/src/lib.rs index 49926bdd53b0da..3e8f6532983812 100644 --- a/unified-scheduler-pool/src/lib.rs +++ b/unified-scheduler-pool/src/lib.rs @@ -2869,10 +2869,8 @@ mod tests { } const SHORTENED_POOL_CLEANER_INTERVAL: Duration = Duration::from_millis(1); - const SHORTENED_MAX_POOLING_DURATION: Duration = Duration::from_millis(100); #[test] - #[ignore] fn test_scheduler_drop_idle() { agave_logger::setup(); @@ -2883,6 +2881,15 @@ mod tests { &TestCheckPoint::AfterIdleSchedulerCleaned, ]); + // Use 300ms pooling duration as a balance between: + // - Keeping the test fast (as small as possible) + // - Providing a large enough window to avoid the race condition where the second + // scheduler could also be freed before we can assert only one remains + const TEST_MAX_POOLING_DURATION_MS: u64 = 300; + const TEST_MAX_POOLING_DURATION: Duration = + Duration::from_millis(TEST_MAX_POOLING_DURATION_MS); + const TEST_WAIT_FOR_IDLE_MS: u64 = TEST_MAX_POOLING_DURATION_MS + 200; + const TEST_WAIT_FOR_IDLE: Duration = Duration::from_millis(TEST_WAIT_FOR_IDLE_MS); let ignored_prioritization_fee_cache = Arc::new(PrioritizationFeeCache::new(0u64)); let pool_raw = DefaultSchedulerPool::do_new( None, @@ -2891,7 +2898,7 @@ mod tests { None, ignored_prioritization_fee_cache, SHORTENED_POOL_CLEANER_INTERVAL, - SHORTENED_MAX_POOLING_DURATION, + TEST_MAX_POOLING_DURATION, DEFAULT_MAX_USAGE_QUEUE_COUNT, DEFAULT_TIMEOUT_DURATION, ); @@ -2905,8 +2912,9 @@ mod tests { let new_scheduler_id = new_scheduler.id(); Box::new(old_scheduler.into_inner().1).return_to_pool(); - // sleepless_testing can't be used; wait a bit here to see real progress of wall time... - sleep(SHORTENED_MAX_POOLING_DURATION * 10); + // Wait for old_scheduler to be considered idle by the cleaner. + sleep(TEST_WAIT_FOR_IDLE); + Box::new(new_scheduler.into_inner().1).return_to_pool(); // Block solScCleaner until we see returned schedlers... @@ -2916,12 +2924,8 @@ mod tests { // See the old (= idle) scheduler gone only after solScCleaner did its job... sleepless_testing::at(&TestCheckPoint::AfterIdleSchedulerCleaned); - // The following assertion is racy. - // - // We need to make sure new_scheduler isn't treated as idle up to now since being returned - // to the pool after sleep(SHORTENED_MAX_POOLING_DURATION * 10). - // Removing only old_scheduler is the expected behavior. So, make - // SHORTENED_MAX_POOLING_DURATION rather long... + // Only new_scheduler should remain. old_scheduler exceeds the + // TEST_MAX_POOLING_DURATION idle threshold, while new_scheduler does not. assert_eq!(pool_raw.scheduler_inners.lock().unwrap().len(), 1); assert_eq!( pool_raw @@ -3012,6 +3016,7 @@ mod tests { #[test] fn test_scheduler_drop_stale() { + const SHORTENED_MAX_POOLING_DURATION: Duration = Duration::from_millis(100); agave_logger::setup(); let _progress = sleepless_testing::setup(&[