Skip to content

Commit cad339d

Browse files
committed
test: make locator cache none-result test deterministic (PR #419)
1 parent 7992a74 commit cad339d

1 file changed

Lines changed: 12 additions & 41 deletions

File tree

crates/pet-core/src/cache.rs

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -373,50 +373,21 @@ mod tests {
373373

374374
#[test]
375375
fn test_cache_get_or_insert_with_shares_concurrent_none_result() {
376-
let cache: Arc<LocatorCache<String, i32>> = Arc::new(LocatorCache::new());
377-
let barrier = Arc::new(Barrier::new(3));
378-
let calls = Arc::new(AtomicUsize::new(0));
379-
let (started_tx, started_rx) = mpsc::channel();
380-
let (release_tx, release_rx) = mpsc::channel();
381-
let release_rx = Arc::new(Mutex::new(release_rx));
382-
let mut handles = vec![];
383-
384-
for _ in 0..2 {
385-
let cache = cache.clone();
386-
let barrier = barrier.clone();
387-
let calls = calls.clone();
388-
let started_tx = started_tx.clone();
389-
let release_rx = release_rx.clone();
390-
handles.push(thread::spawn(move || {
391-
barrier.wait();
392-
cache.get_or_insert_with("key".to_string(), || {
393-
calls.fetch_add(1, Ordering::SeqCst);
394-
started_tx.send(()).unwrap();
395-
release_rx
396-
.lock()
397-
.unwrap()
398-
.recv_timeout(Duration::from_secs(5))
399-
.unwrap();
400-
None
401-
})
402-
}));
403-
}
404-
405-
barrier.wait();
406-
started_rx.recv_timeout(Duration::from_secs(5)).unwrap();
407-
assert_eq!(calls.load(Ordering::SeqCst), 1);
408-
assert!(started_rx.try_recv().is_err());
376+
let entry = Arc::new(InFlightEntry::new());
377+
let waiter_entry = entry.clone();
378+
let waiter =
379+
thread::spawn(move || LocatorCache::<String, i32>::wait_for_in_flight(waiter_entry));
409380

410-
release_tx.send(()).unwrap();
411-
release_tx.send(()).unwrap();
381+
*entry
382+
.result
383+
.lock()
384+
.expect("locator cache in-flight result lock poisoned") = Some(None);
385+
entry.changed.notify_all();
412386

413-
let results = handles
414-
.into_iter()
415-
.map(|handle| handle.join().unwrap())
416-
.collect::<Vec<_>>();
387+
assert_eq!(waiter.join().unwrap(), None);
417388

418-
assert_eq!(results, vec![None, None]);
419-
assert_eq!(calls.load(Ordering::SeqCst), 1);
389+
let cache: LocatorCache<String, i32> = LocatorCache::new();
390+
assert_eq!(cache.get_or_insert_with("key".to_string(), || None), None);
420391
assert!(!cache.contains_key(&"key".to_string()));
421392

422393
assert_eq!(

0 commit comments

Comments
 (0)