diff options
author | John Cai <jcai@gitlab.com> | 2022-04-07 23:07:03 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2022-04-08 05:09:52 +0300 |
commit | 4b7c545451639cd54633b0e9f024b0902441a46d (patch) | |
tree | 240a33ae40f77673374f94a0b159c1725c8ea4eb | |
parent | 6fd1284bb5dd16d691b0a06bcdbd7675f4a1bfb5 (diff) |
limithandler: Return ResourceExhausted for rate limiterjc-change-backpressure-to-resource-exhausted
If a rate limiter idicates no more traffic is allowed, Gitaly should
return a non-retryable error. gRPC Unavailable indicates a retry is
possible, so gRPC ResourceExhausted is more appropriate to return to the
client.
Changelog: changed
-rw-r--r-- | internal/middleware/limithandler/middleware_test.go | 16 | ||||
-rw-r--r-- | internal/middleware/limithandler/rate_limiter.go | 14 |
2 files changed, 26 insertions, 4 deletions
diff --git a/internal/middleware/limithandler/middleware_test.go b/internal/middleware/limithandler/middleware_test.go index 4ccdad848..852c490de 100644 --- a/internal/middleware/limithandler/middleware_test.go +++ b/internal/middleware/limithandler/middleware_test.go @@ -3,6 +3,7 @@ package limithandler_test import ( "bytes" "context" + "errors" "net" "sync" "testing" @@ -19,8 +20,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" ) func TestMain(m *testing.M) { @@ -370,7 +369,18 @@ func testRateLimitHandler(t *testing.T, ctx context.Context) { _, err := client.Unary(ctx, &pb.UnaryRequest{}) if featureflag.RateLimit.IsEnabled(ctx) { - testhelper.RequireGrpcError(t, status.Error(codes.Unavailable, "too many requests"), err) + testhelper.RequireGrpcError( + t, + limithandler.ErrWithDetails( + t, + helper.ErrResourceExhausted(errors.New("too many requests")), + &gitalypb.SystemResourceError{ + ErrorMessage: "too many requests", + Retryable: false, + }, + ), + err, + ) } else { require.NoError(t, err) } diff --git a/internal/middleware/limithandler/rate_limiter.go b/internal/middleware/limithandler/rate_limiter.go index f47bb5409..241546a68 100644 --- a/internal/middleware/limithandler/rate_limiter.go +++ b/internal/middleware/limithandler/rate_limiter.go @@ -10,6 +10,7 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "golang.org/x/time/rate" ) @@ -37,7 +38,18 @@ func (r *RateLimiter) Limit(ctx context.Context, lockKey string, f LimitedFunc) // of traffic. r.requestsDroppedMetric.Inc() if featureflag.RateLimit.IsEnabled(ctx) { - return nil, helper.ErrUnavailable(errors.New("too many requests")) + detailedErr, err := helper.ErrWithDetails( + helper.ErrResourceExhausted(errors.New("too many requests")), + &gitalypb.SystemResourceError{ + ErrorMessage: "too many requests", + Retryable: false, + }, + ) + if err != nil { + return nil, helper.ErrInternalf("error details: %w", err) + } + + return nil, detailedErr } } |