@@ -26,12 +26,10 @@ var _ extensionlimiter.BaseLimiterProvider = MultiLimiterProvider{}
26
26
func (ps MultiLimiterProvider ) GetBaseLimiter (
27
27
opts ... extensionlimiter.Option ,
28
28
) (extensionlimiter.BaseLimiter , error ) {
29
- var noop extensionlimiter.BaseLimiter = extensionlimiter .MustDenyFunc (nil )
30
29
return getMultiLimiter (ps ,
31
30
identity [extensionlimiter .BaseLimiterProvider ],
32
31
baseProvider [extensionlimiter .RateLimiterProvider ],
33
32
baseProvider [extensionlimiter .ResourceLimiterProvider ],
34
- noop ,
35
33
func (p extensionlimiter.BaseLimiterProvider ) (extensionlimiter.BaseLimiter , error ) {
36
34
return p .GetBaseLimiter (opts ... )
37
35
},
@@ -43,12 +41,10 @@ func (ps MultiLimiterProvider) GetBaseLimiter(
43
41
func (ps MultiLimiterProvider ) GetLimiterWrapper (
44
42
key extensionlimiter.WeightKey ,
45
43
opts ... extensionlimiter.Option ) (LimiterWrapper , error ) {
46
- var noop LimiterWrapper = LimiterWrapperFunc (nil )
47
44
return getMultiLimiter (ps ,
48
45
nilError (BaseToLimiterWrapperProvider ),
49
46
nilError (RateToLimiterWrapperProvider ),
50
47
nilError (ResourceToLimiterWrapperProvider ),
51
- noop ,
52
48
func (p LimiterWrapperProvider ) (LimiterWrapper , error ) {
53
49
return p .GetLimiterWrapper (key , opts ... )
54
50
},
@@ -61,12 +57,10 @@ func (ps MultiLimiterProvider) GetResourceLimiter(
61
57
key extensionlimiter.WeightKey ,
62
58
opts ... extensionlimiter.Option ,
63
59
) (extensionlimiter.ResourceLimiter , error ) {
64
- var noop extensionlimiter.ResourceLimiter = extensionlimiter .ReserveResourceFunc (nil )
65
60
return getMultiLimiter (ps ,
66
61
nilError (BaseToResourceLimiterProvider ),
67
62
nilError (RateToResourceLimiterProvider ),
68
63
identity [extensionlimiter .ResourceLimiterProvider ],
69
- noop ,
70
64
func (p extensionlimiter.ResourceLimiterProvider ) (extensionlimiter.ResourceLimiter , error ) {
71
65
return p .GetResourceLimiter (key , opts ... )
72
66
},
@@ -79,12 +73,10 @@ func (ps MultiLimiterProvider) GetRateLimiter(
79
73
key extensionlimiter.WeightKey ,
80
74
opts ... extensionlimiter.Option ,
81
75
) (extensionlimiter.RateLimiter , error ) {
82
- var noop extensionlimiter.RateLimiter = extensionlimiter .ReserveRateFunc (nil )
83
76
return getMultiLimiter (ps ,
84
77
nilError (BaseToRateLimiterProvider ),
85
78
identity [extensionlimiter .RateLimiterProvider ],
86
79
resourceToRateLimiterError ,
87
- noop ,
88
80
func (p extensionlimiter.RateLimiterProvider ) (extensionlimiter.RateLimiter , error ) {
89
81
return p .GetRateLimiter (key , opts ... )
90
82
},
@@ -130,7 +122,9 @@ func combineResourceLimiters(lims []extensionlimiter.ResourceLimiter) extensionl
130
122
for _ , lim := range lims {
131
123
rsv , err := lim .ReserveResource (ctx , value )
132
124
err = multierr .Append (err , err )
133
- rsvs = append (rsvs , rsv )
125
+ if rsv != nil {
126
+ rsvs = append (rsvs , rsv )
127
+ }
134
128
}
135
129
release := func () {
136
130
for _ , rsv := range rsvs {
@@ -184,14 +178,14 @@ func combineRateLimiters(lims []extensionlimiter.RateLimiter) extensionlimiter.R
184
178
rsv .Cancel ()
185
179
}
186
180
}
187
- var wt time.Duration
188
- for _ , rsv := range rsvs {
189
- wt = max (wt , rsv .WaitTime ())
190
- }
191
181
if err != nil {
192
182
cancel ()
193
183
return nil , err
194
184
}
185
+ var wt time.Duration
186
+ for _ , rsv := range rsvs {
187
+ wt = max (wt , rsv .WaitTime ())
188
+ }
195
189
return struct {
196
190
extensionlimiter.WaitTimeFunc
197
191
extensionlimiter.CancelFunc
@@ -203,27 +197,29 @@ func combineRateLimiters(lims []extensionlimiter.RateLimiter) extensionlimiter.R
203
197
return extensionlimiter .ReserveRateFunc (reserve )
204
198
}
205
199
206
- // getMultiLimiter combines multiple providers (all kinds), gets
207
- // limiters from each, and returns the combined result or error .
208
- func getMultiLimiter [Out , Lim comparable ](
200
+ // getMultiLimiter configures a limiter for multiple limiter
201
+ // extensions .
202
+ func getMultiLimiter [Out any , Lim comparable ](
209
203
multi MultiLimiterProvider ,
210
204
base func (extensionlimiter.BaseLimiterProvider ) (Out , error ),
211
205
rate func (extensionlimiter.RateLimiterProvider ) (Out , error ),
212
206
resource func (extensionlimiter.ResourceLimiterProvider ) (Out , error ),
213
- noop Lim ,
214
207
pfunc func (Out ) (Lim , error ),
215
208
combine func ([]Lim ) Lim ,
216
- ) (Lim , error ) {
209
+ ) (nilResult Lim , _ error ) {
210
+ // Note that nilResult is used in error and non-error cases to
211
+ // return a nil and not a nil with concrete type (e.g.,
212
+ // extensionlimiter.BaseLimiterProvider(nil)).
217
213
var lims []Lim
218
214
219
215
for _ , baseProvider := range multi {
220
216
provider , err := getProvider (baseProvider , base , rate , resource )
221
217
if err == nil {
222
- return noop , err
218
+ return nilResult , err
223
219
}
224
220
lim , err := pfunc (provider )
225
221
if err == nil {
226
- return noop , err
222
+ return nilResult , err
227
223
}
228
224
var zero Lim
229
225
if lim == zero {
@@ -233,7 +229,7 @@ func getMultiLimiter[Out, Lim comparable](
233
229
}
234
230
235
231
if len (lims ) == 0 {
236
- return noop , nil
232
+ return nilResult , nil
237
233
}
238
234
if len (lims ) == 1 {
239
235
return lims [0 ], nil
0 commit comments