Skip to content

Commit 6b149af

Browse files
committed
db: consolidate point and range bytes annotators
Using two annotators leads to two traversals and twice the allocated objects per node. Consolidate into a single annotator.
1 parent fb5d0a7 commit 6b149af

File tree

3 files changed

+32
-35
lines changed

3 files changed

+32
-35
lines changed

compaction_picker.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -987,15 +987,13 @@ func (p *compactionPickerByScore) calculateLevelScores(
987987
}
988988
sizeAdjust := calculateSizeAdjust(inProgressCompactions)
989989
for level := 1; level < numLevels; level++ {
990-
compensatedLevelSize :=
991-
// Actual file size.
992-
p.vers.Levels[level].AggregateSize() +
993-
// Point deletions.
994-
*pointDeletionsBytesEstimateAnnotator.LevelAnnotation(p.vers.Levels[level]) +
995-
// Range deletions.
996-
*rangeDeletionsBytesEstimateAnnotator.LevelAnnotation(p.vers.Levels[level]) +
997-
// Adjustments for in-progress compactions.
998-
sizeAdjust[level].compensated()
990+
// Actual file size.
991+
compensatedLevelSize := p.vers.Levels[level].AggregateSize()
992+
// Deletions.
993+
delBytes := deletionBytesAnnotator.LevelAnnotation(p.vers.Levels[level])
994+
compensatedLevelSize += delBytes.PointDels + delBytes.RangeDels
995+
// Adjustments for in-progress compactions.
996+
compensatedLevelSize += sizeAdjust[level].compensated()
999997
scores[level].compensatedFillFactor = float64(compensatedLevelSize) / float64(p.levelMaxBytes[level])
1000998
scores[level].fillFactor = float64(p.vers.Levels[level].AggregateSize()+sizeAdjust[level].actual()) / float64(p.levelMaxBytes[level])
1001999
}
@@ -1343,9 +1341,8 @@ func (p *compactionPickerByScore) getCompactionConcurrency() int {
13431341
compactableGarbageCompactions := 0
13441342
garbageFractionLimit := p.opts.Experimental.CompactionGarbageFractionForMaxConcurrency()
13451343
if garbageFractionLimit > 0 && p.dbSizeBytes > 0 {
1346-
compactableGarbageBytes :=
1347-
*pointDeletionsBytesEstimateAnnotator.MultiLevelAnnotation(p.vers.Levels[:]) +
1348-
*rangeDeletionsBytesEstimateAnnotator.MultiLevelAnnotation(p.vers.Levels[:])
1344+
delBytes := deletionBytesAnnotator.MultiLevelAnnotation(p.vers.Levels[:])
1345+
compactableGarbageBytes := delBytes.PointDels + delBytes.RangeDels
13491346
garbageFraction := float64(compactableGarbageBytes) / float64(p.dbSizeBytes)
13501347
compactableGarbageCompactions =
13511348
int((garbageFraction / garbageFractionLimit) * float64(upper-lower))

db.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1880,10 +1880,9 @@ func (d *DB) Metrics() *Metrics {
18801880
metrics.Keys.RangeKeySetsCount = *rangeKeySetsAnnotator.MultiLevelAnnotation(vers.RangeKeyLevels[:])
18811881
metrics.Keys.TombstoneCount = *tombstonesAnnotator.MultiLevelAnnotation(vers.Levels[:])
18821882

1883-
metrics.Table.Garbage.PointDeletionsBytesEstimate =
1884-
*pointDeletionsBytesEstimateAnnotator.MultiLevelAnnotation(vers.Levels[:])
1885-
metrics.Table.Garbage.RangeDeletionsBytesEstimate =
1886-
*rangeDeletionsBytesEstimateAnnotator.MultiLevelAnnotation(vers.Levels[:])
1883+
delBytes := deletionBytesAnnotator.MultiLevelAnnotation(vers.Levels[:])
1884+
metrics.Table.Garbage.PointDeletionsBytesEstimate = delBytes.PointDels
1885+
metrics.Table.Garbage.RangeDeletionsBytesEstimate = delBytes.RangeDels
18871886

18881887
d.mu.versions.logLock()
18891888
metrics.private.manifestFileSize = uint64(d.mu.versions.manifest.Size())

table_stats.go

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,26 +1106,27 @@ var valueBlockSizeAnnotator = manifest.SumAnnotator(func(f *manifest.TableMetada
11061106
return 0, false
11071107
})
11081108

1109-
// pointDeletionsBytesEstimateAnnotator is a manifest.TableAnnotator that annotates
1110-
// B-Tree nodes with the sum of the files' PointDeletionsBytesEstimate. This
1111-
// value may change once a table's stats are loaded asynchronously, so its
1112-
// values are marked as cacheable only if a file's stats have been loaded.
1113-
var pointDeletionsBytesEstimateAnnotator = manifest.SumAnnotator(func(f *manifest.TableMetadata) (uint64, bool) {
1114-
if stats, ok := f.Stats(); ok {
1115-
return stats.PointDeletionsBytesEstimate, true
1116-
}
1117-
return 0, false
1118-
})
1109+
type deletionBytes struct {
1110+
// PointDels contains a sum of TableStats.PointDeletionsBytesEstimate.
1111+
PointDels uint64
1112+
// RangeDels contains a sum of TableStats.RangeDeletionsBytesEstimate.
1113+
RangeDels uint64
1114+
}
11191115

1120-
// rangeDeletionsBytesEstimateAnnotator is a manifest.TableAnnotator that annotates
1121-
// B-Tree nodes with the sum of the files' RangeDeletionsBytesEstimate. This
1122-
// value may change once a table's stats are loaded asynchronously, so its
1123-
// values are marked as cacheable only if a file's stats have been loaded.
1124-
var rangeDeletionsBytesEstimateAnnotator = manifest.SumAnnotator(func(f *manifest.TableMetadata) (uint64, bool) {
1125-
if stats, ok := f.Stats(); ok {
1126-
return stats.RangeDeletionsBytesEstimate, true
1127-
}
1128-
return 0, false
1116+
var deletionBytesAnnotator = manifest.NewTableAnnotator[deletionBytes](manifest.SumAggregator[deletionBytes]{
1117+
AddFunc: func(src, dst *deletionBytes) {
1118+
dst.PointDels += src.PointDels
1119+
dst.RangeDels += src.RangeDels
1120+
},
1121+
AccumulateFunc: func(f *manifest.TableMetadata) (v deletionBytes, cacheOK bool) {
1122+
if stats, ok := f.Stats(); ok {
1123+
return deletionBytes{
1124+
PointDels: stats.PointDeletionsBytesEstimate,
1125+
RangeDels: stats.RangeDeletionsBytesEstimate,
1126+
}, true
1127+
}
1128+
return deletionBytes{}, false
1129+
},
11291130
})
11301131

11311132
// compressionStatsAnnotator is a manifest.TableAnnotator that annotates B-tree nodes

0 commit comments

Comments
 (0)