func limit(addr string, cache *lru.Cache, lock sync.RWMutex, rate time.Duration, burst int64) bool { host, _, err := net.SplitHostPort(addr) if err != nil { return false } lock.RLock() bkt, ok := cache.Get(host) lock.RUnlock() if ok { bkt := bkt.(*ratelimit.Bucket) if bkt.TakeAvailable(1) != 1 { // Rate limit return true } } else { lock.Lock() cache.Add(host, ratelimit.NewBucket(rate, burst)) lock.Unlock() } return false }
func limit(addr string, cache *lru.Cache, lock sync.RWMutex, intv time.Duration, burst int) bool { host, _, err := net.SplitHostPort(addr) if err != nil { return false } lock.RLock() bkt, ok := cache.Get(host) lock.RUnlock() if ok { bkt := bkt.(*rate.Limiter) if !bkt.Allow() { // Rate limit return true } } else { lock.Lock() cache.Add(host, rate.NewLimiter(rate.Every(intv), burst)) lock.Unlock() } return false }