Skip to content

Commit 5823c50

Browse files
authored
feat: add gzip pool to reuse the reader (#950)
1 parent d55d1f6 commit 5823c50

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

stream.go

+9-12
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,12 @@ func decodeXML(r io.Reader, v any) error {
8181
return nil
8282
}
8383

84-
func decompressGzip(r io.ReadCloser) (io.ReadCloser, error) {
85-
nr, err := gzip.NewReader(r)
86-
if err != nil {
87-
return nil, err
88-
}
89-
90-
gz := &gzipReader{s: r, r: nr}
84+
var gzipPool = sync.Pool{New: func() any { return new(gzip.Reader) }}
9185

92-
return gz, nil
86+
func decompressGzip(r io.ReadCloser) (io.ReadCloser, error) {
87+
gr := gzipPool.Get().(*gzip.Reader)
88+
err := gr.Reset(r)
89+
return &gzipReader{s: r, r: gr}, err
9390
}
9491

9592
type gzipReader struct {
@@ -102,7 +99,8 @@ func (gz *gzipReader) Read(p []byte) (n int, err error) {
10299
}
103100

104101
func (gz *gzipReader) Close() error {
105-
closeq(gz.r)
102+
gz.r.Reset(nopReader{})
103+
gzipPool.Put(gz.r)
106104
closeq(gz.s)
107105
return nil
108106
}
@@ -125,9 +123,8 @@ func (d *deflateReader) Read(p []byte) (n int, err error) {
125123
}
126124

127125
func (d *deflateReader) Close() error {
128-
if err := d.r.(flate.Resetter).Reset(nopReader{}, nil); err == nil {
129-
flatePool.Put(d.r)
130-
}
126+
d.r.(flate.Resetter).Reset(nopReader{}, nil)
127+
flatePool.Put(d.r)
131128
closeq(d.s)
132129
return nil
133130
}

0 commit comments

Comments
 (0)