Skip to content

Commit

Permalink
Make BoundedFrequencyRunner Run() really non-blocking
Browse files Browse the repository at this point in the history
  • Loading branch information
wojtek-t committed May 25, 2017
1 parent 714ac7c commit 46e9b52
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions pkg/util/async/bounded_frequency_runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 <run> 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
Expand Down

0 comments on commit 46e9b52

Please sign in to comment.