66 "github.com/cockroachdb/errors"
77 "github.com/cockroachdb/pebble/internal/base"
88 "github.com/golang/snappy"
9+ "github.com/minio/minlz"
910)
1011
1112type Compressor interface {
@@ -18,9 +19,11 @@ type Compressor interface {
1819
1920type noopCompressor struct {}
2021type snappyCompressor struct {}
22+ type minlzCompressor struct {}
2123
2224var _ Compressor = noopCompressor {}
2325var _ Compressor = snappyCompressor {}
26+ var _ Compressor = minlzCompressor {}
2427
2528func (noopCompressor ) Compress (dst , src []byte ) (CompressionIndicator , []byte ) {
2629 panic ("NoCompressionCompressor.Compress() should not be called." )
@@ -34,6 +37,21 @@ func (snappyCompressor) Compress(dst, src []byte) (CompressionIndicator, []byte)
3437
3538func (snappyCompressor ) Close () {}
3639
40+ func (minlzCompressor ) Compress (dst , src []byte ) (CompressionIndicator , []byte ) {
41+ // Minlz cannot encode blocks greater than 8MB. Fall back to Snappy in those cases.
42+ if len (src ) > minlz .MaxBlockSize {
43+ return (snappyCompressor {}).Compress (dst , src )
44+ }
45+
46+ compressed , err := minlz .Encode (dst , src , minlz .LevelFastest )
47+ if err != nil {
48+ panic (errors .Wrap (err , "minlz compression" ))
49+ }
50+ return MinlzCompressionIndicator , compressed
51+ }
52+
53+ func (minlzCompressor ) Close () {}
54+
3755func GetCompressor (c Compression ) Compressor {
3856 switch c {
3957 case NoCompression :
@@ -42,6 +60,8 @@ func GetCompressor(c Compression) Compressor {
4260 return snappyCompressor {}
4361 case ZstdCompression :
4462 return getZstdCompressor ()
63+ case MinlzCompression :
64+ return minlzCompressor {}
4565 default :
4666 panic ("Invalid compression type." )
4767 }
@@ -65,9 +85,11 @@ type Decompressor interface {
6585
6686type noopDecompressor struct {}
6787type snappyDecompressor struct {}
88+ type minlzDecompressor struct {}
6889
6990var _ Decompressor = noopDecompressor {}
7091var _ Decompressor = snappyDecompressor {}
92+ var _ Decompressor = minlzDecompressor {}
7193
7294func (noopDecompressor ) DecompressInto (dst , src []byte ) error {
7395 dst = dst [:len (src )]
@@ -94,8 +116,7 @@ func (snappyDecompressor) DecompressInto(buf, compressed []byte) error {
94116}
95117
96118func (snappyDecompressor ) DecompressedLen (b []byte ) (decompressedLen int , err error ) {
97- l , err := snappy .DecodedLen (b )
98- return l , err
119+ return snappy .DecodedLen (b )
99120}
100121
101122func (snappyDecompressor ) Close () {}
@@ -110,6 +131,22 @@ func (zstdDecompressor) DecompressedLen(b []byte) (decompressedLen int, err erro
110131 return int (decodedLenU64 ), nil
111132}
112133
134+ func (minlzDecompressor ) DecompressInto (buf , compressed []byte ) error {
135+ result , err := minlz .Decode (buf , compressed )
136+ if len (result ) != len (buf ) || (len (result ) > 0 && & result [0 ] != & buf [0 ]) {
137+ return base .CorruptionErrorf ("pebble/table: decompressed into unexpected buffer: %p != %p" ,
138+ errors .Safe (result ), errors .Safe (buf ))
139+ }
140+ return err
141+ }
142+
143+ func (minlzDecompressor ) DecompressedLen (b []byte ) (decompressedLen int , err error ) {
144+ l , err := minlz .DecodedLen (b )
145+ return l , err
146+ }
147+
148+ func (minlzDecompressor ) Close () {}
149+
113150func GetDecompressor (c CompressionIndicator ) Decompressor {
114151 switch c {
115152 case NoCompressionIndicator :
@@ -118,6 +155,8 @@ func GetDecompressor(c CompressionIndicator) Decompressor {
118155 return snappyDecompressor {}
119156 case ZstdCompressionIndicator :
120157 return getZstdDecompressor ()
158+ case MinlzCompressionIndicator :
159+ return minlzDecompressor {}
121160 default :
122161 panic ("Invalid compression type." )
123162 }
0 commit comments