Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit c390e4b

Browse files
authored
graphqlbackend: update throttled to use Ctx stores (#54748)
It seems we were using a weird version of throttled which I don't think was actually based on the v2 series correctly. This updates us to the latest version and moves us away from the removed struct GCRARateLimiter and the deprecated interface GCRAStore. I came across this while attempting to update deps and getting failing compiles. Test Plan: we have unit tests for this, so CI.
1 parent 304dfae commit c390e4b

File tree

9 files changed

+48
-61
lines changed

9 files changed

+48
-61
lines changed

cmd/frontend/graphqlbackend/rate_limit.go

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphqlbackend
22

33
import (
4+
"context"
45
"strconv"
56
"sync/atomic"
67

@@ -369,14 +370,14 @@ type LimiterArgs struct {
369370
}
370371

371372
type Limiter interface {
372-
RateLimit(key string, quantity int, args LimiterArgs) (bool, throttled.RateLimitResult, error)
373+
RateLimit(ctx context.Context, key string, quantity int, args LimiterArgs) (bool, throttled.RateLimitResult, error)
373374
}
374375

375376
type LimitWatcher interface {
376377
Get() (Limiter, bool)
377378
}
378379

379-
func NewBasicLimitWatcher(logger log.Logger, store throttled.GCRAStore) *BasicLimitWatcher {
380+
func NewBasicLimitWatcher(logger log.Logger, store throttled.GCRAStoreCtx) *BasicLimitWatcher {
380381
basic := &BasicLimitWatcher{
381382
store: store,
382383
}
@@ -392,7 +393,7 @@ func NewBasicLimitWatcher(logger log.Logger, store throttled.GCRAStore) *BasicLi
392393
}
393394

394395
type BasicLimitWatcher struct {
395-
store throttled.GCRAStore
396+
store throttled.GCRAStoreCtx
396397
rl atomic.Value // *RateLimiter
397398
}
398399

@@ -403,7 +404,7 @@ func (bl *BasicLimitWatcher) updateFromConfig(logger log.Logger, limit int) {
403404
return
404405
}
405406
maxBurstPercentage := 0.2
406-
l, err := throttled.NewGCRARateLimiter(
407+
l, err := throttled.NewGCRARateLimiterCtx(
407408
bl.store,
408409
throttled.RateQuota{
409410
MaxRate: throttled.PerHour(limit),
@@ -428,46 +429,15 @@ func (bl *BasicLimitWatcher) Get() (Limiter, bool) {
428429
}
429430

430431
type BasicLimiter struct {
431-
*throttled.GCRARateLimiter
432+
*throttled.GCRARateLimiterCtx
432433
enabled bool
433434
}
434435

435436
// RateLimit limits unauthenticated requests to the GraphQL API with an equal
436437
// quantity of 1.
437-
func (bl *BasicLimiter) RateLimit(_ string, _ int, args LimiterArgs) (bool, throttled.RateLimitResult, error) {
438-
if args.Anonymous && args.RequestName == "unknown" && args.RequestSource == trace.SourceOther && bl.GCRARateLimiter != nil {
439-
return bl.GCRARateLimiter.RateLimit("basic", 1)
438+
func (bl *BasicLimiter) RateLimit(ctx context.Context, _ string, _ int, args LimiterArgs) (bool, throttled.RateLimitResult, error) {
439+
if args.Anonymous && args.RequestName == "unknown" && args.RequestSource == trace.SourceOther && bl.GCRARateLimiterCtx != nil {
440+
return bl.GCRARateLimiterCtx.RateLimitCtx(ctx, "basic", 1)
440441
}
441442
return false, throttled.RateLimitResult{}, nil
442443
}
443-
444-
type RateLimiter struct {
445-
enabled bool
446-
ipLimiter *throttled.GCRARateLimiter
447-
userLimiter *throttled.GCRARateLimiter
448-
overrides map[string]limiter
449-
}
450-
451-
func (rl *RateLimiter) RateLimit(uid string, cost int, args LimiterArgs) (bool, throttled.RateLimitResult, error) {
452-
if r, ok := rl.overrides[uid]; ok {
453-
return r.RateLimit(uid, cost)
454-
}
455-
if args.IsIP {
456-
return rl.ipLimiter.RateLimit(uid, cost)
457-
}
458-
return rl.userLimiter.RateLimit(uid, cost)
459-
}
460-
461-
type limiter interface {
462-
RateLimit(string, int) (bool, throttled.RateLimitResult, error)
463-
}
464-
465-
// fixedLimiter is a rate limiter that always returns the same result
466-
type fixedLimiter struct {
467-
limited bool
468-
result throttled.RateLimitResult
469-
}
470-
471-
func (f *fixedLimiter) RateLimit(string, int) (bool, throttled.RateLimitResult, error) {
472-
return f.limited, f.result, nil
473-
}

cmd/frontend/graphqlbackend/rate_limit_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphqlbackend
22

33
import (
4+
"context"
45
"fmt"
56
"testing"
67

@@ -415,7 +416,7 @@ func TestBasicLimiterEnabled(t *testing.T) {
415416

416417
for _, tt := range tests {
417418
t.Run(fmt.Sprintf("limit:%d", tt.limit), func(t *testing.T) {
418-
store, err := memstore.New(1)
419+
store, err := memstore.NewCtx(1)
419420
if err != nil {
420421
t.Fatal(err)
421422
}
@@ -435,7 +436,7 @@ func TestBasicLimiterEnabled(t *testing.T) {
435436
}
436437

437438
func TestBasicLimiter(t *testing.T) {
438-
store, err := memstore.New(1)
439+
store, err := memstore.NewCtx(1)
439440
if err != nil {
440441
t.Fatal(err)
441442
}
@@ -458,7 +459,7 @@ func TestBasicLimiter(t *testing.T) {
458459
}
459460

460461
// 1st call should not be limited.
461-
limited, _, err := limiter.RateLimit("", 1, limiterArgs)
462+
limited, _, err := limiter.RateLimit(context.Background(), "", 1, limiterArgs)
462463
if err != nil {
463464
t.Fatal(err)
464465
}
@@ -467,7 +468,7 @@ func TestBasicLimiter(t *testing.T) {
467468
}
468469

469470
// 2nd call should be limited.
470-
limited, _, err = limiter.RateLimit("", 1, limiterArgs)
471+
limited, _, err = limiter.RateLimit(context.Background(), "", 1, limiterArgs)
471472
if err != nil {
472473
t.Fatal(err)
473474
}

cmd/frontend/internal/cli/serve_cmd.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -379,14 +379,14 @@ func isAllowedOrigin(origin string, allowedOrigins []string) bool {
379379
}
380380

381381
func makeRateLimitWatcher() (*graphqlbackend.BasicLimitWatcher, error) {
382-
var store throttled.GCRAStore
382+
var store throttled.GCRAStoreCtx
383383
var err error
384384
if pool, ok := redispool.Cache.Pool(); ok {
385-
store, err = redigostore.New(pool, "gql:rl:", 0)
385+
store, err = redigostore.NewCtx(pool, "gql:rl:", 0)
386386
} else {
387387
// If redis is disabled we are in Sourcegraph App and can rely on an
388388
// in-memory store.
389-
store, err = memstore.New(0)
389+
store, err = memstore.NewCtx(0)
390390
}
391391
if err != nil {
392392
return nil, err

cmd/frontend/internal/httpapi/api_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func init() {
2424
func newTest(t *testing.T) *httptestutil.Client {
2525
logger := logtest.Scoped(t)
2626
enterpriseServices := enterprise.DefaultServices()
27-
rateLimitStore, _ := memstore.New(1024)
27+
rateLimitStore, _ := memstore.NewCtx(1024)
2828
rateLimiter := graphqlbackend.NewBasicLimitWatcher(logger, rateLimitStore)
2929

3030
db := database.NewMockDB()

cmd/frontend/internal/httpapi/graphql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func serveGraphQL(logger sglog.Logger, schema *graphql.Schema, rlw graphqlbacken
9292
traceData.cost = cost
9393

9494
if rl, enabled := rlw.Get(); enabled && cost != nil {
95-
limited, result, err := rl.RateLimit(uid, cost.FieldCount, graphqlbackend.LimiterArgs{
95+
limited, result, err := rl.RateLimit(r.Context(), uid, cost.FieldCount, graphqlbackend.LimiterArgs{
9696
IsIP: isIP,
9797
Anonymous: anonymous,
9898
RequestName: requestName,

deps.bzl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -899,15 +899,15 @@ def go_dependencies():
899899
name = "com_github_bsm_ginkgo_v2",
900900
build_file_proto_mode = "disable_global",
901901
importpath = "github.com/bsm/ginkgo/v2",
902-
sum = "h1:aOAnND1T40wEdAtkGSkvSICWeQ8L3UASX7YVCqQx+eQ=",
903-
version = "v2.5.0",
902+
sum = "h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=",
903+
version = "v2.7.0",
904904
)
905905
go_repository(
906906
name = "com_github_bsm_gomega",
907907
build_file_proto_mode = "disable_global",
908908
importpath = "github.com/bsm/gomega",
909-
sum = "h1:JhAwLmtRzXFTx2AkALSLa8ijZafntmhSoU63Ok18Uq8=",
910-
version = "v1.20.0",
909+
sum = "h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=",
910+
version = "v1.26.0",
911911
)
912912

913913
go_repository(
@@ -5806,8 +5806,8 @@ def go_dependencies():
58065806
name = "com_github_redis_go_redis_v9",
58075807
build_file_proto_mode = "disable_global",
58085808
importpath = "github.com/redis/go-redis/v9",
5809-
sum = "h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE=",
5810-
version = "v9.0.2",
5809+
sum = "h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=",
5810+
version = "v9.0.5",
58115811
)
58125812

58135813
go_repository(
@@ -6510,8 +6510,8 @@ def go_dependencies():
65106510
name = "com_github_throttled_throttled_v2",
65116511
build_file_proto_mode = "disable_global",
65126512
importpath = "github.com/throttled/throttled/v2",
6513-
sum = "h1:DOkCb1el7NYzRoPb1pyeHVghsUoonVWEjmo34vrcp/8=",
6514-
version = "v2.9.0",
6513+
sum = "h1:IezKE1uHlYC/0Al05oZV6Ar+uN/znw3cy9J8banxhEY=",
6514+
version = "v2.12.0",
65156515
)
65166516
go_repository(
65176517
name = "com_github_tidwall_gjson",

dev/backcompat/defs.bzl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ fi
5656
find . -type f -name "*.bazel" -exec $_sed_binary -i 's|@com_github_sourcegraph_conc|@back_compat_com_github_sourcegraph_conc|g' {} +
5757
find . -type f -name "*.bazel" -exec $_sed_binary -i 's|@com_github_sourcegraph_scip|@back_compat_com_github_sourcegraph_scip|g' {} +
5858
find . -type f -name "*.bazel" -exec $_sed_binary -i 's|@com_github_sourcegraph_zoekt|@back_compat_com_github_sourcegraph_zoekt|g' {} +
59+
find . -type f -name "*.bazel" -exec $_sed_binary -i 's|@com_github_throttled_throttled_v2|@back_compat_com_github_throttled_throttled_v2|g' {} +
5960
"""
6061

6162
def back_compat_defs():
@@ -114,6 +115,15 @@ def back_compat_defs():
114115
version = "v0.0.0-20230620185637-63241cb1b17a",
115116
)
116117

118+
go_repository(
119+
name = "back_compat_com_github_throttled_throttled_v2",
120+
build_file_proto_mode = "disable_global",
121+
importpath = "github.com/throttled/throttled/v2",
122+
sum = "h1:DOkCb1el7NYzRoPb1pyeHVghsUoonVWEjmo34vrcp/8=",
123+
version = "v2.9.0",
124+
)
125+
126+
117127
# Now that we have declared a replacement for the two problematic go packages that
118128
# @sourcegraph_back_compat depends on, we can define the repository itself. Because it
119129
# comes with its Bazel rules (logical, that's just the current repository but with a different

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ require (
201201
github.com/sourcegraph/sourcegraph/lib v0.0.0-20230613175844-f031949c72f5
202202
github.com/stretchr/testify v1.8.2
203203
github.com/temoto/robotstxt v1.1.2
204-
github.com/throttled/throttled/v2 v2.9.0
204+
github.com/throttled/throttled/v2 v2.12.0
205205
github.com/tidwall/gjson v1.14.0
206206
github.com/tj/go-naturaldate v1.3.0
207207
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80

go.sum

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,9 @@ github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1l
379379
github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
380380
github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
381381
github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
382+
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
382383
github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk=
384+
github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
383385
github.com/bufbuild/buf v1.4.0 h1:GqE3a8CMmcFvWPzuY3Mahf9Kf3S9XgZ/ORpfYFzO+90=
384386
github.com/bufbuild/buf v1.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI=
385387
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
@@ -963,6 +965,7 @@ github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGK
963965
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
964966
github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
965967
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
968+
github.com/go-redis/redis/v8 v8.4.2/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M=
966969
github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
967970
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
968971
github.com/go-redsync/redsync/v4 v4.8.1 h1:rq2RvdTI0obznMdxKUWGdmmulo7lS9yCzb8fgDKOlbM=
@@ -1765,6 +1768,7 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0
17651768
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
17661769
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
17671770
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
1771+
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
17681772
github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
17691773
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
17701774
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
@@ -1927,8 +1931,9 @@ github.com/qustavo/sqlhooks/v2 v2.1.0/go.mod h1:aMREyKo7fOKTwiLuWPsaHRXEmtqG4yRE
19271931
github.com/rafaeljusto/redigomock/v3 v3.1.2 h1:B4Y0XJQiPjpwYmkH55aratKX1VfR+JRqzmDKyZbC99o=
19281932
github.com/rafaeljusto/redigomock/v3 v3.1.2/go.mod h1:F9zPqz8rMriScZkPtUiLJoLruYcpGo/XXREpeyasREM=
19291933
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q=
1930-
github.com/redis/go-redis/v9 v9.0.2 h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE=
19311934
github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps=
1935+
github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
1936+
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
19321937
github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA=
19331938
github.com/ricochet2200/go-disk-usage/du v0.0.0-20210707232629-ac9918953285 h1:d54EL9l+XteliUfUCGsEwwuk65dmmxX85VXF+9T6+50=
19341939
github.com/ricochet2200/go-disk-usage/du v0.0.0-20210707232629-ac9918953285/go.mod h1:fxIDly1xtudczrZeOOlfaUvd2OPb2qZAPuWdU2BsBTk=
@@ -2139,8 +2144,8 @@ github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ
21392144
github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg=
21402145
github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
21412146
github.com/testcontainers/testcontainers-go v0.19.0/go.mod h1:3YsSoxK0rGEUzbGD4gUVt1Nm3GJpCIq94GX+2LSf3d4=
2142-
github.com/throttled/throttled/v2 v2.9.0 h1:DOkCb1el7NYzRoPb1pyeHVghsUoonVWEjmo34vrcp/8=
2143-
github.com/throttled/throttled/v2 v2.9.0/go.mod h1:0JHxhGAidPyqbgD4HF8Y1sNFfG0ffVXK6C8EpkNdLEM=
2147+
github.com/throttled/throttled/v2 v2.12.0 h1:IezKE1uHlYC/0Al05oZV6Ar+uN/znw3cy9J8banxhEY=
2148+
github.com/throttled/throttled/v2 v2.12.0/go.mod h1:+EAvrG2hZAQTx8oMpBu8fq6Xmm+d1P2luKK7fIY1Esc=
21442149
github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w=
21452150
github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
21462151
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
@@ -2354,6 +2359,7 @@ go.opentelemetry.io/contrib/propagators/jaeger v1.14.0 h1:j6Xah53xRDrR+K1c4Y1uVH
23542359
go.opentelemetry.io/contrib/propagators/jaeger v1.14.0/go.mod h1:viOfwr1OqHmCF6G3KvKnnmpSJUX/rLzXztU18FC9ymU=
23552360
go.opentelemetry.io/contrib/propagators/ot v1.14.0 h1:jqxznjMkz/3l4NUsYq4OMbP+zs5twBbCZwSlSt82KXo=
23562361
go.opentelemetry.io/contrib/propagators/ot v1.14.0/go.mod h1:0qeUHgw3lmmZupgaft3m2/K6ip+pzqwePuW/lvU7ia4=
2362+
go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw=
23572363
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
23582364
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
23592365
go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=
@@ -2837,6 +2843,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
28372843
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
28382844
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
28392845
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
2846+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
28402847
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
28412848
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
28422849
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
@@ -3225,7 +3232,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32253232
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32263233
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32273234
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
3228-
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32293235
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32303236
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
32313237
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

0 commit comments

Comments
 (0)