This is an automated email from the ASF dual-hosted git repository.

yuxuan pushed a commit to branch go-header-zlib-pool
in repository https://gitbox.apache.org/repos/asf/thrift.git

commit 1cae41a6938f8975571f178a5d15785cc80c4b8f
Author: Yuxuan 'fishy' Wang <[email protected]>
AuthorDate: Mon Jun 10 11:39:23 2024 -0700

    go: Improve efficiency with zlib in THeaderTransport
    
    When enabled zlib in THeaderTransport we observed very high cpu
    overhead, use a pool for zlib writers to improve efficiency.
---
 lib/go/thrift/header_transport.go | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/lib/go/thrift/header_transport.go 
b/lib/go/thrift/header_transport.go
index d81fb29d3..8148796c7 100644
--- a/lib/go/thrift/header_transport.go
+++ b/lib/go/thrift/header_transport.go
@@ -211,6 +211,25 @@ func (tw *TransformWriter) Close() error {
        return nil
 }
 
+var zlibDefaultLevelWriterPool = newPool(
+       func() *zlib.Writer {
+               return zlib.NewWriter(nil)
+       },
+       nil,
+)
+
+type zlibPoolCloser struct {
+       writer *zlib.Writer
+}
+
+func (z *zlibPoolCloser) Close() error {
+       defer func() {
+               z.writer.Reset(nil)
+               zlibDefaultLevelWriterPool.put(&z.writer)
+       }()
+       return z.writer.Close()
+}
+
 // AddTransform adds a transform.
 func (tw *TransformWriter) AddTransform(id THeaderTransformID) error {
        switch id {
@@ -222,9 +241,12 @@ func (tw *TransformWriter) AddTransform(id 
THeaderTransformID) error {
        case TransformNone:
                // no-op
        case TransformZlib:
-               writeCloser := zlib.NewWriter(tw.Writer)
+               writeCloser := zlibDefaultLevelWriterPool.get()
+               writeCloser.Reset(tw.Writer)
                tw.Writer = writeCloser
-               tw.closers = append(tw.closers, writeCloser)
+               tw.closers = append(tw.closers, &zlibPoolCloser{
+                       writer: writeCloser,
+               })
        }
        return nil
 }

Reply via email to