From c4bec1585fe9c31303c928c11ac45e380d2eaf77 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 23 May 2016 12:35:36 -0400 Subject: [PATCH] Delay flush if the watch queue has pending items Simple deferral of flush can reduce Syscalls when watch queues build up. --- pkg/apiserver/watch.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/apiserver/watch.go b/pkg/apiserver/watch.go index 8094ac9c00..9f3d393bb9 100644 --- a/pkg/apiserver/watch.go +++ b/pkg/apiserver/watch.go @@ -168,13 +168,14 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { flusher.Flush() buf := &bytes.Buffer{} + ch := s.watching.ResultChan() for { select { case <-cn.CloseNotify(): return case <-timeoutCh: return - case event, ok := <-s.watching.ResultChan(): + case event, ok := <-ch: if !ok { // End of results. return @@ -196,7 +197,9 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { // client disconnect. return } - flusher.Flush() + if len(ch) == 0 { + flusher.Flush() + } buf.Reset() }