mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Merge pull request #83452 from wojtek-t/avoid_unnecessary_identifier_computations
Avoid unnecessary identifier computations
This commit is contained in:
commit
386a27fd44
@ -20,6 +20,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -88,21 +89,34 @@ type codec struct {
|
|||||||
originalSchemeName string
|
originalSchemeName string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var identifiersMap sync.Map
|
||||||
|
|
||||||
|
type codecIdentifier struct {
|
||||||
|
EncodeGV string `json:"encodeGV,omitempty"`
|
||||||
|
Encoder string `json:"encoder,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// identifier computes Identifier of Encoder based on codec parameters.
|
// identifier computes Identifier of Encoder based on codec parameters.
|
||||||
func identifier(encodeGV runtime.GroupVersioner, encoder runtime.Encoder) runtime.Identifier {
|
func identifier(encodeGV runtime.GroupVersioner, encoder runtime.Encoder) runtime.Identifier {
|
||||||
result := map[string]string{
|
result := codecIdentifier{
|
||||||
"name": "versioning",
|
Name: "versioning",
|
||||||
}
|
}
|
||||||
|
|
||||||
if encodeGV != nil {
|
if encodeGV != nil {
|
||||||
result["encodeGV"] = encodeGV.Identifier()
|
result.EncodeGV = encodeGV.Identifier()
|
||||||
}
|
}
|
||||||
if encoder != nil {
|
if encoder != nil {
|
||||||
result["encoder"] = string(encoder.Identifier())
|
result.Encoder = string(encoder.Identifier())
|
||||||
|
}
|
||||||
|
if id, ok := identifiersMap.Load(result); ok {
|
||||||
|
return id.(runtime.Identifier)
|
||||||
}
|
}
|
||||||
identifier, err := json.Marshal(result)
|
identifier, err := json.Marshal(result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Fatalf("Failed marshaling identifier for codec: %v", err)
|
klog.Fatalf("Failed marshaling identifier for codec: %v", err)
|
||||||
}
|
}
|
||||||
|
identifiersMap.Store(result, runtime.Identifier(identifier))
|
||||||
return runtime.Identifier(identifier)
|
return runtime.Identifier(identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,3 +381,16 @@ func TestCacheableObject(t *testing.T) {
|
|||||||
|
|
||||||
runtimetesting.CacheableObjectTest(t, encoder)
|
runtimetesting.CacheableObjectTest(t, encoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkIdentifier(b *testing.B) {
|
||||||
|
encoder := &mockSerializer{}
|
||||||
|
gv := schema.GroupVersion{Group: "group", Version: "version"}
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
id := identifier(gv, encoder)
|
||||||
|
// Avoid optimizing by compiler.
|
||||||
|
if id[0] != '{' {
|
||||||
|
b.Errorf("unexpected identifier: %s", id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -44,18 +44,18 @@ var AllowedFormats = []string{
|
|||||||
}
|
}
|
||||||
|
|
||||||
type backend struct {
|
type backend struct {
|
||||||
out io.Writer
|
out io.Writer
|
||||||
format string
|
format string
|
||||||
groupVersion schema.GroupVersion
|
encoder runtime.Encoder
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ audit.Backend = &backend{}
|
var _ audit.Backend = &backend{}
|
||||||
|
|
||||||
func NewBackend(out io.Writer, format string, groupVersion schema.GroupVersion) audit.Backend {
|
func NewBackend(out io.Writer, format string, groupVersion schema.GroupVersion) audit.Backend {
|
||||||
return &backend{
|
return &backend{
|
||||||
out: out,
|
out: out,
|
||||||
format: format,
|
format: format,
|
||||||
groupVersion: groupVersion,
|
encoder: audit.Codecs.LegacyCodec(groupVersion),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ func (b *backend) logEvent(ev *auditinternal.Event) bool {
|
|||||||
case FormatLegacy:
|
case FormatLegacy:
|
||||||
line = audit.EventString(ev) + "\n"
|
line = audit.EventString(ev) + "\n"
|
||||||
case FormatJson:
|
case FormatJson:
|
||||||
bs, err := runtime.Encode(audit.Codecs.LegacyCodec(b.groupVersion), ev)
|
bs, err := runtime.Encode(b.encoder, ev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
audit.HandlePluginError(PluginName, err, ev)
|
audit.HandlePluginError(PluginName, err, ev)
|
||||||
return false
|
return false
|
||||||
|
Loading…
Reference in New Issue
Block a user