Skip to content

Commit 6691dda

Browse files
author
Achille
authored
upgrade github.com/klauspost/compress to v1.15.1 and remove the need for runtime finalizers (#889)
* upgrade github.com/klauspost/compress to v1.15.1 and remove the need for runtime finalizers * remove lowmem config
1 parent 886284f commit 6691dda

File tree

1 file changed

+24
-36
lines changed

1 file changed

+24
-36
lines changed

compress/zstd/zstd.go

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package zstd
33

44
import (
55
"io"
6-
"runtime"
76
"sync"
87

98
"github.com/klauspost/compress/zstd"
@@ -29,19 +28,17 @@ func (c *Codec) Name() string { return "zstd" }
2928
// NewReader implements the compress.Codec interface.
3029
func (c *Codec) NewReader(r io.Reader) io.ReadCloser {
3130
p := new(reader)
32-
if dec, _ := decoderPool.Get().(*decoder); dec == nil {
33-
z, err := zstd.NewReader(r)
31+
if p.dec, _ = decoderPool.Get().(*zstd.Decoder); p.dec != nil {
32+
p.dec.Reset(r)
33+
} else {
34+
z, err := zstd.NewReader(r,
35+
zstd.WithDecoderConcurrency(1),
36+
)
3437
if err != nil {
3538
p.err = err
3639
} else {
37-
p.dec = &decoder{z}
38-
// We need a finalizer because the reader spawns goroutines
39-
// that will only be stopped if the Close method is called.
40-
runtime.SetFinalizer(p.dec, (*decoder).finalize)
40+
p.dec = z
4141
}
42-
} else {
43-
p.dec = dec
44-
p.err = dec.Reset(r)
4542
}
4643
return p
4744
}
@@ -57,18 +54,10 @@ func (c *Codec) zstdLevel() zstd.EncoderLevel {
5754
return zstd.EncoderLevelFromZstd(c.level())
5855
}
5956

60-
var decoderPool sync.Pool // *decoder
61-
62-
type decoder struct {
63-
*zstd.Decoder
64-
}
65-
66-
func (d *decoder) finalize() {
67-
d.Close()
68-
}
57+
var decoderPool sync.Pool // *zstd.Decoder
6958

7059
type reader struct {
71-
dec *decoder
60+
dec *zstd.Decoder
7261
err error
7362
}
7463

@@ -88,6 +77,9 @@ func (r *reader) Read(p []byte) (int, error) {
8877
if r.err != nil {
8978
return 0, r.err
9079
}
80+
if r.dec == nil {
81+
return 0, io.EOF
82+
}
9183
return r.dec.Read(p)
9284
}
9385

@@ -96,21 +88,25 @@ func (r *reader) WriteTo(w io.Writer) (int64, error) {
9688
if r.err != nil {
9789
return 0, r.err
9890
}
91+
if r.dec == nil {
92+
return 0, io.ErrClosedPipe
93+
}
9994
return r.dec.WriteTo(w)
10095
}
10196

10297
// NewWriter implements the compress.Codec interface.
10398
func (c *Codec) NewWriter(w io.Writer) io.WriteCloser {
10499
p := new(writer)
105-
if enc, _ := c.encoderPool.Get().(*encoder); enc == nil {
106-
z, err := zstd.NewWriter(w, zstd.WithEncoderLevel(c.zstdLevel()))
100+
if enc, _ := c.encoderPool.Get().(*zstd.Encoder); enc == nil {
101+
z, err := zstd.NewWriter(w,
102+
zstd.WithEncoderLevel(c.zstdLevel()),
103+
zstd.WithEncoderConcurrency(1),
104+
zstd.WithZeroFrames(true),
105+
)
107106
if err != nil {
108107
p.err = err
109108
} else {
110-
p.enc = &encoder{z}
111-
// We need a finalizer because the writer spawns goroutines
112-
// that will only be stopped if the Close method is called.
113-
runtime.SetFinalizer(p.enc, (*encoder).finalize)
109+
p.enc = z
114110
}
115111
} else {
116112
p.enc = enc
@@ -120,17 +116,9 @@ func (c *Codec) NewWriter(w io.Writer) io.WriteCloser {
120116
return p
121117
}
122118

123-
type encoder struct {
124-
*zstd.Encoder
125-
}
126-
127-
func (e *encoder) finalize() {
128-
e.Close()
129-
}
130-
131119
type writer struct {
132120
c *Codec
133-
enc *encoder
121+
enc *zstd.Encoder
134122
err error
135123
}
136124

@@ -149,7 +137,7 @@ func (w *writer) Close() error {
149137
w.enc = nil
150138
return err
151139
}
152-
return nil
140+
return w.err
153141
}
154142

155143
// WriteTo implements the io.WriterTo interface.

0 commit comments

Comments
 (0)