-
Notifications
You must be signed in to change notification settings - Fork 40k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
routecontroller: Add wait.NonSlidingUntil, use it
Make sure the reconciliation loop kicks in again immediately if it takes a loooooong time.
- Loading branch information
Showing
4 changed files
with
60 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,9 +42,19 @@ func Forever(f func(), period time.Duration) { | |
} | ||
|
||
// Until loops until stop channel is closed, running f every period. | ||
// Until is syntactic sugar on top of JitterUntil with zero jitter factor | ||
// Until is syntactic sugar on top of JitterUntil with zero jitter | ||
// factor, with sliding = true (which means the timer for period | ||
// starts after the f completes). | ||
func Until(f func(), period time.Duration, stopCh <-chan struct{}) { | ||
JitterUntil(f, period, 0.0, stopCh) | ||
JitterUntil(f, period, 0.0, true, stopCh) | ||
} | ||
|
||
// NonSlidingUntil loops until stop channel is closed, running f every | ||
// period. NonSlidingUntil is syntactic sugar on top of JitterUntil | ||
// with zero jitter factor, with sliding = false (meaning the timer for | ||
// period starts at the same time as the function starts). | ||
func NonSlidingUntil(f func(), period time.Duration, stopCh <-chan struct{}) { | ||
JitterUntil(f, period, 0.0, false, stopCh) | ||
} | ||
|
||
// JitterUntil loops until stop channel is closed, running f every period. | ||
|
@@ -53,28 +63,45 @@ func Until(f func(), period time.Duration, stopCh <-chan struct{}) { | |
// Catches any panics, and keeps going. f may not be invoked if | ||
// stop channel is already closed. Pass NeverStop to Until if you | ||
// don't want it stop. | ||
func JitterUntil(f func(), period time.Duration, jitterFactor float64, stopCh <-chan struct{}) { | ||
func JitterUntil(f func(), period time.Duration, jitterFactor float64, sliding bool, stopCh <-chan struct{}) { | ||
select { | ||
case <-stopCh: | ||
return | ||
default: | ||
} | ||
|
||
for { | ||
jitteredPeriod := period | ||
if jitterFactor > 0.0 { | ||
jitteredPeriod = Jitter(period, jitterFactor) | ||
} | ||
|
||
var t *time.Timer | ||
if !sliding { | ||
t = time.NewTimer(jitteredPeriod) | ||
} | ||
|
||
func() { | ||
defer runtime.HandleCrash() | ||
f() | ||
}() | ||
|
||
jitteredPeriod := period | ||
if jitterFactor > 0.0 { | ||
jitteredPeriod = Jitter(period, jitterFactor) | ||
if sliding { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
zmerlynn
via email
Author
Member
|
||
t = time.NewTimer(jitteredPeriod) | ||
} else { | ||
// The timer we created could already have fired, so be | ||
// careful and check stopCh first. | ||
select { | ||
case <-stopCh: | ||
return | ||
default: | ||
} | ||
} | ||
|
||
select { | ||
case <-stopCh: | ||
return | ||
case <-time.After(jitteredPeriod): | ||
case <-t.C: | ||
} | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@zmerlynn I find this to be weirdly conflating the use of this function on an edge use case of the routecontroller.