From 2f7b4ca6851aa3d479c9af3c14a168b4974f2fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Zi=C4=99ba?= Date: Tue, 18 Oct 2022 12:27:50 +0000 Subject: [PATCH] Fix APF width estimate for creating service account's token --- .../request/mutating_work_estimator.go | 18 +++++++++++++ .../util/flowcontrol/request/width_test.go | 27 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/mutating_work_estimator.go b/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/mutating_work_estimator.go index 990aa63241a..305f8e1ebb5 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/mutating_work_estimator.go +++ b/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/mutating_work_estimator.go @@ -57,6 +57,15 @@ func (e *mutatingWorkEstimator) estimate(r *http.Request, flowSchemaName, priori AdditionalLatency: e.config.eventAdditionalDuration(), } } + + if isRequestExemptFromWatchEvents(requestInfo) { + return WorkEstimate{ + InitialSeats: e.config.MinimumSeats, + FinalSeats: 0, + AdditionalLatency: time.Duration(0), + } + } + watchCount := e.countFn(requestInfo) metrics.ObserveWatchCount(r.Context(), priorityLevelName, flowSchemaName, watchCount) @@ -129,3 +138,12 @@ func (e *mutatingWorkEstimator) estimate(r *http.Request, flowSchemaName, priori AdditionalLatency: additionalLatency, } } + +func isRequestExemptFromWatchEvents(requestInfo *apirequest.RequestInfo) bool { + // Creating token for service account does not produce any event, + // but still serviceaccounts can have multiple watchers. + if requestInfo.Resource == "serviceaccounts" && requestInfo.Subresource == "token" { + return true + } + return false +} diff --git a/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/width_test.go b/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/width_test.go index c51164488a2..fb1e894e9eb 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/width_test.go +++ b/staging/src/k8s.io/apiserver/pkg/util/flowcontrol/request/width_test.go @@ -410,6 +410,33 @@ func TestWorkEstimator(t *testing.T) { finalSeatsExpected: 3, additionalLatencyExpected: 5 * time.Millisecond, }, + { + name: "creating token for service account", + requestURI: "http://server/api/v1/namespaces/foo/serviceaccounts/default/token", + requestInfo: &apirequest.RequestInfo{ + Verb: "create", + APIGroup: "v1", + Resource: "serviceaccounts", + Subresource: "token", + }, + watchCount: 5777, + initialSeatsExpected: minimumSeats, + finalSeatsExpected: 0, + additionalLatencyExpected: 0, + }, + { + name: "creating service account", + requestURI: "http://server/api/v1/namespaces/foo/serviceaccounts", + requestInfo: &apirequest.RequestInfo{ + Verb: "create", + APIGroup: "v1", + Resource: "serviceaccounts", + }, + watchCount: 1000, + initialSeatsExpected: 1, + finalSeatsExpected: maximumSeats, + additionalLatencyExpected: 50 * time.Millisecond, + }, } for _, test := range tests {