Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Cai <jcai@gitlab.com>2022-04-07 23:07:03 +0300
committerJohn Cai <jcai@gitlab.com>2022-04-08 05:09:52 +0300
commit4b7c545451639cd54633b0e9f024b0902441a46d (patch)
tree240a33ae40f77673374f94a0b159c1725c8ea4eb
parent6fd1284bb5dd16d691b0a06bcdbd7675f4a1bfb5 (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.go16
-rw-r--r--internal/middleware/limithandler/rate_limiter.go14
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
}
}