github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/utils/liveness/check.go (about) 1 package liveness 2 3 import ( 4 "sync" 5 "time" 6 ) 7 8 // Check is a heartbeat style liveness reporter. 9 // 10 // It is not guaranteed to be safe to CheckIn across multiple goroutines. 11 // IsLive must be safe to be called concurrently with CheckIn. 12 type Check interface { 13 CheckIn() 14 IsLive(time.Duration) bool 15 } 16 17 // internalCheck implements a Check. 18 type internalCheck struct { 19 lock sync.RWMutex 20 lastCheckIn time.Time 21 defaultTolerance time.Duration 22 } 23 24 // CheckIn adds a heartbeat at the current time. 25 func (c *internalCheck) CheckIn() { 26 c.lock.Lock() 27 c.lastCheckIn = time.Now() 28 c.lock.Unlock() 29 } 30 31 // IsLive checks if we are still live against the given the tolerace between hearbeats. 32 // 33 // If tolerance is 0, the default tolerance is used. 34 func (c *internalCheck) IsLive(tolerance time.Duration) bool { 35 c.lock.RLock() 36 defer c.lock.RUnlock() 37 if tolerance == 0 { 38 tolerance = c.defaultTolerance 39 } 40 41 return c.lastCheckIn.Add(tolerance).After(time.Now()) 42 }