Merge pull request #83452 from wojtek-t/avoid_unnecessary_identifier_computations

Avoid unnecessary identifier computations
This commit is contained in:
Kubernetes Prow Robot 2019-10-04 13:23:11 -07:00 committed by GitHub
commit 386a27fd44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 11 deletions

View File

@ -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)
} }

View File

@ -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)
}
}
}

View File

@ -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