From de8d6b379278d1bc145241e678714b4020b9ff48 Mon Sep 17 00:00:00 2001 From: guozhao Date: Tue, 17 Jan 2023 16:57:33 +0800 Subject: [PATCH] etcdserver: use time.Ticker instead of time.After Using time.After will create a new Timer in each cycle, In these cases , it is better to use time.Ticker. Signed-off-by: guozhao --- server/etcdserver/server.go | 4 +++- server/lease/lessor.go | 5 ++++- server/storage/mvcc/watchable_store.go | 10 +++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) 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 }