Skip to content

Commit 4d123ce

Browse files
committed
metrics: clean up setting of obsolete metrics
There is no reason to actively maintain the stats for the `obsoleteTables`/`obsoleteBlobs` lists. We can calculate them when we get the metrics, making things much easier to follow. The "dual" meaning of these fields - inside `versionSet.Metrics` they do not include enqueued files but in the result of `Metrics()` they do include them - was the root cause of the delete pacer issue #5424.
1 parent 8bc8cd0 commit 4d123ce

File tree

3 files changed

+13
-27
lines changed

3 files changed

+13
-27
lines changed

db.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,13 +1944,17 @@ func (d *DB) Metrics() *Metrics {
19441944
metrics.Table.Zombie.All.Bytes = d.mu.versions.zombieTables.TotalSize()
19451945
metrics.Table.Zombie.Local.Count, metrics.Table.Zombie.Local.Bytes = d.mu.versions.zombieTables.LocalStats()
19461946

1947-
// The obsolete blob/table metrics have a subtle calculation: the initial
1948-
// metrics we copied from vs.metrics reflect (in {Table,BlobFiles}.Obsolete
1949-
// the set of files currently sitting in vs.obsolete{Tables,Blobs} but not yet
1950-
// enqueued to the delete pacer. To complete the metrics, we add the currently
1951-
// enqueued files.
1952-
metrics.Table.Obsolete.Accumulate(deletePacerMetrics.InQueue.Tables)
1953-
metrics.BlobFiles.Obsolete.Accumulate(deletePacerMetrics.InQueue.BlobFiles)
1947+
// Populate obsolete blob/table metrics from both the not-yet-enqueued lists
1948+
// in the versionSet, and what is already in the delete pacer queue.
1949+
metrics.Table.Obsolete = deletePacerMetrics.InQueue.Tables
1950+
for _, fi := range d.mu.versions.obsoleteTables {
1951+
metrics.Table.Obsolete.Inc(fi.FileSize, fi.IsLocal)
1952+
}
1953+
metrics.BlobFiles.Obsolete = deletePacerMetrics.InQueue.BlobFiles
1954+
for _, fi := range d.mu.versions.obsoleteBlobs {
1955+
metrics.BlobFiles.Obsolete.Inc(fi.FileSize, fi.IsLocal)
1956+
}
1957+
19541958
metrics.private.optionsFileSize = d.optionsFileSize
19551959

19561960
d.mu.versions.logLock()

obsolete_files.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ func (d *DB) scanObsoleteFiles(list []string, flushableIngests []*ingestedFlusha
201201
d.mu.versions.obsoleteBlobs = mergeObsoleteFiles(d.mu.versions.obsoleteBlobs, obsoleteBlobs)
202202
d.mu.versions.obsoleteManifests = mergeObsoleteFiles(d.mu.versions.obsoleteManifests, obsoleteManifests)
203203
d.mu.versions.obsoleteOptions = mergeObsoleteFiles(d.mu.versions.obsoleteOptions, obsoleteOptions)
204-
d.mu.versions.updateObsoleteObjectMetricsLocked()
205204
}
206205

207206
// disableFileDeletions disables file deletions and then waits for any
@@ -289,10 +288,6 @@ func (d *DB) deleteObsoleteFiles(jobID JobID) {
289288
obsoleteOptions := d.mu.versions.obsoleteOptions
290289
d.mu.versions.obsoleteOptions = nil
291290

292-
// Update the obsolete object metrics in d.mu.versions.metrics. These metrics
293-
// will be combined with the metrics from the delete pacer in DB.Metrics().
294-
d.mu.versions.updateObsoleteObjectMetricsLocked()
295-
296291
// Release d.mu while preparing the cleanup job and possibly waiting.
297292
// Note the unusual order: Unlock and then Lock.
298293
d.mu.Unlock()

version_set.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ type versionSet struct {
7676
// on the creation of every version.
7777
obsoleteFn func(manifest.ObsoleteFiles)
7878
// obsolete{Tables,Blobs,Manifests,Options} are sorted by file number ascending.
79+
// TODO(jackson, radu): Investigate if we still need this intermediary step or
80+
// we can directly enqueue all deletions.
7981
obsoleteTables []deletepacer.ObsoleteFile
8082
obsoleteBlobs []deletepacer.ObsoleteFile
8183
obsoleteManifests []deletepacer.ObsoleteFile
@@ -1038,7 +1040,6 @@ func (vs *versionSet) addObsoleteLocked(obsolete manifest.ObsoleteFiles) {
10381040
asObsoleteFile(vs.fs, base.FileTypeBlob, vs.dirname)
10391041
}
10401042
vs.obsoleteBlobs = mergeObsoleteFiles(vs.obsoleteBlobs, newlyObsoleteBlobFiles)
1041-
vs.updateObsoleteObjectMetricsLocked()
10421043
}
10431044

10441045
// addObsolete will acquire DB.mu, so DB.mu must not be held when this is
@@ -1049,20 +1050,6 @@ func (vs *versionSet) addObsolete(obsolete manifest.ObsoleteFiles) {
10491050
vs.addObsoleteLocked(obsolete)
10501051
}
10511052

1052-
func (vs *versionSet) updateObsoleteObjectMetricsLocked() {
1053-
// TODO(jackson, radu): Investigate if we still need the
1054-
// vs.obsolete{Tables,Blobs} intermediary step or we can directly enqueue all
1055-
// deletions.
1056-
vs.metrics.Table.Obsolete = metrics.TableCountsAndSizes{}
1057-
for _, fi := range vs.obsoleteTables {
1058-
vs.metrics.Table.Obsolete.Inc(fi.FileSize, fi.IsLocal)
1059-
}
1060-
vs.metrics.BlobFiles.Obsolete = metrics.BlobFileCountsAndSizes{}
1061-
for _, fi := range vs.obsoleteBlobs {
1062-
vs.metrics.BlobFiles.Obsolete.Inc(fi.FileSize, fi.IsLocal)
1063-
}
1064-
}
1065-
10661053
// This method sets the following fields of m.Levels[*]:
10671054
// - [Virtual]Tables{Count,Size}
10681055
// - Sublevels

0 commit comments

Comments
 (0)