From b09b90a940efff72a803d08abea0040db0f7d07a Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Thu, 9 Mar 2017 15:40:52 +0100 Subject: [PATCH] Correctly close querier on error, revendor tsdb --- promql/engine.go | 8 +++++++- vendor/github.com/fabxc/tsdb/db.go | 7 ++----- vendor/github.com/fabxc/tsdb/wal.go | 4 ++++ vendor/vendor.json | 6 +++--- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/promql/engine.go b/promql/engine.go index b2468ffd9..23a5bb93e 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -345,10 +345,16 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *EvalStmt) ( prepareTimer.Stop() queryPrepareTime.Observe(prepareTimer.ElapsedTime().Seconds()) + // XXX(fabxc): the querier returned by populateIterators might be instantiated + // we must not return without closing irrespective of the error. + // TODO: make this semantically saner. + if querier != nil { + defer querier.Close() + } + if err != nil { return nil, err } - defer querier.Close() evalTimer := query.stats.GetTimer(stats.InnerEvalTime).Start() // Instant evaluation. diff --git a/vendor/github.com/fabxc/tsdb/db.go b/vendor/github.com/fabxc/tsdb/db.go index bf8600fc4..7124ce106 100644 --- a/vendor/github.com/fabxc/tsdb/db.go +++ b/vendor/github.com/fabxc/tsdb/db.go @@ -369,10 +369,7 @@ func (db *DB) reloadBlocks() error { } heads = append(heads, b.(*headBlock)) } else { - if ok && meta.ULID != b.Meta().ULID { - if err := b.Close(); err != nil { - return err - } + if !ok || meta.ULID != b.Meta().ULID { b, err = newPersistedBlock(dirs[i]) if err != nil { return errors.Wrapf(err, "open persisted block %s", dirs[i]) @@ -385,7 +382,7 @@ func (db *DB) reloadBlocks() error { } for seq, b := range db.seqBlocks { - if _, ok := seqBlocks[seq]; !ok { + if nb, ok := seqBlocks[seq]; !ok || nb != b { if err := b.Close(); err != nil { return errors.Wrapf(err, "closing removed block %d", b.Meta().Sequence) } diff --git a/vendor/github.com/fabxc/tsdb/wal.go b/vendor/github.com/fabxc/tsdb/wal.go index 5b85ca3c9..b06425e07 100644 --- a/vendor/github.com/fabxc/tsdb/wal.go +++ b/vendor/github.com/fabxc/tsdb/wal.go @@ -299,6 +299,8 @@ func (w *WAL) entry(et WALEntryType, flag byte, buf []byte) error { sz = int64(6 + 4 + len(buf)) newsz = w.curN + sz ) + // XXX(fabxc): this currently cuts a new file whenever the WAL was newly opened. + // Probably fine in general but may yield a lot of short files in some cases. if w.cur == nil || w.curN > w.segmentSize || newsz > w.segmentSize && sz <= w.segmentSize { if err := w.cut(); err != nil { return err @@ -431,6 +433,8 @@ func NewWALReader(rs ...io.ReadCloser) *WALReader { } // At returns the last decoded entry of labels or samples. +// The returned slices are only valid until the next call to Next(). Their elements +// have to be copied to preserve them. func (r *WALReader) At() ([]labels.Labels, []refdSample) { return r.labels, r.samples } diff --git a/vendor/vendor.json b/vendor/vendor.json index 11423d809..17eacc1da 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -368,10 +368,10 @@ "revisionTime": "2016-09-30T00:14:02Z" }, { - "checksumSHA1": "Aj4Cn1RClamxluIri/LQMnK/yB4=", + "checksumSHA1": "hnxY08GfzanNSvD8vjz/wSWnwmk=", "path": "github.com/fabxc/tsdb", - "revision": "ca1bc920b795cfc670002e7643471b0277e79a9b", - "revisionTime": "2017-03-08T15:54:13Z" + "revision": "32c32013a6d2a8ee5fb231d3f3cb5538128650d2", + "revisionTime": "2017-03-09T14:40:13Z" }, { "checksumSHA1": "uVzWuLvF646YjiKomsc2CR1ua58=",