vendor: update prometheus/tsdb

This commit is contained in:
Fabian Reinartz 2017-09-19 14:24:26 +02:00
parent b4b0999e7f
commit a04be0bc1c
6 changed files with 49 additions and 37 deletions

View file

@ -64,11 +64,6 @@ type Appendable interface {
Appender() Appender Appender() Appender
} }
// Queryable defines an entity which provides a Querier.
type Queryable interface {
Querier(mint, maxt int64) Querier
}
// BlockMeta provides meta information about a block. // BlockMeta provides meta information about a block.
type BlockMeta struct { type BlockMeta struct {
// Unique identifier for the block and its contents. Changes on compaction. // Unique identifier for the block and its contents. Changes on compaction.

View file

@ -165,8 +165,7 @@ func Open(dir string, l log.Logger, r prometheus.Registerer, opts *Options) (db
return nil, err return nil, err
} }
if l == nil { if l == nil {
l = log.NewLogfmtLogger(os.Stdout) l = log.NewNopLogger()
l = log.With(l, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller)
} }
if opts == nil { if opts == nil {
opts = DefaultOptions opts = DefaultOptions

View file

@ -185,13 +185,18 @@ func NewHead(r prometheus.Registerer, l log.Logger, wal WAL, chunkRange int64) (
return h, nil return h, nil
} }
// ReadWAL initializes the head by consuming the write ahead log.
func (h *Head) ReadWAL() error { func (h *Head) ReadWAL() error {
r := h.wal.Reader() r := h.wal.Reader()
mint := h.MinTime() mint := h.MinTime()
seriesFunc := func(series []RefSeries) error { seriesFunc := func(series []RefSeries) error {
for _, s := range series { for _, s := range series {
h.create(s.Labels.Hash(), s.Labels) h.getOrCreateWithID(s.Ref, s.Labels.Hash(), s.Labels)
if h.lastSeriesID < s.Ref {
h.lastSeriesID = s.Ref
}
} }
return nil return nil
} }
@ -202,7 +207,8 @@ func (h *Head) ReadWAL() error {
} }
ms := h.series.getByID(s.Ref) ms := h.series.getByID(s.Ref)
if ms == nil { if ms == nil {
return errors.Errorf("unknown series reference %d; abort WAL restore", s.Ref) h.logger.Log("msg", "unknown series reference in WAL", "ref", s.Ref)
continue
} }
_, chunkCreated := ms.append(s.T, s.V) _, chunkCreated := ms.append(s.T, s.V)
if chunkCreated { if chunkCreated {
@ -210,7 +216,6 @@ func (h *Head) ReadWAL() error {
h.metrics.chunks.Inc() h.metrics.chunks.Inc()
} }
} }
return nil return nil
} }
deletesFunc := func(stones []Stone) error { deletesFunc := func(stones []Stone) error {
@ -222,7 +227,6 @@ func (h *Head) ReadWAL() error {
h.tombstones.add(s.ref, itv) h.tombstones.add(s.ref, itv)
} }
} }
return nil return nil
} }
@ -379,17 +383,12 @@ func (a *headAppender) Add(lset labels.Labels, t int64, v float64) (uint64, erro
if t < a.mint { if t < a.mint {
return 0, ErrOutOfBounds return 0, ErrOutOfBounds
} }
hash := lset.Hash()
s := a.head.series.getByHash(hash, lset)
if s == nil {
s = a.head.create(hash, lset)
s, created := a.head.getOrCreate(lset.Hash(), lset)
if created {
a.series = append(a.series, RefSeries{ a.series = append(a.series, RefSeries{
Ref: s.ref, Ref: s.ref,
Labels: lset, Labels: lset,
hash: hash,
}) })
} }
return s.ref, a.AddFast(s.ref, t, v) return s.ref, a.AddFast(s.ref, t, v)
@ -839,20 +838,32 @@ func (h *headIndexReader) LabelIndices() ([][]string, error) {
return res, nil return res, nil
} }
func (h *Head) create(hash uint64, lset labels.Labels) *memSeries { func (h *Head) getOrCreate(hash uint64, lset labels.Labels) (*memSeries, bool) {
h.metrics.series.Inc() // Just using `getOrSet` below would be semantically sufficient, but we'd create
h.metrics.seriesCreated.Inc() // a new series on every sample inserted via Add(), which causes allocations
// and makes our series IDs rather random and harder to compress in postings.
s := h.series.getByHash(hash, lset)
if s != nil {
return s, false
}
// Optimistically assume that we are the first one to create the series. // Optimistically assume that we are the first one to create the series.
id := atomic.AddUint64(&h.lastSeriesID, 1) id := atomic.AddUint64(&h.lastSeriesID, 1)
return h.getOrCreateWithID(id, hash, lset)
}
func (h *Head) getOrCreateWithID(id, hash uint64, lset labels.Labels) (*memSeries, bool) {
s := newMemSeries(lset, id, h.chunkRange) s := newMemSeries(lset, id, h.chunkRange)
s, created := h.series.getOrSet(hash, s) s, created := h.series.getOrSet(hash, s)
// Skip indexing if we didn't actually create the series.
if !created { if !created {
return s return s, false
} }
h.metrics.series.Inc()
h.metrics.seriesCreated.Inc()
h.postings.add(id, lset) h.postings.add(id, lset)
h.symMtx.Lock() h.symMtx.Lock()
@ -870,7 +881,7 @@ func (h *Head) create(hash uint64, lset labels.Labels) *memSeries {
h.symbols[l.Value] = struct{}{} h.symbols[l.Value] = struct{}{}
} }
return s return s, true
} }
// seriesHashmap is a simple hashmap for memSeries by their label set. It is built // seriesHashmap is a simple hashmap for memSeries by their label set. It is built
@ -1023,6 +1034,7 @@ func (s *stripeSeries) getOrSet(hash uint64, series *memSeries) (*memSeries, boo
s.locks[i].Lock() s.locks[i].Lock()
if prev := s.hashes[i].get(hash, series.lset); prev != nil { if prev := s.hashes[i].get(hash, series.lset); prev != nil {
s.locks[i].Unlock()
return prev, false return prev, false
} }
s.hashes[i].set(hash, series) s.hashes[i].set(hash, series)

View file

@ -570,6 +570,9 @@ var (
errInvalidFlag = fmt.Errorf("invalid flag") errInvalidFlag = fmt.Errorf("invalid flag")
) )
// NewIndexReader returns a new IndexReader on the given directory.
func NewIndexReader(dir string) (IndexReader, error) { return newIndexReader(dir) }
// newIndexReader returns a new indexReader on the given directory. // newIndexReader returns a new indexReader on the given directory.
func newIndexReader(dir string) (*indexReader, error) { func newIndexReader(dir string) (*indexReader, error) {
f, err := openMmapFile(filepath.Join(dir, "index")) f, err := openMmapFile(filepath.Join(dir, "index"))

View file

@ -99,9 +99,6 @@ type WALReader interface {
type RefSeries struct { type RefSeries struct {
Ref uint64 Ref uint64
Labels labels.Labels Labels labels.Labels
// hash for the label set. This field is not generally populated.
hash uint64
} }
// RefSample is a timestamp/value pair associated with a reference to a series. // RefSample is a timestamp/value pair associated with a reference to a series.
@ -827,7 +824,9 @@ func (r *walReader) Read(seriesf SeriesCB, samplesf SamplesCB, deletesf DeletesC
if err != nil { if err != nil {
return errors.Wrap(err, "decode series entry") return errors.Wrap(err, "decode series entry")
} }
seriesf(series) if err := seriesf(series); err != nil {
return err
}
cf := r.current() cf := r.current()
@ -842,7 +841,9 @@ func (r *walReader) Read(seriesf SeriesCB, samplesf SamplesCB, deletesf DeletesC
if err != nil { if err != nil {
return errors.Wrap(err, "decode samples entry") return errors.Wrap(err, "decode samples entry")
} }
samplesf(samples) if err := samplesf(samples); err != nil {
return err
}
// Update the times for the WAL segment file. // Update the times for the WAL segment file.
cf := r.current() cf := r.current()
@ -858,7 +859,9 @@ func (r *walReader) Read(seriesf SeriesCB, samplesf SamplesCB, deletesf DeletesC
if err != nil { if err != nil {
return errors.Wrap(err, "decode delete entry") return errors.Wrap(err, "decode delete entry")
} }
deletesf(stones) if err := deletesf(stones); err != nil {
return err
}
// Update the times for the WAL segment file. // Update the times for the WAL segment file.
cf := r.current() cf := r.current()

14
vendor/vendor.json vendored
View file

@ -871,22 +871,22 @@
"revisionTime": "2016-04-11T19:08:41Z" "revisionTime": "2016-04-11T19:08:41Z"
}, },
{ {
"checksumSHA1": "mDKxPAubVLTWW/Gar13m7YDHSek=", "checksumSHA1": "B5ndMoK8lqgFJ8xUZ/0V4zCpUw0=",
"path": "github.com/prometheus/tsdb", "path": "github.com/prometheus/tsdb",
"revision": "3870ec285c4640d462a0ad80e7acbcdf1e939563", "revision": "162a48e4f2c6e486a0ebf61cf9cea73a8023ef0a",
"revisionTime": "2017-09-11T08:41:33Z" "revisionTime": "2017-09-19T08:20:19Z"
}, },
{ {
"checksumSHA1": "Gua979gmISm4cJP/fR2hL8m5To8=", "checksumSHA1": "Gua979gmISm4cJP/fR2hL8m5To8=",
"path": "github.com/prometheus/tsdb/chunks", "path": "github.com/prometheus/tsdb/chunks",
"revision": "3870ec285c4640d462a0ad80e7acbcdf1e939563", "revision": "162a48e4f2c6e486a0ebf61cf9cea73a8023ef0a",
"revisionTime": "2017-09-11T08:41:33Z" "revisionTime": "2017-09-19T08:20:19Z"
}, },
{ {
"checksumSHA1": "zhmlvc322RH1L3l9DaA9d/HVVWs=", "checksumSHA1": "zhmlvc322RH1L3l9DaA9d/HVVWs=",
"path": "github.com/prometheus/tsdb/labels", "path": "github.com/prometheus/tsdb/labels",
"revision": "3870ec285c4640d462a0ad80e7acbcdf1e939563", "revision": "162a48e4f2c6e486a0ebf61cf9cea73a8023ef0a",
"revisionTime": "2017-09-11T08:41:33Z" "revisionTime": "2017-09-19T08:20:19Z"
}, },
{ {
"checksumSHA1": "5SYLEhADhdBVZAGPVHWggQl7H8k=", "checksumSHA1": "5SYLEhADhdBVZAGPVHWggQl7H8k=",