From a7c71c1cdc875870faee891d63126dcfc2df2d42 Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Mon, 30 Apr 2018 16:07:23 -0700 Subject: [PATCH] client: reset encoders between uses According to go/codec's docs, Reset(...) should be called on Decoders/Encoders before reuse: https://godoc.org/github.com/ugorji/go/codec I could find no evidence that *not* calling Reset() caused bugs, but might as well do what the docs say? --- client/fs_endpoint.go | 7 +++++-- command/agent/fs_endpoint.go | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/client/fs_endpoint.go b/client/fs_endpoint.go index eaff009c7..9349b184b 100644 --- a/client/fs_endpoint.go +++ b/client/fs_endpoint.go @@ -294,6 +294,7 @@ OUTER: streamErr = err break OUTER } + encoder.Reset(conn) case <-ctx.Done(): break OUTER } @@ -405,8 +406,6 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) { frames := make(chan *sframer.StreamFrame, streamFramesBuffer) errCh := make(chan error) - var buf bytes.Buffer - frameCodec := codec.NewEncoder(&buf, structs.JsonHandle) // Start streaming go func() { @@ -437,6 +436,8 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) { }() var streamErr error + buf := new(bytes.Buffer) + frameCodec := codec.NewEncoder(buf, structs.JsonHandle) OUTER: for { select { @@ -455,6 +456,7 @@ OUTER: streamErr = err break OUTER } + frameCodec.Reset(buf) resp.Payload = buf.Bytes() buf.Reset() @@ -464,6 +466,7 @@ OUTER: streamErr = err break OUTER } + encoder.Reset(conn) } } diff --git a/command/agent/fs_endpoint.go b/command/agent/fs_endpoint.go index c19684c89..0f5f29c27 100644 --- a/command/agent/fs_endpoint.go +++ b/command/agent/fs_endpoint.go @@ -361,6 +361,7 @@ func (s *HTTPServer) fsStreamImpl(resp http.ResponseWriter, cancel() return } + encoder.Reset(httpPipe) for { select { @@ -377,6 +378,7 @@ func (s *HTTPServer) fsStreamImpl(resp http.ResponseWriter, cancel() return } + decoder.Reset(httpPipe) if err := res.Error; err != nil { if err.Code != nil {