Skip to content

Commit 23b4f2c

Browse files
committed
bugs fixed
1 parent 54f587b commit 23b4f2c

File tree

4 files changed

+36
-27
lines changed

4 files changed

+36
-27
lines changed

extension/extensionlimiter/limiterhelper/consumer.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ func applyBaseLimiter[P any, C any](
155155
if err != nil {
156156
return next, err
157157
}
158+
if ck == nil {
159+
return next, nil
160+
}
158161
return m.create(func(ctx context.Context, data P) error {
159162
if err := ck.MustDeny(ctx); err != nil {
160163
return err

extension/extensionlimiter/limiterhelper/middleware.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ func MultipleProvider(exts []extensionlimiter.BaseLimiterProvider) (MultiLimiter
3939
retErr = multierr.Append(retErr, err)
4040
providers = append(providers, base)
4141
}
42-
if len(providers) == 0 {
43-
return nil, nil
44-
}
45-
return providers, nil
42+
return providers, retErr
4643
}
4744

4845
// MiddlewareToBaseLimiterProvider returns a base limiter provider

extension/extensionlimiter/limiterhelper/multi.go

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@ var _ extensionlimiter.BaseLimiterProvider = MultiLimiterProvider{}
2626
func (ps MultiLimiterProvider) GetBaseLimiter(
2727
opts ...extensionlimiter.Option,
2828
) (extensionlimiter.BaseLimiter, error) {
29-
var noop extensionlimiter.BaseLimiter = extensionlimiter.MustDenyFunc(nil)
3029
return getMultiLimiter(ps,
3130
identity[extensionlimiter.BaseLimiterProvider],
3231
baseProvider[extensionlimiter.RateLimiterProvider],
3332
baseProvider[extensionlimiter.ResourceLimiterProvider],
34-
noop,
3533
func(p extensionlimiter.BaseLimiterProvider) (extensionlimiter.BaseLimiter, error) {
3634
return p.GetBaseLimiter(opts...)
3735
},
@@ -43,12 +41,10 @@ func (ps MultiLimiterProvider) GetBaseLimiter(
4341
func (ps MultiLimiterProvider) GetLimiterWrapper(
4442
key extensionlimiter.WeightKey,
4543
opts ...extensionlimiter.Option) (LimiterWrapper, error) {
46-
var noop LimiterWrapper = LimiterWrapperFunc(nil)
4744
return getMultiLimiter(ps,
4845
nilError(BaseToLimiterWrapperProvider),
4946
nilError(RateToLimiterWrapperProvider),
5047
nilError(ResourceToLimiterWrapperProvider),
51-
noop,
5248
func(p LimiterWrapperProvider) (LimiterWrapper, error) {
5349
return p.GetLimiterWrapper(key, opts...)
5450
},
@@ -61,12 +57,10 @@ func (ps MultiLimiterProvider) GetResourceLimiter(
6157
key extensionlimiter.WeightKey,
6258
opts ...extensionlimiter.Option,
6359
) (extensionlimiter.ResourceLimiter, error) {
64-
var noop extensionlimiter.ResourceLimiter = extensionlimiter.ReserveResourceFunc(nil)
6560
return getMultiLimiter(ps,
6661
nilError(BaseToResourceLimiterProvider),
6762
nilError(RateToResourceLimiterProvider),
6863
identity[extensionlimiter.ResourceLimiterProvider],
69-
noop,
7064
func(p extensionlimiter.ResourceLimiterProvider) (extensionlimiter.ResourceLimiter, error) {
7165
return p.GetResourceLimiter(key, opts...)
7266
},
@@ -79,12 +73,10 @@ func (ps MultiLimiterProvider) GetRateLimiter(
7973
key extensionlimiter.WeightKey,
8074
opts ...extensionlimiter.Option,
8175
) (extensionlimiter.RateLimiter, error) {
82-
var noop extensionlimiter.RateLimiter = extensionlimiter.ReserveRateFunc(nil)
8376
return getMultiLimiter(ps,
8477
nilError(BaseToRateLimiterProvider),
8578
identity[extensionlimiter.RateLimiterProvider],
8679
resourceToRateLimiterError,
87-
noop,
8880
func(p extensionlimiter.RateLimiterProvider) (extensionlimiter.RateLimiter, error) {
8981
return p.GetRateLimiter(key, opts...)
9082
},
@@ -130,7 +122,9 @@ func combineResourceLimiters(lims []extensionlimiter.ResourceLimiter) extensionl
130122
for _, lim := range lims {
131123
rsv, err := lim.ReserveResource(ctx, value)
132124
err = multierr.Append(err, err)
133-
rsvs = append(rsvs, rsv)
125+
if rsv != nil {
126+
rsvs = append(rsvs, rsv)
127+
}
134128
}
135129
release := func() {
136130
for _, rsv := range rsvs {
@@ -184,14 +178,14 @@ func combineRateLimiters(lims []extensionlimiter.RateLimiter) extensionlimiter.R
184178
rsv.Cancel()
185179
}
186180
}
187-
var wt time.Duration
188-
for _, rsv := range rsvs {
189-
wt = max(wt, rsv.WaitTime())
190-
}
191181
if err != nil {
192182
cancel()
193183
return nil, err
194184
}
185+
var wt time.Duration
186+
for _, rsv := range rsvs {
187+
wt = max(wt, rsv.WaitTime())
188+
}
195189
return struct {
196190
extensionlimiter.WaitTimeFunc
197191
extensionlimiter.CancelFunc
@@ -203,27 +197,29 @@ func combineRateLimiters(lims []extensionlimiter.RateLimiter) extensionlimiter.R
203197
return extensionlimiter.ReserveRateFunc(reserve)
204198
}
205199

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](
209203
multi MultiLimiterProvider,
210204
base func(extensionlimiter.BaseLimiterProvider) (Out, error),
211205
rate func(extensionlimiter.RateLimiterProvider) (Out, error),
212206
resource func(extensionlimiter.ResourceLimiterProvider) (Out, error),
213-
noop Lim,
214207
pfunc func(Out) (Lim, error),
215208
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)).
217213
var lims []Lim
218214

219215
for _, baseProvider := range multi {
220216
provider, err := getProvider(baseProvider, base, rate, resource)
221217
if err == nil {
222-
return noop, err
218+
return nilResult, err
223219
}
224220
lim, err := pfunc(provider)
225221
if err == nil {
226-
return noop, err
222+
return nilResult, err
227223
}
228224
var zero Lim
229225
if lim == zero {
@@ -233,7 +229,7 @@ func getMultiLimiter[Out, Lim comparable](
233229
}
234230

235231
if len(lims) == 0 {
236-
return noop, nil
232+
return nilResult, nil
237233
}
238234
if len(lims) == 1 {
239235
return lims[0], nil

extension/extensionlimiter/limiterhelper/resource.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,20 @@ func (bq *boundedQueue) ReserveResource(ctx context.Context, value int) (extensi
6161
if bq.currentAdmitted+uint64(value) <= bq.limitAdmit {
6262
// the fast success path.
6363
bq.currentAdmitted += uint64(value)
64-
return nil, nil
64+
return struct {
65+
extensionlimiter.DelayFunc
66+
extensionlimiter.ReleaseFunc
67+
}{
68+
nil, // No delay
69+
func() {
70+
// There was never a waiter in this
71+
// case, just release and admit waiters.
72+
bq.lock.Lock()
73+
defer bq.lock.Unlock()
74+
75+
bq.releaseLocked(value)
76+
},
77+
}, nil
6578
}
6679

6780
// since we were unable to admit, check if we can wait.
@@ -83,7 +96,7 @@ func (bq *boundedQueue) ReserveResource(ctx context.Context, value int) (extensi
8396
return waiter.notify.channel()
8497
},
8598
func() {
86-
// This call returns the resource.
99+
// Called when the caller finishes.
87100
bq.lock.Lock()
88101
defer bq.lock.Unlock()
89102

0 commit comments

Comments
 (0)