61 lines
1.2 KiB
Go
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
|
|
}
|