From 9506aacdbc56d09aa17d4875cbcf32c028c1114a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Mon, 5 Apr 2021 15:50:44 +0200 Subject: [PATCH] make test less flanky, try to avoid absolute comparisions and compare jobs relative. --- common/src/slowjob.rs | 75 +++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/common/src/slowjob.rs b/common/src/slowjob.rs index fac0c98846..16186ddbd2 100644 --- a/common/src/slowjob.rs +++ b/common/src/slowjob.rs @@ -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); } }