Browse Source

Merge pull request #15389 from jan--f/fix-appender-race-3.0

[BUGFIX] TSDB: Fix race on stale values in headAppender (#15322)
pull/15393/head
Bryan Boreham 1 week ago committed by GitHub
parent
commit
57a7a2939a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 8
      tsdb/head_append.go

8
tsdb/head_append.go

@ -356,21 +356,21 @@ func (a *headAppender) Append(ref storage.SeriesRef, lset labels.Labels, t int64
} }
} }
s.Lock()
if value.IsStaleNaN(v) { if value.IsStaleNaN(v) {
// This is not thread safe as we should be holding the lock for "s".
// TODO(krajorama): reorganize Commit() to handle samples in append order // TODO(krajorama): reorganize Commit() to handle samples in append order
// not floats first and then histograms. Then we could do this conversion // not floats first and then histograms. Then we could do this conversion
// in commit. This code should move into Commit(). // in commit. This code should move into Commit().
switch { switch {
case s.lastHistogramValue != nil: case s.lastHistogramValue != nil:
s.Unlock()
return a.AppendHistogram(ref, lset, t, &histogram.Histogram{Sum: v}, nil) return a.AppendHistogram(ref, lset, t, &histogram.Histogram{Sum: v}, nil)
case s.lastFloatHistogramValue != nil: case s.lastFloatHistogramValue != nil:
s.Unlock()
return a.AppendHistogram(ref, lset, t, nil, &histogram.FloatHistogram{Sum: v}) return a.AppendHistogram(ref, lset, t, nil, &histogram.FloatHistogram{Sum: v})
} }
} }
s.Lock()
defer s.Unlock() defer s.Unlock()
// TODO(codesome): If we definitely know at this point that the sample is ooo, then optimise // TODO(codesome): If we definitely know at this point that the sample is ooo, then optimise
// to skip that sample from the WAL and write only in the WBL. // to skip that sample from the WAL and write only in the WBL.
@ -1517,7 +1517,7 @@ type chunkOpts struct {
// append adds the sample (t, v) to the series. The caller also has to provide // append adds the sample (t, v) to the series. The caller also has to provide
// the appendID for isolation. (The appendID can be zero, which results in no // the appendID for isolation. (The appendID can be zero, which results in no
// isolation for this append.) // isolation for this append.)
// It is unsafe to call this concurrently with s.iterator(...) without holding the series lock. // Series lock must be held when calling.
func (s *memSeries) append(t int64, v float64, appendID uint64, o chunkOpts) (sampleInOrder, chunkCreated bool) { func (s *memSeries) append(t int64, v float64, appendID uint64, o chunkOpts) (sampleInOrder, chunkCreated bool) {
c, sampleInOrder, chunkCreated := s.appendPreprocessor(t, chunkenc.EncXOR, o) c, sampleInOrder, chunkCreated := s.appendPreprocessor(t, chunkenc.EncXOR, o)
if !sampleInOrder { if !sampleInOrder {

Loading…
Cancel
Save