Browse Source

GetRef() now returns the label set (#8641)

The purpose of GetRef() is to allow Append() to be called without
the caller needing to copy the labels. To avoid a race where a series
is removed from TSDB between the calls to GetRef() and Append(), we
return TSDB's copy of the labels.

Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
pull/8642/head
Bryan Boreham 4 years ago committed by GitHub
parent
commit
c7a62b95ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      storage/interface.go
  2. 4
      tsdb/db.go
  3. 11
      tsdb/head.go

5
storage/interface.go

@ -183,9 +183,10 @@ type Appender interface {
// GetRef is an extra interface on Appenders used by downstream projects // GetRef is an extra interface on Appenders used by downstream projects
// (e.g. Cortex) to avoid maintaining a parallel set of references. // (e.g. Cortex) to avoid maintaining a parallel set of references.
type GetRef interface { type GetRef interface {
// Returns reference number that can be used to pass to Appender.Append(). // Returns reference number that can be used to pass to Appender.Append(),
// and a set of labels that will not cause another copy when passed to Appender.Append().
// 0 means the appender does not have a reference to this series. // 0 means the appender does not have a reference to this series.
GetRef(lset labels.Labels) uint64 GetRef(lset labels.Labels) (uint64, labels.Labels)
} }
// ExemplarAppender provides an interface for adding samples to exemplar storage, which // ExemplarAppender provides an interface for adding samples to exemplar storage, which

4
tsdb/db.go

@ -797,11 +797,11 @@ type dbAppender struct {
var _ storage.GetRef = dbAppender{} var _ storage.GetRef = dbAppender{}
func (a dbAppender) GetRef(lset labels.Labels) uint64 { func (a dbAppender) GetRef(lset labels.Labels) (uint64, labels.Labels) {
if g, ok := a.Appender.(storage.GetRef); ok { if g, ok := a.Appender.(storage.GetRef); ok {
return g.GetRef(lset) return g.GetRef(lset)
} }
return 0 return 0, nil
} }
func (a dbAppender) Commit() error { func (a dbAppender) Commit() error {

11
tsdb/head.go

@ -1109,11 +1109,11 @@ func (a *initAppender) AppendExemplar(ref uint64, l labels.Labels, e exemplar.Ex
var _ storage.GetRef = &initAppender{} var _ storage.GetRef = &initAppender{}
func (a *initAppender) GetRef(lset labels.Labels) uint64 { func (a *initAppender) GetRef(lset labels.Labels) (uint64, labels.Labels) {
if g, ok := a.app.(storage.GetRef); ok { if g, ok := a.app.(storage.GetRef); ok {
return g.GetRef(lset) return g.GetRef(lset)
} }
return 0 return 0, nil
} }
func (a *initAppender) Commit() error { func (a *initAppender) Commit() error {
@ -1342,12 +1342,13 @@ func (a *headAppender) AppendExemplar(ref uint64, _ labels.Labels, e exemplar.Ex
var _ storage.GetRef = &headAppender{} var _ storage.GetRef = &headAppender{}
func (a *headAppender) GetRef(lset labels.Labels) uint64 { func (a *headAppender) GetRef(lset labels.Labels) (uint64, labels.Labels) {
s := a.head.series.getByHash(lset.Hash(), lset) s := a.head.series.getByHash(lset.Hash(), lset)
if s == nil { if s == nil {
return 0 return 0, nil
} }
return s.ref // returned labels must be suitable to pass to Append()
return s.ref, s.lset
} }
func (a *headAppender) log() error { func (a *headAppender) log() error {

Loading…
Cancel
Save