Skip to content

Commit bfe8fb4

Browse files
Keep encoder pools reusable for compression
1 parent 18d5c7b commit bfe8fb4

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

config/configcompression/compressiontype.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (ct *TypeWithLevel) UnmarshalText(in []byte) error {
4343
parts := strings.Split(string(in), "/")
4444
compressionTyp = Type(parts[0])
4545
level = zlib.DefaultCompression
46-
if len(parts) > 1 {
46+
if len(parts) == 2 {
4747
level, err = strconv.Atoi(parts[1])
4848
if err != nil {
4949
return fmt.Errorf("invalid compression level: %q", parts[1])

config/confighttp/compressor.go

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,47 @@ type compressor struct {
2626
pool sync.Pool
2727
}
2828

29+
var (
30+
gZipCompressor = &compressor{}
31+
snappyCompressor = &compressor{}
32+
zstdCompressor = &compressor{}
33+
zlibCompressor = &compressor{}
34+
_ writeCloserReset = (*gzip.Writer)(nil)
35+
_ writeCloserReset = (*snappy.Writer)(nil)
36+
_ writeCloserReset = (*zstd.Encoder)(nil)
37+
_ writeCloserReset = (*zlib.Writer)(nil)
38+
)
39+
2940
// writerFactory defines writer field in CompressRoundTripper.
3041
// The validity of input is already checked when NewCompressRoundTripper was called in confighttp,
3142
func newCompressor(compressionType configcompression.TypeWithLevel) (*compressor, error) {
32-
// compressionType, compressionLevel := getCompression(compressionType)
33-
3443
switch compressionType.Type {
3544
case configcompression.TypeGzip:
36-
var _ writeCloserReset = (*gzip.Writer)(nil)
37-
return &compressor{pool: sync.Pool{New: func() any { w, _ := gzip.NewWriterLevel(nil, int(compressionType.Level)); return w }}}, nil
45+
if gZipCompressor.pool.Get() == nil {
46+
gZipCompressor.pool = sync.Pool{New: func() any { w, _ := gzip.NewWriterLevel(nil, int(compressionType.Level)); return w }}
47+
return gZipCompressor, nil
48+
}
49+
return gZipCompressor, nil
3850
case configcompression.TypeSnappy:
39-
var _ writeCloserReset = (*snappy.Writer)(nil)
40-
return &compressor{pool: sync.Pool{New: func() any { return snappy.NewBufferedWriter(nil) }}}, nil
51+
if snappyCompressor.pool.Get() == nil {
52+
snappyCompressor.pool = sync.Pool{New: func() any { return snappy.NewBufferedWriter(nil) }}
53+
return snappyCompressor, nil
54+
}
55+
return snappyCompressor, nil
4156
case configcompression.TypeZstd:
42-
var _ writeCloserReset = (*zstd.Encoder)(nil)
43-
compression := zstd.EncoderLevelFromZstd(int(compressionType.Level))
44-
encoderLevel := zstd.WithEncoderLevel(compression)
45-
return &compressor{pool: sync.Pool{New: func() any { zw, _ := zstd.NewWriter(nil, zstd.WithEncoderConcurrency(1), encoderLevel); return zw }}}, nil
57+
if zstdCompressor.pool.Get() == nil {
58+
compression := zstd.EncoderLevelFromZstd(int(compressionType.Level))
59+
encoderLevel := zstd.WithEncoderLevel(compression)
60+
zstdCompressor.pool = sync.Pool{New: func() any { zw, _ := zstd.NewWriter(nil, zstd.WithEncoderConcurrency(1), encoderLevel); return zw }}
61+
return zstdCompressor, nil
62+
}
63+
return zstdCompressor, nil
4664
case configcompression.TypeZlib, configcompression.TypeDeflate:
47-
var _ writeCloserReset = (*zlib.Writer)(nil)
48-
return &compressor{pool: sync.Pool{New: func() any { w, _ := zlib.NewWriterLevel(nil, int(compressionType.Level)); return w }}}, nil
65+
if zlibCompressor.pool.Get() == nil {
66+
zlibCompressor.pool = sync.Pool{New: func() any { w, _ := zlib.NewWriterLevel(nil, int(compressionType.Level)); return w }}
67+
return zlibCompressor, nil
68+
}
69+
return zlibCompressor, nil
4970
}
5071
return nil, errors.New("unsupported compression type")
5172
}

0 commit comments

Comments
 (0)