Skip to content

Commit

Permalink
Benchmark updates, session limiter workaround for test goroutine leak
Browse files Browse the repository at this point in the history
  • Loading branch information
Tit Petric authored and titpetric committed Jan 14, 2025
1 parent 68e65fe commit 9bf7735
Show file tree
Hide file tree
Showing 10 changed files with 48 additions and 18 deletions.
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

# Core API Squad ownership of CI test pipeline and developer tooling.

/bin/ @TykTechnologies/core-api-squad
.github/workflows/ci-tests.yml @TykTechnologies/core-api-squad
.github/workflows/release-tests.yml @TykTechnologies/core-api-squad
/.taskfiles/ @TykTechnologies/core-api-squad
Expand Down
12 changes: 9 additions & 3 deletions bin/ci-benchmark.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
#!/bin/bash

set -e

benchRegex=${1:-.}
# Build gw test binary
go test -o gateway.test -c ./gateway

BENCHMARKS=$(./gateway.test -test.list=Bench.+)

TYK_LOGLEVEL= go test -run=NONE -bench=$benchRegex || fatal "go test -run=NONE -bench=$benchRegex"
for benchmark in $BENCHMARKS; do
echo $benchmark
benchRegex="^${benchmark}$"
./gateway.test -test.run=^$ -test.bench=$benchRegex -test.count=1 -test.benchtime 10s -test.benchmem -test.cpuprofile=tyk-cpu.out -test.memprofile=mem.out -test.trace=trace.out
done
2 changes: 2 additions & 0 deletions gateway/api_definition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,8 @@ func (ts *Test) testPrepareDefaultVersion() (string, *APISpec) {
spec.Proxy.ListenPath = "/"

spec.UseKeylessAccess = false
spec.DisableRateLimit = true
spec.DisableQuota = true
})[0]

return CreateSession(ts.Gw, func(s *user.SessionState) {
Expand Down
2 changes: 2 additions & 0 deletions gateway/event_system_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ func TestInitGenericEventHandlers(t *testing.T) {
}

func BenchmarkInitGenericEventHandlers(b *testing.B) {
b.Skip()

ts := StartTest(nil)
defer ts.Close()

Expand Down
3 changes: 2 additions & 1 deletion gateway/mw_basic_auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ func genAuthHeader(username, password string) string {
}

func (ts *Test) testPrepareBasicAuth(cacheDisabled bool) *user.SessionState {

session := CreateStandardSession()
session.BasicAuthData.Password = "password"
session.AccessRights = map[string]user.AccessDefinition{"test": {APIID: "test", Versions: []string{"v1"}}}
Expand All @@ -33,6 +32,8 @@ func (ts *Test) testPrepareBasicAuth(cacheDisabled bool) *user.SessionState {
spec.UseKeylessAccess = false
spec.Proxy.ListenPath = "/"
spec.OrgID = "default"
spec.DisableRateLimit = true
spec.DisableQuota = true
})

return session
Expand Down
10 changes: 10 additions & 0 deletions gateway/mw_jwt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ func (ts *Test) prepareGenericJWTSession(testName string, method string, claimNa
spec.EnableJWT = true
spec.Proxy.ListenPath = "/"
spec.JWTSkipKid = ApiSkipKid
spec.DisableRateLimit = true
spec.DisableQuota = true

if claimName != KID {
spec.JWTIdentityBaseField = claimName
Expand Down Expand Up @@ -471,6 +473,8 @@ func (ts *Test) prepareJWTSessionRSAWithRawSourceOnWithClientID(isBench bool) st
spec.JWTIdentityBaseField = "user_id"
spec.JWTClientIDBaseField = "azp"
spec.Proxy.ListenPath = "/"
spec.DisableRateLimit = true
spec.DisableQuota = true
})[0]

policyID := ts.CreatePolicy(func(p *user.Policy) {
Expand Down Expand Up @@ -552,6 +556,8 @@ func (ts *Test) prepareJWTSessionRSAWithRawSource() string {
spec.JWTIdentityBaseField = "user_id"
spec.JWTPolicyFieldName = "policy_id"
spec.Proxy.ListenPath = "/"
spec.DisableRateLimit = true
spec.DisableQuota = true
})

pID := ts.CreatePolicy(func(p *user.Policy) {
Expand Down Expand Up @@ -1511,6 +1517,8 @@ func (ts *Test) prepareJWTSessionRSAWithJWK() string {
spec.JWTIdentityBaseField = "user_id"
spec.JWTPolicyFieldName = "policy_id"
spec.Proxy.ListenPath = "/"
spec.DisableRateLimit = true
spec.DisableQuota = true
})

pID := ts.CreatePolicy(func(p *user.Policy) {
Expand Down Expand Up @@ -1579,6 +1587,8 @@ func (ts *Test) prepareJWTSessionRSAWithEncodedJWK() (*APISpec, string) {
spec.JWTIdentityBaseField = "user_id"
spec.JWTPolicyFieldName = "policy_id"
spec.Proxy.ListenPath = "/"
spec.DisableRateLimit = true
spec.DisableQuota = true
})[0]

pID := ts.CreatePolicy(func(p *user.Policy) {
Expand Down
16 changes: 9 additions & 7 deletions gateway/mw_transform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,17 @@ func BenchmarkTransformNonAscii(b *testing.B) {
ts := StartTest(nil)
defer ts.Close()

spec := APISpec{}
base := &BaseMiddleware{Spec: &spec, Gw: ts.Gw}
base.Spec.EnableContextVars = false
transform := TransformMiddleware{base}
spec := &APISpec{
APIDefinition: &apidef.APIDefinition{},
}
base := &BaseMiddleware{Spec: spec, Gw: ts.Gw}

transform := &TransformMiddleware{base}

for i := 0; i < b.N; i++ {
r := TestReq(b, "GET", "/", in)

if err := transformBody(r, tmeta, &transform); err != nil {
if err := transformBody(r, tmeta, transform); err != nil {
b.Fatalf("wanted nil error, got %v", err)
}
}
Expand Down Expand Up @@ -236,9 +238,9 @@ func BenchmarkTransformJSONMarshal(b *testing.B) {
ts := StartTest(nil)
defer ts.Close()

spec := APISpec{}
spec := APISpec{APIDefinition: &apidef.APIDefinition{}}
base := &BaseMiddleware{Spec: &spec, Gw: ts.Gw}
base.Spec.EnableContextVars = false

transform := TransformMiddleware{base}

for i := 0; i < b.N; i++ {
Expand Down
2 changes: 2 additions & 0 deletions gateway/oauth_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1401,6 +1401,8 @@ func TestPurgeOAuthClientTokens(t *testing.T) {
}

func BenchmarkPurgeLapsedOAuthTokens(b *testing.B) {
b.Skip()

conf := func(globalConf *config.Config) {
// set tokens to be expired after 1 second
globalConf.OauthTokenExpire = 1
Expand Down
13 changes: 7 additions & 6 deletions gateway/res_handler_header_injector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ func testPrepareResponseHeaderInjection(ts *Test) {
spec.UseKeylessAccess = true
spec.Proxy.ListenPath = "/"
spec.OrgID = "default"
spec.DisableRateLimit = true
spec.DisableQuota = true
UpdateAPIVersion(spec, "v1", func(v *apidef.VersionInfo) {
v.UseExtendedPaths = true
json.Unmarshal([]byte(`[
Expand Down Expand Up @@ -136,10 +138,6 @@ func BenchmarkResponseHeaderInjection(b *testing.B) {
}

deleteHeaders := map[string]string{
"X-Tyk-Test": "1",
cachedResponseHeader: "1",
}
deleteHeadersCached := map[string]string{
"X-Tyk-Test": "1",
}

Expand All @@ -151,9 +149,12 @@ func BenchmarkResponseHeaderInjection(b *testing.B) {
{Method: "GET", Path: "/test-with-slash", HeadersMatch: addHeaders, HeadersNotMatch: deleteHeaders},
{Method: "GET", Path: "/test-no-slash", HeadersMatch: addHeaders, HeadersNotMatch: deleteHeaders},
{Method: "GET", Path: "/rewrite-test", HeadersMatch: addHeaders, HeadersNotMatch: deleteHeaders, BodyMatch: `"Url":"/newpath"`},
{Method: "GET", Path: "/rewrite-test", HeadersMatch: addHeadersCached, HeadersNotMatch: deleteHeadersCached, BodyMatch: `"X-I-Am":"Request"`},
{Method: "GET", Path: "/rewrite-test", HeadersMatch: addHeadersCached, HeadersNotMatch: deleteHeadersCached, BodyMatch: userAgent},
{Method: "GET", Path: "/rewrite-test", HeadersMatch: addHeadersCached, HeadersNotMatch: deleteHeaders, BodyMatch: `"X-I-Am":"Request"`},
{Method: "GET", Path: "/rewrite-test", HeadersMatch: addHeadersCached, HeadersNotMatch: deleteHeaders, BodyMatch: userAgent},
}...)

// It's a loop, first time won't be cached.
addHeaders[cachedResponseHeader] = "1"
}
}

Expand Down
5 changes: 4 additions & 1 deletion gateway/session_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ type SessionLimiter struct {
smoothing *rate.Smoothing
}

// Encourage reuse in NewSessionLimiter.
var sessionLimiterBucketStore = memorycache.New()

// NewSessionLimiter initializes the session limiter.
//
// The session limiter initializes the storage required for rate limiters.
Expand All @@ -70,7 +73,7 @@ func NewSessionLimiter(ctx context.Context, conf *config.Config, drlManager *drl
ctx: ctx,
drlManager: drlManager,
config: conf,
bucketStore: memorycache.New(),
bucketStore: sessionLimiterBucketStore,
}

log.Infof("[RATELIMIT] %s", conf.RateLimit.String())
Expand Down

0 comments on commit 9bf7735

Please sign in to comment.