make test less flanky, try to avoid absolute comparisions and compare jobs relative.

This commit is contained in:
Marcel Märtens 2021-04-05 15:50:44 +02:00
parent 278b64deab
commit 5f2b44002e

View File

@ -73,7 +73,7 @@ impl InternalSlowJobPool {
fn maintain(&self) {
let jobs_available =
self.global_limit as i64 - self.global_running_jobs.load(Ordering::Relaxed);
self.global_limit as i64 - self.global_running_jobs.load(Ordering::SeqCst);
if jobs_available < 0 {
tracing::warn!(?jobs_available, "Some math is wrong in slowjob code");
}
@ -104,7 +104,7 @@ impl InternalSlowJobPool {
let c = lock.get(&name).unwrap();
(
name,
c.spawned_total.load(Ordering::Relaxed) / c.max_local,
c.spawned_total.load(Ordering::SeqCst) / c.max_local,
c.max_local,
)
})
@ -122,7 +122,7 @@ impl InternalSlowJobPool {
};
if let Some(queue) = map.remove(&firstkey) {
if queue.local_running_jobs.load(Ordering::Relaxed) < *max as i64 {
if queue.local_running_jobs.load(Ordering::SeqCst) < *max as i64 {
self.fire(queue);
} else {
map.insert(firstkey, queue);
@ -134,9 +134,9 @@ impl InternalSlowJobPool {
}
fn fire(&self, queue: Queue) {
queue.spawned_total.fetch_add(1, Ordering::Relaxed);
queue.local_running_jobs.fetch_add(1, Ordering::Relaxed);
self.global_running_jobs.fetch_add(1, Ordering::Relaxed);
queue.spawned_total.fetch_add(1, Ordering::SeqCst);
queue.local_running_jobs.fetch_add(1, Ordering::SeqCst);
self.global_running_jobs.fetch_add(1, Ordering::SeqCst);
self.threadpool.spawn(queue.task);
}
}
@ -167,7 +167,7 @@ impl SlowJobPool {
where
F: FnOnce() + Send + Sync + 'static,
{
let id = self.internal.next_id.fetch_add(1, Ordering::Relaxed);
let id = self.internal.next_id.fetch_add(1, Ordering::SeqCst);
self.internal
.queue
.write()
@ -208,8 +208,8 @@ impl SlowJobPool {
task: Box::new(move || {
common_base::prof_span!(_guard, &_name_clones);
f();
local_running_jobs_clone.fetch_sub(1, Ordering::Relaxed);
global_running_jobs_clone.fetch_sub(1, Ordering::Relaxed);
local_running_jobs_clone.fetch_sub(1, Ordering::SeqCst);
global_running_jobs_clone.fetch_sub(1, Ordering::SeqCst);
// directly maintain the next task afterwards
internal.maintain();
}),
@ -291,13 +291,22 @@ mod tests {
let f6 = measure(f6, start);
let f7 = measure(f7, start);
assert_eq!(done.load(Ordering::Relaxed), 7);
assert!(f1 < 500);
assert!(f2 < 500);
assert!(f3 < 500);
assert!(f4 < 1000);
assert!(f5 < 1000);
assert!(f6 < 1000);
assert!(f7 < 1500);
// Just test relative times, not absolute
assert!(f1 < f4);
assert!(f1 < f5);
assert!(f1 < f6);
assert!(f1 < f7);
assert!(f2 < f4);
assert!(f2 < f5);
assert!(f2 < f6);
assert!(f2 < f7);
assert!(f3 < f4);
assert!(f3 < f5);
assert!(f3 < f6);
assert!(f3 < f7);
assert!(f4 < f7);
assert!(f5 < f7);
assert!(f6 < f7);
}
#[test]
@ -338,13 +347,21 @@ mod tests {
let f6 = measure(f6, start);
let f7 = measure(f7, start);
assert_eq!(done.load(Ordering::Relaxed), 7);
assert!(f1 < 500);
assert!(f2 < 500);
assert!(f3 < 500);
assert!(f4 < 1000);
assert!(f5 < 1000);
assert!(f6 < 1000);
assert!(f7 < 1500);
assert!(f1 < f4);
assert!(f1 < f5);
assert!(f1 < f6);
assert!(f1 < f7);
assert!(f2 < f4);
assert!(f2 < f5);
assert!(f2 < f6);
assert!(f2 < f7);
assert!(f3 < f4);
assert!(f3 < f5);
assert!(f3 < f6);
assert!(f3 < f7);
assert!(f4 < f7);
assert!(f5 < f7);
assert!(f6 < f7);
}
#[test]
@ -356,12 +373,12 @@ mod tests {
let pool = SlowJobPool::new(2, Arc::new(threadpool));
pool.configure("FOO", |n| n);
pool.configure("BAR", |n| n / 2);
let start = Instant::now();
let f1 = Arc::new(Mutex::new(None));
let f2 = Arc::new(Mutex::new(None));
let b1 = Arc::new(Mutex::new(None));
let b2 = Arc::new(Mutex::new(None));
let done = Arc::new(AtomicI64::new(0));
let start = Instant::now();
pool.spawn("FOO", mock_fn("foo1", &f1, &done));
pool.spawn("FOO", mock_fn("foo2", &f2, &done));
std::thread::sleep(Duration::from_millis(1000));
@ -380,11 +397,13 @@ mod tests {
// [B1]
// [B2]
assert_eq!(done.load(Ordering::Relaxed), 4);
assert!(f1 < 500);
assert!(f2 < 500);
assert!(f1 < 600);
assert!(f2 < 600);
println!("b1 {}", b1);
println!("b2 {}", b2);
assert!((1000..1500).contains(&b1));
assert!((1500..2000).contains(&b2));
// would be to flanky:
//assert!((1000..1500).contains(&b1));
//assert!((1500..2000).contains(&b2));
assert!(b1 < b2);
}
}