Skip to content

Commit 386a27f

Browse files
authored
Merge pull request kubernetes#83452 from wojtek-t/avoid_unnecessary_identifier_computations
Avoid unnecessary identifier computations
2 parents ca03811 + c076bfc commit 386a27f

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"encoding/json"
2121
"io"
2222
"reflect"
23+
"sync"
2324

2425
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2526
"k8s.io/apimachinery/pkg/runtime"
@@ -88,21 +89,34 @@ type codec struct {
8889
originalSchemeName string
8990
}
9091

92+
var identifiersMap sync.Map
93+
94+
type codecIdentifier struct {
95+
EncodeGV string `json:"encodeGV,omitempty"`
96+
Encoder string `json:"encoder,omitempty"`
97+
Name string `json:"name,omitempty"`
98+
}
99+
91100
// identifier computes Identifier of Encoder based on codec parameters.
92101
func identifier(encodeGV runtime.GroupVersioner, encoder runtime.Encoder) runtime.Identifier {
93-
result := map[string]string{
94-
"name": "versioning",
102+
result := codecIdentifier{
103+
Name: "versioning",
95104
}
105+
96106
if encodeGV != nil {
97-
result["encodeGV"] = encodeGV.Identifier()
107+
result.EncodeGV = encodeGV.Identifier()
98108
}
99109
if encoder != nil {
100-
result["encoder"] = string(encoder.Identifier())
110+
result.Encoder = string(encoder.Identifier())
111+
}
112+
if id, ok := identifiersMap.Load(result); ok {
113+
return id.(runtime.Identifier)
101114
}
102115
identifier, err := json.Marshal(result)
103116
if err != nil {
104117
klog.Fatalf("Failed marshaling identifier for codec: %v", err)
105118
}
119+
identifiersMap.Store(result, runtime.Identifier(identifier))
106120
return runtime.Identifier(identifier)
107121
}
108122

staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,16 @@ func TestCacheableObject(t *testing.T) {
381381

382382
runtimetesting.CacheableObjectTest(t, encoder)
383383
}
384+
385+
func BenchmarkIdentifier(b *testing.B) {
386+
encoder := &mockSerializer{}
387+
gv := schema.GroupVersion{Group: "group", Version: "version"}
388+
389+
for i := 0; i < b.N; i++ {
390+
id := identifier(gv, encoder)
391+
// Avoid optimizing by compiler.
392+
if id[0] != '{' {
393+
b.Errorf("unexpected identifier: %s", id)
394+
}
395+
}
396+
}

staging/src/k8s.io/apiserver/plugin/pkg/audit/log/backend.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,18 @@ var AllowedFormats = []string{
4444
}
4545

4646
type backend struct {
47-
out io.Writer
48-
format string
49-
groupVersion schema.GroupVersion
47+
out io.Writer
48+
format string
49+
encoder runtime.Encoder
5050
}
5151

5252
var _ audit.Backend = &backend{}
5353

5454
func NewBackend(out io.Writer, format string, groupVersion schema.GroupVersion) audit.Backend {
5555
return &backend{
56-
out: out,
57-
format: format,
58-
groupVersion: groupVersion,
56+
out: out,
57+
format: format,
58+
encoder: audit.Codecs.LegacyCodec(groupVersion),
5959
}
6060
}
6161

@@ -73,7 +73,7 @@ func (b *backend) logEvent(ev *auditinternal.Event) bool {
7373
case FormatLegacy:
7474
line = audit.EventString(ev) + "\n"
7575
case FormatJson:
76-
bs, err := runtime.Encode(audit.Codecs.LegacyCodec(b.groupVersion), ev)
76+
bs, err := runtime.Encode(b.encoder, ev)
7777
if err != nil {
7878
audit.HandlePluginError(PluginName, err, ev)
7979
return false

0 commit comments

Comments
 (0)