cubefs
50 строк · 1.3 Кб
1package sarama
2
3import (
4"sync"
5
6"github.com/klauspost/compress/zstd"
7)
8
9type ZstdEncoderParams struct {
10Level int
11}
12type ZstdDecoderParams struct {
13}
14
15var zstdEncMap, zstdDecMap sync.Map
16
17func getEncoder(params ZstdEncoderParams) *zstd.Encoder {
18if ret, ok := zstdEncMap.Load(params); ok {
19return ret.(*zstd.Encoder)
20}
21// It's possible to race and create multiple new writers.
22// Only one will survive GC after use.
23encoderLevel := zstd.SpeedDefault
24if params.Level != CompressionLevelDefault {
25encoderLevel = zstd.EncoderLevelFromZstd(params.Level)
26}
27zstdEnc, _ := zstd.NewWriter(nil, zstd.WithZeroFrames(true),
28zstd.WithEncoderLevel(encoderLevel))
29zstdEncMap.Store(params, zstdEnc)
30return zstdEnc
31}
32
33func getDecoder(params ZstdDecoderParams) *zstd.Decoder {
34if ret, ok := zstdDecMap.Load(params); ok {
35return ret.(*zstd.Decoder)
36}
37// It's possible to race and create multiple new readers.
38// Only one will survive GC after use.
39zstdDec, _ := zstd.NewReader(nil)
40zstdDecMap.Store(params, zstdDec)
41return zstdDec
42}
43
44func zstdDecompress(params ZstdDecoderParams, dst, src []byte) ([]byte, error) {
45return getDecoder(params).DecodeAll(src, dst)
46}
47
48func zstdCompress(params ZstdEncoderParams, dst, src []byte) ([]byte, error) {
49return getEncoder(params).EncodeAll(src, dst), nil
50}
51