Skip to content

Commit 6cbf981

Browse files
committed
db: remove redundant Comparer fields from compaction
The compaction type had a *base.Comparer but also copies of the comparer's individual Compare, Equal and FormatKey fields. Remove the redundancy.
1 parent 1643b8d commit 6cbf981

File tree

5 files changed

+59
-65
lines changed

5 files changed

+59
-65
lines changed

compaction.go

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,11 @@ type compaction struct {
198198
// compactionKindRewrite.
199199
isDownload bool
200200

201-
cmp Compare
202-
equal Equal
203-
comparer *base.Comparer
204-
formatKey base.FormatKey
205-
logger Logger
206-
version *manifest.Version
207-
stats base.InternalIteratorStats
208-
beganAt time.Time
201+
comparer *base.Comparer
202+
logger Logger
203+
version *manifest.Version
204+
stats base.InternalIteratorStats
205+
beganAt time.Time
209206
// versionEditApplied is set to true when a compaction has completed and the
210207
// resulting version has been installed (if successful), but the compaction
211208
// goroutine is still cleaning up (eg, deleting obsolete files).
@@ -379,10 +376,7 @@ func newCompaction(
379376
) *compaction {
380377
c := &compaction{
381378
kind: compactionKindDefault,
382-
cmp: opts.Comparer.Compare,
383-
equal: opts.Comparer.Equal,
384379
comparer: opts.Comparer,
385-
formatKey: opts.Comparer.FormatKey,
386380
inputs: pc.inputs,
387381
bounds: pc.bounds,
388382
logger: opts.Logger,
@@ -430,7 +424,7 @@ func newCompaction(
430424
c.grandparents = c.version.Overlaps(c.outputLevel.level+1, c.bounds)
431425
}
432426
c.delElision, c.rangeKeyElision = compact.SetupTombstoneElision(
433-
c.cmp, c.version, pc.l0Organizer, c.outputLevel.level, c.bounds,
427+
c.comparer.Compare, c.version, pc.l0Organizer, c.outputLevel.level, c.bounds,
434428
)
435429
c.kind = pc.kind
436430

@@ -533,10 +527,7 @@ func newDeleteOnlyCompaction(
533527
) *compaction {
534528
c := &compaction{
535529
kind: compactionKindDeleteOnly,
536-
cmp: opts.Comparer.Compare,
537-
equal: opts.Comparer.Equal,
538530
comparer: opts.Comparer,
539-
formatKey: opts.Comparer.FormatKey,
540531
logger: opts.Logger,
541532
version: cur,
542533
beganAt: beganAt,
@@ -658,10 +649,7 @@ func newFlush(
658649
) (*compaction, error) {
659650
c := &compaction{
660651
kind: compactionKindFlush,
661-
cmp: opts.Comparer.Compare,
662-
equal: opts.Comparer.Equal,
663652
comparer: opts.Comparer,
664-
formatKey: opts.Comparer.FormatKey,
665653
logger: opts.Logger,
666654
version: cur,
667655
beganAt: beganAt,
@@ -705,14 +693,15 @@ func newFlush(
705693

706694
c.l0Limits = l0Organizer.FlushSplitKeys()
707695

696+
cmp := c.comparer.Compare
708697
updatePointBounds := func(iter internalIterator) {
709698
if kv := iter.First(); kv != nil {
710-
if c.bounds.Start == nil || c.cmp(c.bounds.Start, kv.K.UserKey) > 0 {
699+
if c.bounds.Start == nil || cmp(c.bounds.Start, kv.K.UserKey) > 0 {
711700
c.bounds.Start = slices.Clone(kv.K.UserKey)
712701
}
713702
}
714703
if kv := iter.Last(); kv != nil {
715-
if c.bounds.End.Key == nil || !c.bounds.End.IsUpperBoundForInternalKey(c.cmp, kv.K) {
704+
if c.bounds.End.Key == nil || !c.bounds.End.IsUpperBoundForInternalKey(cmp, kv.K) {
716705
c.bounds.End = base.UserKeyExclusiveIf(slices.Clone(kv.K.UserKey), kv.K.IsExclusiveSentinel())
717706
}
718707
}
@@ -725,12 +714,12 @@ func newFlush(
725714
if s, err := iter.First(); err != nil {
726715
return err
727716
} else if s != nil {
728-
c.bounds = c.bounds.Union(c.cmp, s.Bounds().Clone())
717+
c.bounds = c.bounds.Union(cmp, s.Bounds().Clone())
729718
}
730719
if s, err := iter.Last(); err != nil {
731720
return err
732721
} else if s != nil {
733-
c.bounds = c.bounds.Union(c.cmp, s.Bounds().Clone())
722+
c.bounds = c.bounds.Union(cmp, s.Bounds().Clone())
734723
}
735724
return nil
736725
}
@@ -785,9 +774,9 @@ func (c *compaction) errorOnUserKeyOverlap(ve *manifest.VersionEdit) error {
785774
meta := ve.NewTables[n-1].Meta
786775
prevMeta := ve.NewTables[n-2].Meta
787776
if !prevMeta.Largest().IsExclusiveSentinel() &&
788-
c.cmp(prevMeta.Largest().UserKey, meta.Smallest().UserKey) >= 0 {
777+
c.comparer.Compare(prevMeta.Largest().UserKey, meta.Smallest().UserKey) >= 0 {
789778
return errors.Errorf("pebble: compaction split user key across two sstables: %s in %s and %s",
790-
prevMeta.Largest().Pretty(c.formatKey),
779+
prevMeta.Largest().Pretty(c.comparer.FormatKey),
791780
prevMeta.TableNum,
792781
meta.TableNum)
793782
}
@@ -819,17 +808,19 @@ func (c *compaction) newInputIters(
819808
rangeDelIter, rangeKeyIter keyspan.FragmentIterator,
820809
retErr error,
821810
) {
811+
cmp := c.comparer.Compare
812+
822813
// Validate the ordering of compaction input files for defense in depth.
823814
if len(c.flushing) == 0 {
824815
if c.startLevel.level >= 0 {
825-
err := manifest.CheckOrdering(c.cmp, c.formatKey,
826-
manifest.Level(c.startLevel.level), c.startLevel.files.Iter())
816+
err := manifest.CheckOrdering(c.comparer, manifest.Level(c.startLevel.level),
817+
c.startLevel.files.Iter())
827818
if err != nil {
828819
return nil, nil, nil, err
829820
}
830821
}
831-
err := manifest.CheckOrdering(c.cmp, c.formatKey,
832-
manifest.Level(c.outputLevel.level), c.outputLevel.files.Iter())
822+
err := manifest.CheckOrdering(c.comparer, manifest.Level(c.outputLevel.level),
823+
c.outputLevel.files.Iter())
833824
if err != nil {
834825
return nil, nil, nil, err
835826
}
@@ -838,8 +829,7 @@ func (c *compaction) newInputIters(
838829
panic("l0SublevelInfo not created for compaction out of L0")
839830
}
840831
for _, info := range c.startLevel.l0SublevelInfo {
841-
err := manifest.CheckOrdering(c.cmp, c.formatKey,
842-
info.sublevel, info.Iter())
832+
err := manifest.CheckOrdering(c.comparer, info.sublevel, info.Iter())
843833
if err != nil {
844834
return nil, nil, nil, err
845835
}
@@ -850,8 +840,8 @@ func (c *compaction) newInputIters(
850840
panic("n>2 multi level compaction not implemented yet")
851841
}
852842
interLevel := c.extraLevels[0]
853-
err := manifest.CheckOrdering(c.cmp, c.formatKey,
854-
manifest.Level(interLevel.level), interLevel.files.Iter())
843+
err := manifest.CheckOrdering(c.comparer, manifest.Level(interLevel.level),
844+
interLevel.files.Iter())
855845
if err != nil {
856846
return nil, nil, nil, err
857847
}
@@ -996,7 +986,7 @@ func (c *compaction) newInputIters(
996986
return noCloseIter, err
997987
}
998988
li := keyspanimpl.NewLevelIter(
999-
context.Background(), keyspan.SpanIterOptions{}, c.cmp,
989+
context.Background(), keyspan.SpanIterOptions{}, cmp,
1000990
newRangeKeyIterWrapper, level.files.Iter(), l, manifest.KeyTypeRange,
1001991
)
1002992
rangeKeyIters = append(rangeKeyIters, li)
@@ -1030,7 +1020,7 @@ func (c *compaction) newInputIters(
10301020
// iter.
10311021
pointIter = iters[0]
10321022
if len(iters) > 1 {
1033-
pointIter = newMergingIter(c.logger, &c.stats, c.cmp, nil, iters...)
1023+
pointIter = newMergingIter(c.logger, &c.stats, cmp, nil, iters...)
10341024
}
10351025

10361026
// In normal operation, levelIter iterates over the point operations in a
@@ -2723,10 +2713,14 @@ func (d *DB) runCopyCompaction(
27232713
SyntheticPrefixAndSuffix: inputMeta.SyntheticPrefixAndSuffix,
27242714
}
27252715
if inputMeta.HasPointKeys {
2726-
newMeta.ExtendPointKeyBounds(c.cmp, inputMeta.PointKeyBounds.Smallest(), inputMeta.PointKeyBounds.Largest())
2716+
newMeta.ExtendPointKeyBounds(c.comparer.Compare,
2717+
inputMeta.PointKeyBounds.Smallest(),
2718+
inputMeta.PointKeyBounds.Largest())
27272719
}
27282720
if inputMeta.HasRangeKeys {
2729-
newMeta.ExtendRangeKeyBounds(c.cmp, inputMeta.RangeKeyBounds.Smallest(), inputMeta.RangeKeyBounds.Largest())
2721+
newMeta.ExtendRangeKeyBounds(c.comparer.Compare,
2722+
inputMeta.RangeKeyBounds.Smallest(),
2723+
inputMeta.RangeKeyBounds.Largest())
27302724
}
27312725
newMeta.TableNum = d.mu.versions.getNextTableNum()
27322726
if objMeta.IsExternal() {
@@ -3393,13 +3387,19 @@ func (c *compaction) makeVersionEdit(result compact.Result) (*manifest.VersionEd
33933387
)
33943388

33953389
if t.WriterMeta.HasPointKeys {
3396-
fileMeta.ExtendPointKeyBounds(c.cmp, t.WriterMeta.SmallestPoint, t.WriterMeta.LargestPoint)
3390+
fileMeta.ExtendPointKeyBounds(c.comparer.Compare,
3391+
t.WriterMeta.SmallestPoint,
3392+
t.WriterMeta.LargestPoint)
33973393
}
33983394
if t.WriterMeta.HasRangeDelKeys {
3399-
fileMeta.ExtendPointKeyBounds(c.cmp, t.WriterMeta.SmallestRangeDel, t.WriterMeta.LargestRangeDel)
3395+
fileMeta.ExtendPointKeyBounds(c.comparer.Compare,
3396+
t.WriterMeta.SmallestRangeDel,
3397+
t.WriterMeta.LargestRangeDel)
34003398
}
34013399
if t.WriterMeta.HasRangeKeys {
3402-
fileMeta.ExtendRangeKeyBounds(c.cmp, t.WriterMeta.SmallestRangeKey, t.WriterMeta.LargestRangeKey)
3400+
fileMeta.ExtendRangeKeyBounds(c.comparer.Compare,
3401+
t.WriterMeta.SmallestRangeKey,
3402+
t.WriterMeta.LargestRangeKey)
34033403
}
34043404

34053405
ve.NewTables[i] = manifest.NewTableEntry{
@@ -3425,10 +3425,10 @@ func (c *compaction) makeVersionEdit(result compact.Result) (*manifest.VersionEd
34253425

34263426
// Sanity check that the tables are ordered and don't overlap.
34273427
for i := 1; i < len(ve.NewTables); i++ {
3428-
if ve.NewTables[i-1].Meta.UserKeyBounds().End.IsUpperBoundFor(c.cmp, ve.NewTables[i].Meta.Smallest().UserKey) {
3428+
if ve.NewTables[i-1].Meta.Largest().IsUpperBoundFor(c.comparer.Compare, ve.NewTables[i].Meta.Smallest().UserKey) {
34293429
return nil, base.AssertionFailedf("pebble: compaction output tables overlap: %s and %s",
3430-
ve.NewTables[i-1].Meta.DebugString(c.formatKey, true),
3431-
ve.NewTables[i].Meta.DebugString(c.formatKey, true),
3430+
ve.NewTables[i-1].Meta.DebugString(c.comparer.FormatKey, true),
3431+
ve.NewTables[i].Meta.DebugString(c.comparer.FormatKey, true),
34323432
)
34333433
}
34343434
}

compaction_test.go

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,7 +2091,6 @@ func TestCompactionAllowZeroSeqNum(t *testing.T) {
20912091
case "allow-zero-seqnum":
20922092
d.mu.Lock()
20932093
c := &compaction{
2094-
cmp: d.cmp,
20952094
comparer: d.opts.Comparer,
20962095
version: d.mu.versions.currentVersion(),
20972096
inputs: []compactionLevel{{}, {}},
@@ -2133,13 +2132,13 @@ func TestCompactionAllowZeroSeqNum(t *testing.T) {
21332132
}
21342133
c.outputLevel.level = c.startLevel.level + 1
21352134
c.startLevel.files = manifest.NewLevelSliceSpecificOrder(startFiles)
2136-
c.outputLevel.files = manifest.NewLevelSliceKeySorted(c.cmp, outputFiles)
2135+
c.outputLevel.files = manifest.NewLevelSliceKeySorted(c.comparer.Compare, outputFiles)
21372136
}
21382137

2139-
c.bounds = manifest.KeyRange(c.cmp, c.startLevel.files.All(), c.outputLevel.files.All())
2138+
c.bounds = manifest.KeyRange(c.comparer.Compare, c.startLevel.files.All(), c.outputLevel.files.All())
21402139
c.delElision, c.rangeKeyElision = compact.SetupTombstoneElision(
2141-
c.cmp, c.version, d.mu.versions.latest.l0Organizer, c.outputLevel.level,
2142-
c.bounds)
2140+
c.comparer.Compare, c.version, d.mu.versions.latest.l0Organizer,
2141+
c.outputLevel.level, c.bounds)
21432142
fmt.Fprintf(&buf, "%t\n", c.allowZeroSeqNum())
21442143
}
21452144
return buf.String()
@@ -2173,11 +2172,7 @@ func TestCompactionErrorOnUserKeyOverlap(t *testing.T) {
21732172
func(t *testing.T, d *datadriven.TestData) string {
21742173
switch d.Cmd {
21752174
case "error-on-user-key-overlap":
2176-
c := &compaction{
2177-
cmp: DefaultComparer.Compare,
2178-
comparer: DefaultComparer,
2179-
formatKey: DefaultComparer.FormatKey,
2180-
}
2175+
c := &compaction{comparer: DefaultComparer}
21812176
var files []manifest.NewTableEntry
21822177
tableNum := base.TableNum(1)
21832178

@@ -2305,11 +2300,9 @@ func TestCompactionCheckOrdering(t *testing.T) {
23052300
switch d.Cmd {
23062301
case "check-ordering":
23072302
c := &compaction{
2308-
cmp: DefaultComparer.Compare,
2309-
comparer: DefaultComparer,
2310-
formatKey: DefaultComparer.FormatKey,
2311-
logger: panicLogger{},
2312-
inputs: []compactionLevel{{level: -1}, {level: -1}},
2303+
comparer: DefaultComparer,
2304+
logger: panicLogger{},
2305+
inputs: []compactionLevel{{level: -1}, {level: -1}},
23132306
}
23142307
c.startLevel, c.outputLevel = &c.inputs[0], &c.inputs[1]
23152308
var startFiles, outputFiles []*manifest.TableMetadata
@@ -2385,7 +2378,7 @@ func TestCompactionCheckOrdering(t *testing.T) {
23852378
}
23862379
if c.startLevel.level == 0 {
23872380
// We don't change the input files for the compaction beyond this point.
2388-
c.startLevel.l0SublevelInfo = generateSublevelInfo(c.cmp, c.startLevel.files)
2381+
c.startLevel.l0SublevelInfo = generateSublevelInfo(c.comparer.Compare, c.startLevel.files)
23892382
}
23902383

23912384
newIters := func(

internal/manifest/l0_sublevels_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,8 +447,7 @@ func TestL0Sublevels(t *testing.T) {
447447
case "l0-check-ordering":
448448
for sublevel, files := range sublevels.levelFiles {
449449
slice := NewLevelSliceSpecificOrder(files)
450-
err := CheckOrdering(base.DefaultComparer.Compare, base.DefaultFormatter,
451-
L0Sublevel(sublevel), slice.Iter())
450+
err := CheckOrdering(base.DefaultComparer, L0Sublevel(sublevel), slice.Iter())
452451
if err != nil {
453452
return err.Error()
454453
}

internal/manifest/version.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,13 +590,13 @@ func (v *Version) AllLevelsAndSublevels() iter.Seq2[Layer, LevelSlice] {
590590
func (v *Version) CheckOrdering() error {
591591
for sublevel := len(v.L0SublevelFiles) - 1; sublevel >= 0; sublevel-- {
592592
sublevelIter := v.L0SublevelFiles[sublevel].Iter()
593-
if err := CheckOrdering(v.cmp.Compare, v.cmp.FormatKey, L0Sublevel(sublevel), sublevelIter); err != nil {
593+
if err := CheckOrdering(v.cmp, L0Sublevel(sublevel), sublevelIter); err != nil {
594594
return base.CorruptionErrorf("%s\n%s", err, v.DebugString())
595595
}
596596
}
597597

598598
for level, lm := range v.Levels {
599-
if err := CheckOrdering(v.cmp.Compare, v.cmp.FormatKey, Level(level), lm.Iter()); err != nil {
599+
if err := CheckOrdering(v.cmp, Level(level), lm.Iter()); err != nil {
600600
return base.CorruptionErrorf("%s\n%s", err, v.DebugString())
601601
}
602602
}
@@ -705,7 +705,9 @@ func (l *VersionList) Remove(v *Version) {
705705
// CheckOrdering checks that the files are consistent with respect to
706706
// seqnums (for level 0 files -- see detailed comment below) and increasing and non-
707707
// overlapping internal key ranges (for non-level 0 files).
708-
func CheckOrdering(cmp Compare, format base.FormatKey, level Layer, files LevelIterator) error {
708+
func CheckOrdering(comparer *base.Comparer, level Layer, files LevelIterator) error {
709+
cmp := comparer.Compare
710+
format := comparer.FormatKey
709711
// The invariants to check for L0 sublevels are the same as the ones to
710712
// check for all other levels. However, if L0 is not organized into
711713
// sublevels, or if all L0 files are being passed in, we do the legacy L0

internal/manifest/version_edit.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,7 @@ func (b *BulkVersionEdit) Apply(curr *Version, readCompactionRate int64) (*Versi
12841284
}
12851285

12861286
if level == 0 {
1287-
if err := CheckOrdering(comparer.Compare, comparer.FormatKey, Level(0), v.Levels[level].Iter()); err != nil {
1287+
if err := CheckOrdering(comparer, Level(0), v.Levels[level].Iter()); err != nil {
12881288
return nil, errors.Wrap(err, "pebble: internal error")
12891289
}
12901290
continue
@@ -1304,7 +1304,7 @@ func (b *BulkVersionEdit) Apply(curr *Version, readCompactionRate int64) (*Versi
13041304
end.Prev()
13051305
}
13061306
})
1307-
if err := CheckOrdering(comparer.Compare, comparer.FormatKey, Level(level), check.Iter()); err != nil {
1307+
if err := CheckOrdering(comparer, Level(level), check.Iter()); err != nil {
13081308
return nil, errors.Wrap(err, "pebble: internal error")
13091309
}
13101310
}

0 commit comments

Comments
 (0)