mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-12 16:44:05 -08:00
Fix unknown symbol error during head compaction (#7526)
* Fix race during head compaction Signed-off-by: Ganesh Vernekar <cs15btech11018@iith.ac.in> * Comment out the test Signed-off-by: Ganesh Vernekar <cs15btech11018@iith.ac.in> * Skip test instead of commenting it out Signed-off-by: Ganesh Vernekar <cs15btech11018@iith.ac.in>
This commit is contained in:
parent
57aac73e47
commit
30505a202a
|
@ -1692,8 +1692,6 @@ func (h *Head) getOrCreateWithID(id, hash uint64, lset labels.Labels) (*memSerie
|
||||||
h.metrics.seriesCreated.Inc()
|
h.metrics.seriesCreated.Inc()
|
||||||
atomic.AddUint64(&h.numSeries, 1)
|
atomic.AddUint64(&h.numSeries, 1)
|
||||||
|
|
||||||
h.postings.Add(id, lset)
|
|
||||||
|
|
||||||
h.symMtx.Lock()
|
h.symMtx.Lock()
|
||||||
defer h.symMtx.Unlock()
|
defer h.symMtx.Unlock()
|
||||||
|
|
||||||
|
@ -1709,6 +1707,10 @@ func (h *Head) getOrCreateWithID(id, hash uint64, lset labels.Labels) (*memSerie
|
||||||
h.symbols[l.Value] = struct{}{}
|
h.symbols[l.Value] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Postings should be set after setting the symbols (or after holding
|
||||||
|
// the symbol mtx) to avoid race during compaction of seeing partial symbols.
|
||||||
|
h.postings.Add(id, lset)
|
||||||
|
|
||||||
return s, true, nil
|
return s, true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1875,3 +1875,70 @@ func TestHeadLabelNamesValuesWithMinMaxRange(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHeadCompactionRace(t *testing.T) {
|
||||||
|
// There are still some races to be fixed. Hence skipping this test
|
||||||
|
// for now to not cause flaky CI failures.
|
||||||
|
t.Skip()
|
||||||
|
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
t.Run(fmt.Sprintf("run %d", i), func(t *testing.T) {
|
||||||
|
tsdbCfg := &Options{
|
||||||
|
RetentionDuration: 100000000,
|
||||||
|
NoLockfile: true,
|
||||||
|
MinBlockDuration: 1000000,
|
||||||
|
MaxBlockDuration: 1000000,
|
||||||
|
}
|
||||||
|
|
||||||
|
db, closer := openTestDB(t, tsdbCfg, []int64{1000000})
|
||||||
|
t.Cleanup(closer)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
testutil.Ok(t, db.Close())
|
||||||
|
})
|
||||||
|
|
||||||
|
head := db.Head()
|
||||||
|
|
||||||
|
// Get past the init appender phase here.
|
||||||
|
app := head.Appender()
|
||||||
|
_, err := app.Add(labels.Labels{labels.Label{Name: "n", Value: "v"}}, 10, 10)
|
||||||
|
testutil.Ok(t, err)
|
||||||
|
testutil.Ok(t, app.Commit())
|
||||||
|
|
||||||
|
wait := make(chan struct{})
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
|
// Prepare to execute concurrent appends.
|
||||||
|
wg.Add(100)
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
go func(idx int) {
|
||||||
|
defer wg.Done()
|
||||||
|
app := head.Appender()
|
||||||
|
<-wait
|
||||||
|
|
||||||
|
for j := 0; j < 100; j++ {
|
||||||
|
// After compaction this will return out of bound, so this is a best effort append.
|
||||||
|
app.Add(labels.Labels{labels.Label{
|
||||||
|
Name: fmt.Sprintf("n%d", idx*100+j),
|
||||||
|
Value: fmt.Sprintf("v%d", idx*100+j),
|
||||||
|
}}, 1000, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
testutil.Ok(t, app.Commit())
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare for head compaction.
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
<-wait
|
||||||
|
testutil.Ok(t, db.CompactHead(NewRangeHead(head, 0, 10000000)))
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Run concurrent appends and compaction.
|
||||||
|
close(wait)
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue