@@ -36,7 +36,7 @@ func TestNewTokenBucketLimiter(t *testing.T) {
36
36
podTokenBucket := util .NewTokenBucket (3 , 3 , nil )
37
37
userTokenBucket := util .NewTokenBucket (2 , 2 , nil )
38
38
requestTokenBucket := util .NewTokenBucket (1 , 1 , nil )
39
- l := newTokenBucketLimiter (podTokenBucket , userTokenBucket , requestTokenBucket , true , func (tokens uint64 , dataType store.StoreDataType ) int64 {
39
+ l := newTokenBucketLimiter (podTokenBucket , userTokenBucket , requestTokenBucket , false , func (tokens uint64 , dataType store.StoreDataType ) int64 {
40
40
if dataType == store .SeriesFetched {
41
41
return int64 (tokens ) * 5
42
42
}
@@ -45,30 +45,66 @@ func TestNewTokenBucketLimiter(t *testing.T) {
45
45
46
46
// should force retrieve tokens from all buckets upon succeeding
47
47
assert .NoError (t , l .ReserveWithType (2 , store .PostingsFetched ))
48
- assert .False (t , podTokenBucket .Retrieve (2 ))
48
+ assert .Equal (t , int64 (1 ), podTokenBucket .RemainingTokens ())
49
+ assert .Equal (t , int64 (0 ), userTokenBucket .RemainingTokens ())
50
+ assert .Equal (t , int64 (- 1 ), requestTokenBucket .RemainingTokens ())
49
51
50
52
// should fail if user token bucket is running low
51
- podTokenBucket .Refund (3 )
53
+ podTokenBucket .Refund (2 )
52
54
userTokenBucket .Refund (2 )
53
- requestTokenBucket .Refund (1 )
55
+ requestTokenBucket .Refund (2 )
54
56
assert .ErrorContains (t , l .ReserveWithType (3 , store .PostingsFetched ), "not enough tokens in user token bucket" )
57
+ assert .Equal (t , int64 (3 ), podTokenBucket .RemainingTokens ())
58
+ assert .Equal (t , int64 (2 ), userTokenBucket .RemainingTokens ())
59
+ assert .Equal (t , int64 (1 ), requestTokenBucket .RemainingTokens ())
55
60
56
61
// should fail if pod token bucket is running low
57
- podTokenBucket .Refund (3 )
58
- userTokenBucket .Refund (2 )
59
- requestTokenBucket .Refund (1 )
60
- podTokenBucket .ForceRetrieve (3 )
62
+ podTokenBucket .ForceRetrieve (2 )
61
63
assert .ErrorContains (t , l .ReserveWithType (2 , store .PostingsFetched ), "not enough tokens in pod token bucket" )
64
+ assert .Equal (t , int64 (1 ), podTokenBucket .RemainingTokens ())
65
+ assert .Equal (t , int64 (2 ), userTokenBucket .RemainingTokens ())
66
+ assert .Equal (t , int64 (1 ), requestTokenBucket .RemainingTokens ())
62
67
63
68
// should retrieve different amount of tokens based on data type
64
- podTokenBucket .Refund (3 )
65
- userTokenBucket .Refund (2 )
66
- requestTokenBucket .Refund (1 )
69
+ podTokenBucket .Refund (2 )
67
70
assert .ErrorContains (t , l .ReserveWithType (1 , store .SeriesFetched ), "not enough tokens in user token bucket" )
71
+ assert .Equal (t , int64 (3 ), podTokenBucket .RemainingTokens ())
72
+ assert .Equal (t , int64 (2 ), userTokenBucket .RemainingTokens ())
73
+ assert .Equal (t , int64 (1 ), requestTokenBucket .RemainingTokens ())
68
74
69
75
// should always succeed if retrieve token bucket has enough tokens, although shared buckets are empty
70
76
podTokenBucket .ForceRetrieve (3 )
71
77
userTokenBucket .ForceRetrieve (2 )
72
78
assert .NoError (t , l .ReserveWithType (1 , store .PostingsFetched ))
79
+ assert .Equal (t , int64 (- 1 ), podTokenBucket .RemainingTokens ())
80
+ assert .Equal (t , int64 (- 1 ), userTokenBucket .RemainingTokens ())
81
+ assert .Equal (t , int64 (0 ), requestTokenBucket .RemainingTokens ())
73
82
}
74
83
84
+ func TestNewTokenBucketLimter_DryRun (t * testing.T ) {
85
+ podTokenBucket := util .NewTokenBucket (3 , 3 , nil )
86
+ userTokenBucket := util .NewTokenBucket (2 , 2 , nil )
87
+ requestTokenBucket := util .NewTokenBucket (1 , 1 , nil )
88
+ l := newTokenBucketLimiter (podTokenBucket , userTokenBucket , requestTokenBucket , true , func (tokens uint64 , dataType store.StoreDataType ) int64 {
89
+ if dataType == store .SeriesFetched {
90
+ return int64 (tokens ) * 5
91
+ }
92
+ return int64 (tokens )
93
+ })
94
+
95
+ // should force retrieve tokens from all buckets upon succeeding
96
+ assert .NoError (t , l .ReserveWithType (2 , store .PostingsFetched ))
97
+ assert .False (t , podTokenBucket .Retrieve (2 ))
98
+ assert .Equal (t , int64 (1 ), podTokenBucket .RemainingTokens ())
99
+ assert .Equal (t , int64 (0 ), userTokenBucket .RemainingTokens ())
100
+ assert .Equal (t , int64 (- 1 ), requestTokenBucket .RemainingTokens ())
101
+
102
+ // should not fail even if tokens are not enough
103
+ podTokenBucket .Refund (2 )
104
+ userTokenBucket .Refund (2 )
105
+ requestTokenBucket .Refund (2 )
106
+ assert .NoError (t , l .ReserveWithType (5 , store .PostingsFetched ))
107
+ assert .Equal (t , int64 (- 2 ), podTokenBucket .RemainingTokens ())
108
+ assert .Equal (t , int64 (- 3 ), userTokenBucket .RemainingTokens ())
109
+ assert .Equal (t , int64 (- 4 ), requestTokenBucket .RemainingTokens ())
110
+ }
0 commit comments