Skip to content

Commit

Permalink
feat: add flate pool to reuse the reader (#949)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeevatkm authored Jan 13, 2025
1 parent ce2c0be commit 1ce39e1
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
8 changes: 8 additions & 0 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{})
Expand Down
23 changes: 16 additions & 7 deletions stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"encoding/xml"
"errors"
"io"
"sync"
)

var (
Expand Down Expand Up @@ -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 {
Expand All @@ -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
}
Expand Down Expand Up @@ -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 }

0 comments on commit 1ce39e1

Please sign in to comment.