From 8e43494f09b1c56d9a5cdbbcd9ccc76396f654a7 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Tue, 26 Mar 2019 23:34:25 -0400 Subject: [PATCH] Avoid allocating the watch shim object more than once We can reset and reuse this object repeatedly without triggering an allocation. Kubernetes-commit: 316a87ce7dff525555483eaac962899fd365177d --- pkg/endpoints/handlers/watch.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/endpoints/handlers/watch.go b/pkg/endpoints/handlers/watch.go index 301423d84..5290b47c2 100644 --- a/pkg/endpoints/handlers/watch.go +++ b/pkg/endpoints/handlers/watch.go @@ -216,6 +216,7 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { var unknown runtime.Unknown internalEvent := &metav1.InternalEvent{} + outEvent := &metav1.WatchEvent{} buf := &bytes.Buffer{} ch := s.Watching.ResultChan() for { @@ -242,10 +243,11 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { unknown.Raw = buf.Bytes() event.Object = &unknown + *outEvent = metav1.WatchEvent{} + // create the external type directly and encode it. Clients will only recognize the serialization we provide. // The internal event is being reused, not reallocated so its just a few extra assignments to do it this way // and we get the benefit of using conversion functions which already have to stay in sync - outEvent := &metav1.WatchEvent{} *internalEvent = metav1.InternalEvent(event) err := metav1.Convert_v1_InternalEvent_To_v1_WatchEvent(internalEvent, outEvent, nil) if err != nil {