From 1ce39e1792bcc3e1617be482f1658317297b7516 Mon Sep 17 00:00:00 2001 From: "Jeevanandam M." Date: Sun, 12 Jan 2025 19:44:54 -0800 Subject: [PATCH] feat: add flate pool to reuse the reader (#949) --- client_test.go | 8 ++++++++ stream.go | 23 ++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/client_test.go b/client_test.go index 258c374f..2977ec25 100644 --- a/client_test.go +++ b/client_test.go @@ -538,6 +538,14 @@ func TestClientSettingsCoverage(t *testing.T) { c.EnableRetryDefaultConditions() assertEqual(t, true, c.IsRetryDefaultConditions()) + nr := nopReader{} + n, err1 := nr.Read(nil) + assertEqual(t, 0, n) + assertEqual(t, io.EOF, err1) + b, err1 := nr.ReadByte() + assertEqual(t, byte(0), b) + assertEqual(t, io.EOF, err1) + // [Start] Custom Transport scenario ct := dcnl() ct.SetTransport(&CustomRoundTripper1{}) diff --git a/stream.go b/stream.go index 14c0f885..1153a2e2 100644 --- a/stream.go +++ b/stream.go @@ -13,6 +13,7 @@ import ( "encoding/xml" "errors" "io" + "sync" ) var ( @@ -106,13 +107,12 @@ func (gz *gzipReader) Close() error { return nil } -func decompressDeflate(r io.ReadCloser) (io.ReadCloser, error) { - d := &deflateReader{ - s: r, - r: flate.NewReader(r), - } +var flatePool = sync.Pool{New: func() any { return flate.NewReader(nopReader{}) }} - return d, nil +func decompressDeflate(r io.ReadCloser) (io.ReadCloser, error) { + fr := flatePool.Get().(io.ReadCloser) + err := fr.(flate.Resetter).Reset(r, nil) + return &deflateReader{s: r, r: fr}, err } type deflateReader struct { @@ -125,7 +125,9 @@ func (d *deflateReader) Read(p []byte) (n int, err error) { } func (d *deflateReader) Close() error { - closeq(d.r) + if err := d.r.(flate.Resetter).Reset(nopReader{}, nil); err == nil { + flatePool.Put(d.r) + } closeq(d.s) return nil } @@ -209,3 +211,10 @@ func (r *nopReadCloser) Read(p []byte) (int, error) { } func (r *nopReadCloser) Close() error { return nil } + +var _ flate.Reader = (*nopReader)(nil) + +type nopReader struct{} + +func (nopReader) Read([]byte) (int, error) { return 0, io.EOF } +func (nopReader) ReadByte() (byte, error) { return 0, io.EOF }