mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 09:49:50 +00:00
Use timer instead of ticker in progress requestor
Ticker behaves differently from what we want, we need a stable period interval, but ticker doesn't provide that. From NewTicker docstring: ``` The ticker will adjust the time interval or drop ticks to make up for slow receivers. ``` Unfortunatelly there is no way to test it as the FakeClock doesn't follow the real ticker behavior.
This commit is contained in:
parent
3332eef27d
commit
7c0e9cda46
@ -140,30 +140,41 @@ func newTestWatchCache(capacity int, indexers *cache.Indexers) *testWatchCache {
|
|||||||
|
|
||||||
type immediateTickerFactory struct{}
|
type immediateTickerFactory struct{}
|
||||||
|
|
||||||
func (t *immediateTickerFactory) NewTicker(d time.Duration) clock.Ticker {
|
func (t *immediateTickerFactory) NewTimer(d time.Duration) clock.Timer {
|
||||||
return &immediateTicker{stopCh: make(chan struct{})}
|
timer := immediateTicker{
|
||||||
|
c: make(chan time.Time),
|
||||||
|
}
|
||||||
|
timer.Reset(d)
|
||||||
|
return &timer
|
||||||
}
|
}
|
||||||
|
|
||||||
type immediateTicker struct {
|
type immediateTicker struct {
|
||||||
stopCh chan struct{}
|
c chan time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *immediateTicker) Reset(d time.Duration) (active bool) {
|
||||||
|
select {
|
||||||
|
case <-t.c:
|
||||||
|
active = true
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
t.c <- time.Now()
|
||||||
|
}()
|
||||||
|
return active
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *immediateTicker) C() <-chan time.Time {
|
func (t *immediateTicker) C() <-chan time.Time {
|
||||||
ch := make(chan time.Time)
|
return t.c
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case ch <- time.Now():
|
|
||||||
case <-t.stopCh:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return ch
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *immediateTicker) Stop() {
|
func (t *immediateTicker) Stop() bool {
|
||||||
close(t.stopCh)
|
select {
|
||||||
|
case <-t.c:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *testWatchCache) RequestWatchProgress(ctx context.Context) error {
|
func (w *testWatchCache) RequestWatchProgress(ctx context.Context) error {
|
||||||
|
@ -49,7 +49,7 @@ func newConditionalProgressRequester(requestWatchProgress WatchProgressRequester
|
|||||||
type WatchProgressRequester func(ctx context.Context) error
|
type WatchProgressRequester func(ctx context.Context) error
|
||||||
|
|
||||||
type TickerFactory interface {
|
type TickerFactory interface {
|
||||||
NewTicker(time.Duration) clock.Ticker
|
NewTimer(time.Duration) clock.Timer
|
||||||
}
|
}
|
||||||
|
|
||||||
// conditionalProgressRequester will request progress notification if there
|
// conditionalProgressRequester will request progress notification if there
|
||||||
@ -78,8 +78,8 @@ func (pr *conditionalProgressRequester) Run(stopCh <-chan struct{}) {
|
|||||||
pr.stopped = true
|
pr.stopped = true
|
||||||
pr.cond.Signal()
|
pr.cond.Signal()
|
||||||
}()
|
}()
|
||||||
ticker := pr.clock.NewTicker(progressRequestPeriod)
|
timer := pr.clock.NewTimer(progressRequestPeriod)
|
||||||
defer ticker.Stop()
|
defer timer.Stop()
|
||||||
for {
|
for {
|
||||||
stopped := func() bool {
|
stopped := func() bool {
|
||||||
pr.mux.RLock()
|
pr.mux.RLock()
|
||||||
@ -94,7 +94,8 @@ func (pr *conditionalProgressRequester) Run(stopCh <-chan struct{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ticker.C():
|
case <-timer.C():
|
||||||
|
timer.Reset(progressRequestPeriod)
|
||||||
shouldRequest := func() bool {
|
shouldRequest := func() bool {
|
||||||
pr.mux.RLock()
|
pr.mux.RLock()
|
||||||
defer pr.mux.RUnlock()
|
defer pr.mux.RUnlock()
|
||||||
|
Loading…
Reference in New Issue
Block a user