@@ -9,17 +9,11 @@ import (
99 "github.com/cockroachdb/pebble/internal/base"
1010 "github.com/cockroachdb/pebble/internal/manifest"
1111 "github.com/cockroachdb/pebble/objstorage"
12- "github.com/cockroachdb/pebble/sstable"
1312 "github.com/cockroachdb/pebble/valsep"
1413 "github.com/cockroachdb/redact"
1514)
1615
17- // latencyTolerantMinimumSize is the minimum size, in bytes, of a value that
18- // will be separated into a blob file when the value storage policy is
19- // ValueStorageLatencyTolerant.
20- const latencyTolerantMinimumSize = 10
21-
22- var neverSeparateValues getValueSeparation = func (JobID , * tableCompaction , ValueStoragePolicy ) valsep.ValueSeparation {
16+ var neverSeparateValues getValueSeparation = func (JobID , * tableCompaction ) valsep.ValueSeparation {
2317 return valsep.NeverSeparateValues {}
2418}
2519
@@ -29,7 +23,7 @@ var neverSeparateValues getValueSeparation = func(JobID, *tableCompaction, Value
2923//
3024// It assumes that the compaction will write tables at d.TableFormat() or above.
3125func (d * DB ) determineCompactionValueSeparation (
32- jobID JobID , c * tableCompaction , valueStorage ValueStoragePolicy ,
26+ jobID JobID , c * tableCompaction ,
3327) valsep.ValueSeparation {
3428 if d .FormatMajorVersion () < FormatValueSeparation ||
3529 d .opts .Experimental .ValueSeparationPolicy == nil {
@@ -48,25 +42,12 @@ func (d *DB) determineCompactionValueSeparation(
4842 // For flushes, c.version is nil.
4943 blobFileSet = uniqueInputBlobMetadatas (& c .version .BlobFiles , c .inputs )
5044 }
51- minSize := policy .MinimumSize
52- switch valueStorage {
53- case ValueStorageLowReadLatency :
54- return valsep.NeverSeparateValues {}
55- case ValueStorageLatencyTolerant :
56- minSize = latencyTolerantMinimumSize
57- default :
58- }
59- if writeBlobs , outputBlobReferenceDepth := shouldWriteBlobFiles (c , policy , uint64 (minSize )); ! writeBlobs {
45+ if writeBlobs , outputBlobReferenceDepth := shouldWriteBlobFiles (c , policy , d .opts .Experimental .SpanPolicyFunc , d .cmp ); ! writeBlobs {
6046 // This compaction should preserve existing blob references.
61- kind := sstable .ValueSeparationDefault
62- if valueStorage != ValueStorageDefault {
63- kind = sstable .ValueSeparationSpanPolicy
64- }
6547 return valsep .NewPreserveAllHotBlobReferences (
6648 blobFileSet ,
6749 outputBlobReferenceDepth ,
68- kind ,
69- minSize ,
50+ policy .MinimumSize ,
7051 )
7152 }
7253
@@ -101,7 +82,7 @@ func (d *DB) determineCompactionValueSeparation(
10182// maximum blob reference depth to assign to output sstables (the actual value
10283// may be lower iff the output table references fewer distinct blob files).
10384func shouldWriteBlobFiles (
104- c * tableCompaction , policy ValueSeparationPolicy , minimumValueSizeForCompaction uint64 ,
85+ c * tableCompaction , policy ValueSeparationPolicy , spanPolicyFunc SpanPolicyFunc , cmp Compare ,
10586) (writeBlobs bool , referenceDepth manifest.BlobReferenceDepth ) {
10687 // Flushes will have no existing references to blob files and should write
10788 // their values to new blob files.
@@ -124,6 +105,7 @@ func shouldWriteBlobFiles(
124105 // We should try to write to new blob files.
125106 return true , 0
126107 }
108+
127109 // If the compaction's output blob reference depth would be greater than the
128110 // configured max, we should rewrite the values into new blob files to
129111 // restore locality.
@@ -140,7 +122,32 @@ func shouldWriteBlobFiles(
140122 if ! backingPropsValid {
141123 continue
142124 }
143- if backingProps .ValueSeparationMinSize != minimumValueSizeForCompaction {
125+
126+ var expectedMinSize int
127+ bounds := t .UserKeyBounds ()
128+ spanPolicy , spanPolicyEndKey , err := spanPolicyFunc (bounds .Start )
129+ if err != nil {
130+ // For now, if we can't determine the span policy, we should just assume
131+ // the default policy is in effect for this table.
132+ expectedMinSize = policy .MinimumSize
133+ } else {
134+ if len (spanPolicyEndKey ) > 0 && cmp (bounds .End .Key , spanPolicyEndKey ) >= 0 {
135+ // The table's key range now uses multiple span policies. Rewrite to new
136+ // blob files so values are stored according to the current policy.
137+ return true , 0
138+ }
139+ switch spanPolicy .ValueStoragePolicy .PolicyAdjustment {
140+ case UseDefaultValueStorage :
141+ // Use the global policy's minimum size.
142+ expectedMinSize = policy .MinimumSize
143+ case OverrideValueStorage :
144+ expectedMinSize = spanPolicy .ValueStoragePolicy .MinimumSize
145+ case NoValueSeparation :
146+ expectedMinSize = 0
147+ }
148+ }
149+
150+ if int (backingProps .ValueSeparationMinSize ) != expectedMinSize {
144151 return true , 0
145152 }
146153 }
0 commit comments