blob: b973e052394b812a59ff48049ecabca73fcfb3c8 [file] [log] [blame]
// Copyright 2023 CeresDB Project Authors. Licensed under Apache-2.0.
package limiter
import (
"sync"
"github.com/CeresDB/ceresmeta/server/config"
"golang.org/x/time/rate"
)
type FlowLimiter struct {
l *rate.Limiter
// RWMutex is used to protect following fields.
lock sync.RWMutex
tokenBucketFillRate int
tokenBucketBurstEventCapacity int
enable bool
}
func NewFlowLimiter(config config.LimiterConfig) *FlowLimiter {
newLimiter := rate.NewLimiter(rate.Limit(config.TokenBucketFillRate), config.TokenBucketBurstEventCapacity)
return &FlowLimiter{
l: newLimiter,
tokenBucketFillRate: config.TokenBucketFillRate,
tokenBucketBurstEventCapacity: config.TokenBucketBurstEventCapacity,
enable: config.Enable,
}
}
func (f *FlowLimiter) Allow() bool {
if !f.enable {
return true
}
return f.l.Allow()
}
func (f *FlowLimiter) UpdateLimiter(config config.LimiterConfig) error {
f.lock.Lock()
defer f.lock.Unlock()
f.l.SetLimit(rate.Limit(config.TokenBucketFillRate))
f.l.SetBurst(config.TokenBucketBurstEventCapacity)
f.tokenBucketFillRate = config.TokenBucketFillRate
f.tokenBucketBurstEventCapacity = config.TokenBucketBurstEventCapacity
f.enable = config.Enable
return nil
}