25
25
package compression
26
26
27
27
import (
28
+ "sync"
29
+
28
30
"github.com/DataDog/zstd"
29
31
log "github.com/sirupsen/logrus"
30
32
)
31
33
32
34
type zstdCGoProvider struct {
33
- ctx zstd. Ctx
35
+ ctxPool sync. Pool
34
36
level Level
35
37
zstdLevel int
36
38
}
37
39
38
40
func newCGoZStdProvider (level Level ) Provider {
39
41
z := & zstdCGoProvider {
40
- ctx : zstd .NewCtx (),
42
+ ctxPool : sync.Pool {New : func () any {
43
+ return zstd .NewCtx ()
44
+ }},
41
45
}
42
46
43
47
switch level {
@@ -61,7 +65,9 @@ func (z *zstdCGoProvider) CompressMaxSize(originalSize int) int {
61
65
}
62
66
63
67
func (z * zstdCGoProvider ) Compress (dst , src []byte ) []byte {
64
- out , err := z .ctx .CompressLevel (dst , src , z .zstdLevel )
68
+ ctx := z .ctxPool .Get ().(zstd.Ctx )
69
+ defer z .ctxPool .Put (ctx )
70
+ out , err := ctx .CompressLevel (dst , src , z .zstdLevel )
65
71
if err != nil {
66
72
log .WithError (err ).Fatal ("Failed to compress" )
67
73
}
@@ -70,7 +76,9 @@ func (z *zstdCGoProvider) Compress(dst, src []byte) []byte {
70
76
}
71
77
72
78
func (z * zstdCGoProvider ) Decompress (dst , src []byte , originalSize int ) ([]byte , error ) {
73
- return z .ctx .Decompress (dst , src )
79
+ ctx := z .ctxPool .Get ().(zstd.Ctx )
80
+ defer z .ctxPool .Put (ctx )
81
+ return ctx .Decompress (dst , src )
74
82
}
75
83
76
84
func (z * zstdCGoProvider ) Close () error {
0 commit comments