diff --git a/db_test.go b/db_test.go index 72817a109..e7f2f4ad6 100644 --- a/db_test.go +++ b/db_test.go @@ -26,6 +26,8 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" + "github.com/prometheus/tsdb/chunks" + "github.com/prometheus/tsdb/index" "github.com/prometheus/tsdb/labels" "github.com/prometheus/tsdb/testutil" ) @@ -1096,3 +1098,58 @@ func TestOverlappingBlocksDetectsAllOverlaps(t *testing.T) { {Min: 8, Max: 9}: {nc1[8], nc1[9]}, // 7-10, 8-9 }, OverlappingBlocks(nc1)) } + +// Regression test for https://github.com/prometheus/tsdb/issues/347 +func TestChunkAtBlockBoundary(t *testing.T) { + db, close := openTestDB(t, nil) + defer close() + defer db.Close() + + app := db.Appender() + + blockRange := DefaultOptions.BlockRanges[0] + label := labels.FromStrings("foo", "bar") + + for i := int64(0); i < 3; i++ { + _, err := app.Add(label, i*blockRange, 0) + testutil.Ok(t, err) + _, err = app.Add(label, i*blockRange+1000, 0) + testutil.Ok(t, err) + } + + err := app.Commit() + testutil.Ok(t, err) + + _, err = db.compact() + testutil.Ok(t, err) + + for _, block := range db.blocks { + r, err := block.Index() + testutil.Ok(t, err) + defer r.Close() + + meta := block.Meta() + + p, err := r.Postings(index.AllPostingsKey()) + testutil.Ok(t, err) + + var ( + lset labels.Labels + chks []chunks.Meta + ) + + chunkCount := 0 + + for p.Next() { + err = r.Series(p.At(), &lset, &chks) + testutil.Ok(t, err) + for _, c := range chks { + testutil.Assert(t, meta.MinTime <= c.MinTime && c.MaxTime <= meta.MaxTime, + "chunk spans beyond block boundaries: [block.MinTime=%d, block.MaxTime=%d]; [chunk.MinTime=%d, chunk.MaxTime=%d]", + meta.MinTime, meta.MaxTime, c.MinTime, c.MaxTime) + chunkCount++ + } + } + testutil.Assert(t, chunkCount == 1, "expected 1 chunk in block %s, got %d", meta.ULID, chunkCount) + } +}