diff --git a/server/etcdserver/server.go b/server/etcdserver/server.go index c46b73ad4..eb07dab55 100644 --- a/server/etcdserver/server.go +++ b/server/etcdserver/server.go @@ -2206,6 +2206,8 @@ func (s *EtcdServer) monitorKVHash() { if t == 0 { return } + checkTicker := time.NewTicker(t) + defer checkTicker.Stop() lg := s.Logger() lg.Info( @@ -2217,7 +2219,7 @@ func (s *EtcdServer) monitorKVHash() { select { case <-s.stopping: return - case <-time.After(t): + case <-checkTicker.C: } if !s.isLeader() { continue diff --git a/server/lease/lessor.go b/server/lease/lessor.go index a2e3dab24..860de54f4 100644 --- a/server/lease/lessor.go +++ b/server/lease/lessor.go @@ -607,12 +607,15 @@ func (le *lessor) Stop() { func (le *lessor) runLoop() { defer close(le.doneC) + delayTicker := time.NewTicker(500 * time.Millisecond) + defer delayTicker.Stop() + for { le.revokeExpiredLeases() le.checkpointScheduledLeases() select { - case <-time.After(500 * time.Millisecond): + case <-delayTicker.C: case <-le.stopC: return } diff --git a/server/storage/mvcc/watchable_store.go b/server/storage/mvcc/watchable_store.go index 8802f439a..adf07f775 100644 --- a/server/storage/mvcc/watchable_store.go +++ b/server/storage/mvcc/watchable_store.go @@ -211,6 +211,10 @@ func (s *watchableStore) Restore(b backend.Backend) error { func (s *watchableStore) syncWatchersLoop() { defer s.wg.Done() + waitDuration := 100 * time.Millisecond + delayTicker := time.NewTicker(waitDuration) + defer delayTicker.Stop() + for { s.mu.RLock() st := time.Now() @@ -223,15 +227,15 @@ func (s *watchableStore) syncWatchersLoop() { } syncDuration := time.Since(st) - waitDuration := 100 * time.Millisecond + delayTicker.Reset(waitDuration) // more work pending? if unsyncedWatchers != 0 && lastUnsyncedWatchers > unsyncedWatchers { // be fair to other store operations by yielding time taken - waitDuration = syncDuration + delayTicker.Reset(syncDuration) } select { - case <-time.After(waitDuration): + case <-delayTicker.C: case <-s.stopc: return }