diff --git a/etcdserver/server.go b/etcdserver/server.go index 1b288d8a675b..866968b65cb0 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -733,7 +733,9 @@ func (s *EtcdServer) run() { plog.Infof("the data-dir used by this member must be removed.") return case <-getSyncC(): - s.sync(s.Cfg.ReqTimeout()) + if s.store.HasTTLKeys() { + s.sync(s.Cfg.ReqTimeout()) + } case <-s.stop: return } diff --git a/pkg/mock/mockstore/store_recorder.go b/pkg/mock/mockstore/store_recorder.go index 7735cc3dfa7e..4dad19ee52d5 100644 --- a/pkg/mock/mockstore/store_recorder.go +++ b/pkg/mock/mockstore/store_recorder.go @@ -127,6 +127,13 @@ func (s *storeRecorder) DeleteExpiredKeys(cutoff time.Time) { }) } +func (s *storeRecorder) HasTTLKeys() bool { + s.Record(testutil.Action{ + Name: "HasTTLKeys", + }) + return true +} + // errStoreRecorder is a storeRecorder, but returns the given error on // Get, Watch methods. type errStoreRecorder struct { diff --git a/store/store.go b/store/store.go index 4db2ee317486..6c19ad4c9707 100644 --- a/store/store.go +++ b/store/store.go @@ -61,6 +61,8 @@ type Store interface { JsonStats() []byte DeleteExpiredKeys(cutoff time.Time) + + HasTTLKeys() bool } type TTLOptionSet struct { @@ -778,3 +780,9 @@ func (s *store) JsonStats() []byte { s.Stats.Watchers = uint64(s.WatcherHub.count) return s.Stats.toJson() } + +func (s *store) HasTTLKeys() bool { + s.worldLock.RLock() + defer s.worldLock.RUnlock() + return s.ttlKeyHeap.Len() != 0 +}