1
// Copyright 2023 The CubeFS Authors.
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
// implied. See the License for the specific language governing
13
// permissions and limitations under the License.
21
"gopkg.in/bsm/ratelimit.v1"
24
type rateLimitWrapper struct {
25
r *ratelimit.RateLimiter
29
func newRateLimitWrapper(rate int) *rateLimitWrapper {
30
return &rateLimitWrapper{
31
r: ratelimit.New(10*rate, 10*time.Second),
36
type KeyRateLimit struct {
38
current map[string]*rateLimitWrapper // uid -> ratelimit
41
func NewKeyRateLimit() *KeyRateLimit {
42
return &KeyRateLimit{current: make(map[string]*rateLimitWrapper)}
45
func (k *KeyRateLimit) Acquire(key string, rate int) *ratelimit.RateLimiter {
47
limit, ok := k.current[key]
49
limit = newRateLimitWrapper(rate)
50
k.current[key] = limit
57
func (k *KeyRateLimit) Release(key string) {
59
defer k.mutex.Unlock()
60
limit, ok := k.current[key]
62
panic("key not in map. Possible reason: Release without Acquire.")
65
if limit.refCount < 0 {
66
panic("internal error: refs < 0")
68
if limit.refCount == 0 {
69
delete(k.current, key)