From 5914dff5a28c65d867b66a7a419438529f69d868 Mon Sep 17 00:00:00 2001 From: Linsen Zhou Date: Fri, 17 Jul 2026 17:48:40 +0800 Subject: [PATCH] limits/limiters: fix panic when bucket set is full --- internal/limits/limiters/bucket.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/internal/limits/limiters/bucket.go b/internal/limits/limiters/bucket.go index ae653b178..621ee299b 100644 --- a/internal/limits/limiters/bucket.go +++ b/internal/limits/limiters/bucket.go @@ -20,10 +20,13 @@ package limiters import ( "context" + "errors" "sync" "time" ) +var ErrBucketSetFull = errors.New("limiters: Bucket set is full") + // BucketSet combines a group of Ls into a single key-indexed structure. // Basically, each unique key gets its own counter. The main use case for // BucketSet is to apply per-resource rate limiting. @@ -125,6 +128,9 @@ func (r *BucketSet) Take(key string) bool { } bucket := r.take(key) + for bucket == nil { + return false + } return bucket.Take() } @@ -149,5 +155,9 @@ func (r *BucketSet) TakeContext(ctx context.Context, key string) error { } bucket := r.take(key) + if bucket == nil { + return ErrBucketSetFull + } + return bucket.TakeContext(ctx) }