Skip to content

Commit 27dd231

Browse files
committed
manifest: simplify BulkVersionEdit.Apply
Require a non-nil version to simplify the interface and the code a bit. We also remove unnecessary nil checks for `Version.L0Sublevels`, which is never the case.
1 parent da1e319 commit 27dd231

19 files changed

+60
-58
lines changed

compaction.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -571,9 +571,7 @@ func newFlush(
571571
}
572572
}
573573

574-
if cur.L0Sublevels != nil {
575-
c.l0Limits = cur.L0Sublevels.FlushSplitKeys()
576-
}
574+
c.l0Limits = cur.L0Sublevels.FlushSplitKeys()
577575

578576
smallestSet, largestSet := false, false
579577
updatePointBounds := func(iter internalIterator) {
@@ -1038,7 +1036,7 @@ func (d *DB) addInProgressCompaction(c *compaction) {
10381036
}
10391037
}
10401038

1041-
if (isIntraL0 || isBase) && c.version.L0Sublevels != nil {
1039+
if isIntraL0 || isBase {
10421040
l0Inputs := []manifest.LevelSlice{c.startLevel.files}
10431041
if isIntraL0 {
10441042
l0Inputs = append(l0Inputs, c.outputLevel.files)

compaction_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import (
4141
)
4242

4343
func newVersion(opts *Options, files [numLevels][]*tableMetadata) *version {
44-
v := manifest.NewVersion(
44+
v := manifest.NewVersionForTesting(
4545
opts.Comparer,
4646
opts.FlushSplitBytes,
4747
files)

get_iter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func TestGetIter(t *testing.T) {
429429

430430
files[tt.level] = append(files[tt.level], meta)
431431
}
432-
v := manifest.NewVersion(cmp, 10<<20, files)
432+
v := manifest.NewVersionForTesting(cmp, 10<<20, files)
433433
err := v.CheckOrdering()
434434
if tc.badOrdering && err == nil {
435435
t.Errorf("desc=%q: want bad ordering, got nil error", desc)

internal/compact/splitting_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestOutputSplitter(t *testing.T) {
3434
files[1] = append(files[1], f)
3535
}
3636
}
37-
v := manifest.NewVersion(base.DefaultComparer, 64*1024, files)
37+
v := manifest.NewVersionForTesting(base.DefaultComparer, 64*1024, files)
3838
if err := v.CheckOrdering(); err != nil {
3939
d.Fatalf(t, "%v", err)
4040
}

internal/keyspan/keyspanimpl/level_iter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ func TestLevelIterEquivalence(t *testing.T) {
312312
amap[metas[i].FileNum] = metas[i]
313313
}
314314
b.AddedTables[6] = amap
315-
v, err := b.Apply(nil, base.DefaultComparer, 0, 0)
315+
v, err := b.Apply(manifest.NewVersion(base.DefaultComparer), 0, 0)
316316
require.NoError(t, err)
317317
levelIter.Init(
318318
context.Background(),

internal/manifest/annotator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func makeTestVersion(numFiles int) (*Version, []*TableMetadata) {
2626
var levelFiles [7][]*TableMetadata
2727
levelFiles[6] = files
2828

29-
v := NewVersion(base.DefaultComparer, 0, levelFiles)
29+
v := NewVersionForTesting(base.DefaultComparer, 0, levelFiles)
3030
return v, files
3131
}
3232

internal/manifest/l0_sublevels_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func readManifest(filename string) (*Version, error) {
3232
}
3333
defer f.Close()
3434
rr := record.NewReader(f, 0 /* logNum */)
35-
var v *Version
35+
v := NewVersion(base.DefaultComparer)
3636
addedByFileNum := make(map[base.FileNum]*TableMetadata)
3737
for {
3838
r, err := rr.Next()
@@ -51,7 +51,7 @@ func readManifest(filename string) (*Version, error) {
5151
if err := bve.Accumulate(&ve); err != nil {
5252
return nil, err
5353
}
54-
if v, err = bve.Apply(v, base.DefaultComparer, 10<<20, 32000); err != nil {
54+
if v, err = bve.Apply(v, 10<<20, 32000); err != nil {
5555
return nil, err
5656
}
5757
}

internal/manifest/manifest_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func replayManifest(t *testing.T, opts *pebble.Options, dirname string) *manifes
127127
require.NoError(t, bve.Accumulate(&ve))
128128
}
129129
v, err := bve.Apply(
130-
nil /* version */, cmp, opts.FlushSplitBytes,
130+
manifest.NewVersion(cmp), opts.FlushSplitBytes,
131131
opts.Experimental.ReadCompactionRate)
132132
require.NoError(t, err)
133133
return v

internal/manifest/version.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,9 +1207,23 @@ func SortBySmallest(files []*TableMetadata, cmp Compare) {
12071207
// NumLevels is the number of levels a Version contains.
12081208
const NumLevels = 7
12091209

1210-
// NewVersion constructs a new Version with the provided files. It requires
1211-
// the provided files are already well-ordered. It's intended for testing.
1212-
func NewVersion(
1210+
// NewVersion creates a version with no files.
1211+
func NewVersion(comparer *base.Comparer) *Version {
1212+
v := &Version{
1213+
cmp: comparer,
1214+
}
1215+
for level := range v.Levels {
1216+
v.Levels[level] = MakeLevelMetadata(comparer.Compare, level, nil /* files */)
1217+
v.RangeKeyLevels[level] = MakeLevelMetadata(comparer.Compare, level, nil /* files */)
1218+
}
1219+
v.L0Sublevels = &L0Sublevels{cmp: comparer.Compare, formatKey: comparer.FormatKey, levelMetadata: &v.Levels[0]}
1220+
return v
1221+
}
1222+
1223+
// NewVersionForTesting constructs a new Version with the provided files. It
1224+
// requires the provided files are already well-ordered. It's intended for
1225+
// testing.
1226+
func NewVersionForTesting(
12131227
comparer *base.Comparer, flushSplitBytes int64, files [NumLevels][]*TableMetadata,
12141228
) *Version {
12151229
v := &Version{
@@ -1389,7 +1403,7 @@ func ParseVersionDebug(comparer *base.Comparer, flushSplitBytes int64, s string)
13891403
// partial order that represents newest to oldest. Reverse the order of L0
13901404
// files to ensure we construct the same sublevels.
13911405
slices.Reverse(files[0])
1392-
v := NewVersion(comparer, flushSplitBytes, files)
1406+
v := NewVersionForTesting(comparer, flushSplitBytes, files)
13931407
if err := v.CheckOrdering(); err != nil {
13941408
return nil, err
13951409
}
@@ -1476,7 +1490,7 @@ func (v *Version) Next() *Version {
14761490
func (v *Version) InitL0Sublevels(flushSplitBytes int64) error {
14771491
var err error
14781492
v.L0Sublevels, err = NewL0Sublevels(&v.Levels[0], v.cmp.Compare, v.cmp.FormatKey, flushSplitBytes)
1479-
if err == nil && v.L0Sublevels != nil {
1493+
if err == nil {
14801494
v.L0SublevelFiles = v.L0Sublevels.Levels
14811495
}
14821496
return err

internal/manifest/version_edit.go

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,45 +1149,29 @@ func (b *BulkVersionEdit) Accumulate(ve *VersionEdit) error {
11491149
//
11501150
// curr may be nil, which is equivalent to a pointer to a zero version.
11511151
func (b *BulkVersionEdit) Apply(
1152-
curr *Version, comparer *base.Comparer, flushSplitBytes int64, readCompactionRate int64,
1152+
curr *Version, flushSplitBytes int64, readCompactionRate int64,
11531153
) (*Version, error) {
1154+
comparer := curr.cmp
11541155
v := &Version{
11551156
cmp: comparer,
11561157
}
11571158

11581159
// Adjust the count of files marked for compaction.
1159-
if curr != nil {
1160-
v.Stats.MarkedForCompaction = curr.Stats.MarkedForCompaction
1161-
}
1160+
v.Stats.MarkedForCompaction = curr.Stats.MarkedForCompaction
11621161
v.Stats.MarkedForCompaction += b.MarkedForCompactionCountDiff
11631162
if v.Stats.MarkedForCompaction < 0 {
11641163
return nil, base.CorruptionErrorf("pebble: version marked for compaction count negative")
11651164
}
11661165

11671166
for level := range v.Levels {
1168-
if curr == nil || curr.Levels[level].tree.root == nil {
1169-
v.Levels[level] = MakeLevelMetadata(comparer.Compare, level, nil /* files */)
1170-
} else {
1171-
v.Levels[level] = curr.Levels[level].clone()
1172-
}
1173-
if curr == nil || curr.RangeKeyLevels[level].tree.root == nil {
1174-
v.RangeKeyLevels[level] = MakeLevelMetadata(comparer.Compare, level, nil /* files */)
1175-
} else {
1176-
v.RangeKeyLevels[level] = curr.RangeKeyLevels[level].clone()
1177-
}
1167+
v.Levels[level] = curr.Levels[level].clone()
1168+
v.RangeKeyLevels[level] = curr.RangeKeyLevels[level].clone()
11781169

11791170
if len(b.AddedTables[level]) == 0 && len(b.DeletedTables[level]) == 0 {
11801171
// There are no edits on this level.
11811172
if level == 0 {
1182-
// Initialize L0Sublevels.
1183-
if curr == nil || curr.L0Sublevels == nil {
1184-
if err := v.InitL0Sublevels(flushSplitBytes); err != nil {
1185-
return nil, errors.Wrap(err, "pebble: internal error")
1186-
}
1187-
} else {
1188-
v.L0Sublevels = curr.L0Sublevels
1189-
v.L0SublevelFiles = v.L0Sublevels.Levels
1190-
}
1173+
v.L0Sublevels = curr.L0Sublevels
1174+
v.L0SublevelFiles = curr.L0SublevelFiles
11911175
}
11921176
continue
11931177
}
@@ -1266,6 +1250,7 @@ func (b *BulkVersionEdit) Apply(
12661250
// Track the keys with the smallest and largest keys, so that we can
12671251
// check consistency of the modified span.
12681252
if sm == nil || base.InternalCompare(comparer.Compare, sm.Smallest, f.Smallest) > 0 {
1253+
12691254
sm = f
12701255
}
12711256
if la == nil || base.InternalCompare(comparer.Compare, la.Largest, f.Largest) < 0 {
@@ -1285,7 +1270,7 @@ func (b *BulkVersionEdit) Apply(
12851270
}
12861271

12871272
if level == 0 {
1288-
if curr != nil && curr.L0Sublevels != nil && len(deletedTablesMap) == 0 {
1273+
if len(deletedTablesMap) == 0 {
12891274
// Flushes and ingestions that do not delete any L0 files do not require
12901275
// a regeneration of L0Sublevels from scratch. We can instead generate
12911276
// it incrementally.

0 commit comments

Comments
 (0)