From 8a5576d133a1c770bd4717235f77ba6aae0aafd2 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 5 Oct 2016 12:10:28 +0200 Subject: [PATCH] balance rates of draining and importing --- ethcore/src/verification/queue/mod.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ethcore/src/verification/queue/mod.rs b/ethcore/src/verification/queue/mod.rs index ac0dbf592..8c6b1e5ca 100644 --- a/ethcore/src/verification/queue/mod.rs +++ b/ethcore/src/verification/queue/mod.rs @@ -154,6 +154,7 @@ struct Verification { empty: SMutex<()>, verified_count: AtomicUsize, drained: AtomicUsize, + imported: AtomicUsize, } impl VerificationQueue { @@ -168,6 +169,7 @@ impl VerificationQueue { empty: SMutex::new(()), verified_count: AtomicUsize::new(0), drained: AtomicUsize::new(0), + imported: AtomicUsize::new(0), }); let more_to_verify = Arc::new(SCondvar::new()); let deleting = Arc::new(AtomicBool::new(false)); @@ -345,6 +347,7 @@ impl VerificationQueue { Ok(item) => { self.processing.write().insert(h.clone()); self.verification.unverified.lock().push_back(item); + self.verification.imported.fetch_add(1, AtomicOrdering::AcqRel); self.more_to_verify.notify_all(); Ok(h) }, @@ -463,9 +466,14 @@ impl VerificationQueue { let v_count = self.verification.verified_count.load(AtomicOrdering::Acquire); let drained = self.verification.drained.load(AtomicOrdering::Acquire); + let imported = self.verification.imported.load(AtomicOrdering::Acquire); self.verification.verified_count.store(0, AtomicOrdering::Release); self.verification.drained.store(0, AtomicOrdering::Release); + self.verification.imported.store(0, AtomicOrdering::Release); + + // select which side of the queue is the bottleneck. + let target = min(drained, imported); // compute the average rate of verification per thread and determine // how many are necessary to match the rate of draining. @@ -474,11 +482,11 @@ impl VerificationQueue { let needed = if v_count < 20 { 1 } else { - (drained as f64 / v_count_per as f64).ceil() as usize + (target as f64 / v_count_per as f64).ceil() as usize }; - trace!(target: "verification", "v_rate_per={}, drained={}, scaling to {} verifiers", - v_count_per, drained, needed); + trace!(target: "verification", "v_rate_per={}, target={}, scaling to {} verifiers", + v_count_per, target, needed); for _ in num_verifiers..needed { self.add_verifier();