-
Notifications
You must be signed in to change notification settings - Fork 10.2k
Closed
Description
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 becomesNaN, 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() {
// ...
}
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels