Skip to content

tsdb: Division by zero in stale series compaction ratio calculation #17949

@aknuds1

Description

@aknuds1

Bug Description

In tsdb/db.go, the stale series compaction threshold check performs a division that can result in division by zero when the Head has no series:

numStaleSeries, numSeries := db.Head().NumStaleSeries(), db.Head().NumSeries()
staleSeriesRatio := float64(numStaleSeries) / float64(numSeries)
if db.autoCompact && db.opts.staleSeriesCompactionThreshold.Load() > 0 &&
    staleSeriesRatio >= db.opts.staleSeriesCompactionThreshold.Load() {

https://github.com/prometheus/prometheus/blob/main/tsdb/db.go#L1169-L1172

Impact

When numSeries is 0 (empty Head):

  • If numStaleSeries > 0: ratio becomes +Inf, which satisfies the threshold check and incorrectly triggers stale series compaction
  • If numStaleSeries == 0: ratio becomes NaN, comparison returns false (safe, but semantically incorrect)

Suggested Fix

Add a guard to skip the check when there are no series:

numStaleSeries, numSeries := db.Head().NumStaleSeries(), db.Head().NumSeries()
if db.autoCompact && numSeries > 0 && db.opts.staleSeriesCompactionThreshold.Load() > 0 {
    staleSeriesRatio := float64(numStaleSeries) / float64(numSeries)
    if staleSeriesRatio >= db.opts.staleSeriesCompactionThreshold.Load() {
        // ...
    }
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions