Browse Source

Add test for block meta version and comments

pull/5805/head
Fabian Reinartz 7 years ago
parent
commit
a345231a0e
  1. 15
      block_test.go
  2. 1
      db.go
  3. 5
      index/index.go
  4. 2
      repair.go
  5. 9
      repair_test.go

15
block_test.go

@ -23,6 +23,21 @@ import (
"github.com/prometheus/tsdb/testutil"
)
// In Prometheus 2.1.0 we had a bug where the meta.json version was falsely bumped
// to 2. We had a migration in place resetting it to 1 but we should move immediately to
// version 3 next time to avoid confusion and issues.
func TestBlockMetaMustNeverBeVersion2(t *testing.T) {
dir, err := ioutil.TempDir("", "metaversion")
testutil.Ok(t, err)
defer os.RemoveAll(dir)
testutil.Ok(t, writeMetaFile(dir, &BlockMeta{}))
meta, err := readMetaFile(dir)
testutil.Ok(t, err)
testutil.Assert(t, meta.Version != 2, "meta.json version must never be 2")
}
func TestSetCompactionFailed(t *testing.T) {
tmpdir, err := ioutil.TempDir("", "test-tsdb")
testutil.Ok(t, err)

1
db.go

@ -188,6 +188,7 @@ func Open(dir string, l log.Logger, r prometheus.Registerer, opts *Options) (db
if opts == nil {
opts = DefaultOptions
}
// Fixup bad format written by Prometheus 2.1.
if err := repairBadIndexVersion(l, dir); err != nil {
return nil, err
}

5
index/index.go

@ -136,7 +136,7 @@ type indexTOC struct {
postingsTable uint64
}
// NewWriter returns a new Writer to the given filename.
// NewWriter returns a new Writer to the given filename. It serializes data in format version 2.
func NewWriter(fn string) (*Writer, error) {
dir := filepath.Dir(fn)
@ -577,7 +577,8 @@ func (b realByteSlice) Sub(start, end int) ByteSlice {
return b[start:end]
}
// NewReader returns a new IndexReader on the given byte slice.
// NewReader returns a new IndexReader on the given byte slice. It automatically
// handles different format versions.
func NewReader(b ByteSlice) (*Reader, error) {
return newReader(b, nil)
}

2
repair.go

@ -15,6 +15,8 @@ import (
"github.com/prometheus/tsdb/fileutil"
)
// repairBadIndexVersion repairs an issue in index and meta.json persistence introduced in
// commit 129773b41a565fde5156301e37f9a87158030443.
func repairBadIndexVersion(logger log.Logger, dir string) error {
// All blocks written by Prometheus 2.1 with a meta.json version of 2 are affected.
// We must actually set the index file version to 2 and revert the meta.json version back to 1.

9
repair_test.go

@ -1,12 +1,12 @@
package tsdb
import (
"os"
"reflect"
"testing"
"github.com/prometheus/tsdb/chunks"
"github.com/go-kit/kit/log"
"github.com/prometheus/tsdb/index"
"github.com/prometheus/tsdb/labels"
)
@ -52,6 +52,8 @@ func TestRepairBadIndexVersion(t *testing.T) {
if err == nil {
t.Fatal("error expected but got none")
}
// Touch chunks dir in block.
os.MkdirAll(dir+"chunks", 0777)
r, err := index.NewFileReader(dir + "index")
if err != nil {
@ -73,9 +75,12 @@ func TestRepairBadIndexVersion(t *testing.T) {
t.Fatal(err)
}
if err := repairBadIndexVersion(log.NewNopLogger(), "testdata/repair_index_version"); err != nil {
// On DB opening all blocks in the base dir should be repaired.
db, _ := Open("testdata/repair_index_version", nil, nil, nil)
if err != nil {
t.Fatal(err)
}
db.Close()
r, err = index.NewFileReader(dir + "index")
if err != nil {

Loading…
Cancel
Save