@@ -16,32 +16,97 @@ import (
1616 "github.com/cockroachdb/pebble/objstorage"
1717)
1818
19- // Compression is the per-block compression algorithm to use.
20- type Compression int
19+ // CompressionFamily identifies a compression algorithm (e.g., Snappy, Zstd, Minlz).
20+ type CompressionFamily int
21+
22+ // CompressionLevel specifies the compression level for a given family.
23+ // Some families ignore this value if they don't support levels.
24+ type CompressionLevel int
25+
26+ // Compression is the per-block compression algorithm and level to use.
27+ // For families like Snappy, the level is ignored. For families like Zstd or Minlz,
28+ // the level adjusts compression ratio and speed.
29+ type Compression struct {
30+ Family CompressionFamily
31+ Level CompressionLevel
32+ }
33+
34+ // The available compression family types.
35+ const (
36+ DefaultCompressionFamily CompressionFamily = iota
37+ NoCompressionFamily
38+ SnappyCompressionFamily
39+ ZstdCompressionFamily
40+ MinlzCompressionFamily
41+ NCompressionFamily
42+ )
2143
22- // The available compression types .
44+ // The available compression levels .
2345const (
24- DefaultCompression Compression = iota
25- NoCompression
26- SnappyCompression
27- ZstdCompression
28- MinlzCompression
29- NCompression
46+ LevelDefault CompressionLevel = 0
47+
48+ // Zstd compression levels.
49+ ZstdLevelMin CompressionLevel = 1
50+ ZstdLevel1 CompressionLevel = 1
51+ ZstdLevel2 CompressionLevel = 2
52+ ZstdLevel3 CompressionLevel = 3 // Default for Zstd.
53+ ZstdLevelDefault CompressionLevel = ZstdLevel3
54+ ZstdLevel4 CompressionLevel = 4
55+ ZstdLevel5 CompressionLevel = 5
56+ ZstdLevel6 CompressionLevel = 6
57+ ZstdLevel7 CompressionLevel = 7
58+ ZstdLevel8 CompressionLevel = 8
59+ ZstdLevel9 CompressionLevel = 9
60+ ZstdLevel10 CompressionLevel = 10
61+ ZstdLevel11 CompressionLevel = 11
62+ ZstdLevel12 CompressionLevel = 12
63+ ZstdLevel13 CompressionLevel = 13
64+ ZstdLevel14 CompressionLevel = 14
65+ ZstdLevel15 CompressionLevel = 15
66+ ZstdLevel16 CompressionLevel = 16
67+ ZstdLevel17 CompressionLevel = 17
68+ ZstdLevel18 CompressionLevel = 18
69+ ZstdLevel19 CompressionLevel = 19
70+ ZstdLevel20 CompressionLevel = 20
71+ ZstdLevel21 CompressionLevel = 21
72+ ZstdLevel22 CompressionLevel = 22
73+ ZstdLevelMax CompressionLevel = 22
74+
75+ // Minlz compression levels.
76+ MinlzLevelMin CompressionLevel = 1
77+ MinlzLevelFastest CompressionLevel = 1 // Default for MinLZ.
78+ MinlzLevelDefault CompressionLevel = MinlzLevelFastest
79+ MinlzLevelBalanced CompressionLevel = 2
80+ MinlzLevelSmallest CompressionLevel = 3
81+ MinlzLevelMax CompressionLevel = 3
3082)
3183
84+ var DefaultCompression = Compression {Family : DefaultCompressionFamily , Level : LevelDefault }
85+ var NoCompression = Compression {Family : NoCompressionFamily , Level : LevelDefault }
86+ var SnappyCompression = Compression {Family : SnappyCompressionFamily , Level : LevelDefault }
87+ var DefaultZstdCompression = Compression {Family : ZstdCompressionFamily , Level : LevelDefault }
88+ var DefaultMinlzCompression = Compression {Family : MinlzCompressionFamily , Level : LevelDefault }
89+
90+ var FamilyToDefaultCompression = map [CompressionFamily ]Compression {
91+ DefaultCompressionFamily : DefaultCompression ,
92+ NoCompressionFamily : NoCompression ,
93+ SnappyCompressionFamily : SnappyCompression ,
94+ ZstdCompressionFamily : DefaultZstdCompression ,
95+ }
96+
3297// String implements fmt.Stringer, returning a human-readable name for the
3398// compression algorithm.
34- func (c Compression ) String () string {
99+ func (c CompressionFamily ) String () string {
35100 switch c {
36- case DefaultCompression :
101+ case DefaultCompressionFamily :
37102 return "Default"
38- case NoCompression :
103+ case NoCompressionFamily :
39104 return "NoCompression"
40- case SnappyCompression :
105+ case SnappyCompressionFamily :
41106 return "Snappy"
42- case ZstdCompression :
107+ case ZstdCompressionFamily :
43108 return "ZSTD"
44- case MinlzCompression :
109+ case MinlzCompressionFamily :
45110 return "Minlz"
46111 default :
47112 return "Unknown"
@@ -50,20 +115,20 @@ func (c Compression) String() string {
50115
51116// CompressionFromString returns an sstable.Compression from its
52117// string representation. Inverse of c.String() above.
53- func CompressionFromString (s string ) Compression {
118+ func CompressionFromString (s string ) CompressionFamily {
54119 switch s {
55120 case "Default" :
56- return DefaultCompression
121+ return DefaultCompressionFamily
57122 case "NoCompression" :
58- return NoCompression
123+ return NoCompressionFamily
59124 case "Snappy" :
60- return SnappyCompression
125+ return SnappyCompressionFamily
61126 case "ZSTD" :
62- return ZstdCompression
127+ return ZstdCompressionFamily
63128 case "Minlz" :
64- return MinlzCompression
129+ return MinlzCompressionFamily
65130 default :
66- return DefaultCompression
131+ return DefaultCompressionFamily
67132 }
68133}
69134
@@ -222,10 +287,10 @@ func CompressAndChecksum(
222287 // Compress the buffer, discarding the result if the improvement isn't at
223288 // least 12.5%.
224289 algo := NoCompressionIndicator
225- if compression != NoCompression {
226- compressor := GetCompressor (compression )
290+ if compression . Family != NoCompressionFamily {
291+ compressor := GetCompressor (compression . Family )
227292 defer compressor .Close ()
228- algo , buf = compressor .Compress (buf , blockData )
293+ algo , buf = compressor .Compress (buf , blockData , compression . Level )
229294 if len (buf ) >= len (blockData )- len (blockData )/ 8 {
230295 algo = NoCompressionIndicator
231296 }
0 commit comments