From 46e9b522fdbc14184539c57d3ba0380a7d7aa69f Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Thu, 25 May 2017 16:12:16 +0200 Subject: [PATCH] Make BoundedFrequencyRunner Run() really non-blocking --- pkg/util/async/bounded_frequency_runner.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pkg/util/async/bounded_frequency_runner.go b/pkg/util/async/bounded_frequency_runner.go index 531ac2cfee..da6fc2a4f8 100644 --- a/pkg/util/async/bounded_frequency_runner.go +++ b/pkg/util/async/bounded_frequency_runner.go @@ -151,7 +151,7 @@ func construct(name string, fn func(), minInterval, maxInterval time.Duration, b fn: fn, minInterval: minInterval, maxInterval: maxInterval, - run: make(chan struct{}, 16), + run: make(chan struct{}, 1), timer: timer, } if minInterval == 0 { @@ -185,8 +185,18 @@ func (bfr *BoundedFrequencyRunner) Loop(stop <-chan struct{}) { // Run the function as soon as possible. If this is called while Loop is not // running, the call may be deferred indefinitely. +// If there is already a queued request to call the underlying function, it +// may be dropped - it is just guaranteed that we will try calling the +// underlying function as soon as possible starting from now. func (bfr *BoundedFrequencyRunner) Run() { - bfr.run <- struct{}{} + // If it takes a lot of time to run the underlying function, noone is really + // processing elements from channel. So to avoid blocking here on the + // putting element to it, we simply skip it if there is already an element + // in it. + select { + case bfr.run <- struct{}{}: + default: + } } // assumes the lock is not held