go-common/app/infra/discovery/dao/guard.go
2019-04-22 18:49:16 +08:00

61 lines
1.2 KiB
Go

package dao
import (
"sync"
"sync/atomic"
"go-common/library/log"
)
const (
_percentThreshold float64 = 0.85
)
// Guard count the renew of all operations for self protection
type Guard struct {
expPerMin int64
expThreshold int64
facInMin int64
facLastMin int64
lock sync.RWMutex
}
func (g *Guard) setExp(cnt int64) {
g.lock.Lock()
g.expPerMin = cnt * 2
g.expThreshold = int64(float64(g.expPerMin) * _percentThreshold)
g.lock.Unlock()
}
func (g *Guard) incrExp() {
g.lock.Lock()
g.expPerMin = g.expPerMin + 2
g.expThreshold = int64(float64(g.expPerMin) * _percentThreshold)
g.lock.Unlock()
}
func (g *Guard) updateFac() {
atomic.StoreInt64(&g.facLastMin, atomic.SwapInt64(&g.facInMin, 0))
}
func (g *Guard) decrExp() {
g.lock.Lock()
if g.expPerMin > 0 {
g.expPerMin = g.expPerMin - 2
g.expThreshold = int64(float64(g.expPerMin) * _percentThreshold)
}
g.lock.Unlock()
}
func (g *Guard) incrFac() {
atomic.AddInt64(&g.facInMin, 1)
}
func (g *Guard) ok() (is bool) {
is = atomic.LoadInt64(&g.facLastMin) < atomic.LoadInt64(&g.expThreshold)
if is {
log.Warn("discovery is protected, the factual renews(%d) less than expected renews(%d)", atomic.LoadInt64(&g.facLastMin), atomic.LoadInt64(&g.expThreshold))
}
return
}