mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-13 17:14:05 -08:00
TSDB: Change block populator to accept postings index function (#14213)
Signed-off-by: Ben Ye <benye@amazon.com>
This commit is contained in:
parent
5585a3c7e5
commit
246b7c6a5c
|
@ -656,7 +656,7 @@ func (c *LeveledCompactor) write(dest string, meta *BlockMeta, blockPopulator Bl
|
||||||
}
|
}
|
||||||
closers = append(closers, indexw)
|
closers = append(closers, indexw)
|
||||||
|
|
||||||
if err := blockPopulator.PopulateBlock(c.ctx, c.metrics, c.logger, c.chunkPool, c.mergeFunc, blocks, meta, indexw, chunkw); err != nil {
|
if err := blockPopulator.PopulateBlock(c.ctx, c.metrics, c.logger, c.chunkPool, c.mergeFunc, blocks, meta, indexw, chunkw, AllSortedPostings); err != nil {
|
||||||
return fmt.Errorf("populate block: %w", err)
|
return fmt.Errorf("populate block: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -722,7 +722,20 @@ func (c *LeveledCompactor) write(dest string, meta *BlockMeta, blockPopulator Bl
|
||||||
}
|
}
|
||||||
|
|
||||||
type BlockPopulator interface {
|
type BlockPopulator interface {
|
||||||
PopulateBlock(ctx context.Context, metrics *CompactorMetrics, logger log.Logger, chunkPool chunkenc.Pool, mergeFunc storage.VerticalChunkSeriesMergeFunc, blocks []BlockReader, meta *BlockMeta, indexw IndexWriter, chunkw ChunkWriter) error
|
PopulateBlock(ctx context.Context, metrics *CompactorMetrics, logger log.Logger, chunkPool chunkenc.Pool, mergeFunc storage.VerticalChunkSeriesMergeFunc, blocks []BlockReader, meta *BlockMeta, indexw IndexWriter, chunkw ChunkWriter, postingsFunc IndexReaderPostingsFunc) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// IndexReaderPostingsFunc is a function to get a sorted posting iterator from a given index reader.
|
||||||
|
type IndexReaderPostingsFunc func(ctx context.Context, reader IndexReader) index.Postings
|
||||||
|
|
||||||
|
// AllSortedPostings returns a sorted all posting iterator from the input index reader.
|
||||||
|
func AllSortedPostings(ctx context.Context, reader IndexReader) index.Postings {
|
||||||
|
k, v := index.AllPostingsKey()
|
||||||
|
all, err := reader.Postings(ctx, k, v)
|
||||||
|
if err != nil {
|
||||||
|
return index.ErrPostings(err)
|
||||||
|
}
|
||||||
|
return reader.SortedPostings(all)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DefaultBlockPopulator struct{}
|
type DefaultBlockPopulator struct{}
|
||||||
|
@ -730,7 +743,7 @@ type DefaultBlockPopulator struct{}
|
||||||
// PopulateBlock fills the index and chunk writers with new data gathered as the union
|
// PopulateBlock fills the index and chunk writers with new data gathered as the union
|
||||||
// of the provided blocks. It returns meta information for the new block.
|
// of the provided blocks. It returns meta information for the new block.
|
||||||
// It expects sorted blocks input by mint.
|
// It expects sorted blocks input by mint.
|
||||||
func (c DefaultBlockPopulator) PopulateBlock(ctx context.Context, metrics *CompactorMetrics, logger log.Logger, chunkPool chunkenc.Pool, mergeFunc storage.VerticalChunkSeriesMergeFunc, blocks []BlockReader, meta *BlockMeta, indexw IndexWriter, chunkw ChunkWriter) (err error) {
|
func (c DefaultBlockPopulator) PopulateBlock(ctx context.Context, metrics *CompactorMetrics, logger log.Logger, chunkPool chunkenc.Pool, mergeFunc storage.VerticalChunkSeriesMergeFunc, blocks []BlockReader, meta *BlockMeta, indexw IndexWriter, chunkw ChunkWriter, postingsFunc IndexReaderPostingsFunc) (err error) {
|
||||||
if len(blocks) == 0 {
|
if len(blocks) == 0 {
|
||||||
return errors.New("cannot populate block from no readers")
|
return errors.New("cannot populate block from no readers")
|
||||||
}
|
}
|
||||||
|
@ -788,14 +801,9 @@ func (c DefaultBlockPopulator) PopulateBlock(ctx context.Context, metrics *Compa
|
||||||
}
|
}
|
||||||
closers = append(closers, tombsr)
|
closers = append(closers, tombsr)
|
||||||
|
|
||||||
k, v := index.AllPostingsKey()
|
postings := postingsFunc(ctx, indexr)
|
||||||
all, err := indexr.Postings(ctx, k, v)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
all = indexr.SortedPostings(all)
|
|
||||||
// Blocks meta is half open: [min, max), so subtract 1 to ensure we don't hold samples with exact meta.MaxTime timestamp.
|
// Blocks meta is half open: [min, max), so subtract 1 to ensure we don't hold samples with exact meta.MaxTime timestamp.
|
||||||
sets = append(sets, NewBlockChunkSeriesSet(b.Meta().ULID, indexr, chunkr, tombsr, all, meta.MinTime, meta.MaxTime-1, false))
|
sets = append(sets, NewBlockChunkSeriesSet(b.Meta().ULID, indexr, chunkr, tombsr, postings, meta.MinTime, meta.MaxTime-1, false))
|
||||||
syms := indexr.Symbols()
|
syms := indexr.Symbols()
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
symbols = syms
|
symbols = syms
|
||||||
|
|
|
@ -38,6 +38,7 @@ import (
|
||||||
"github.com/prometheus/prometheus/tsdb/chunkenc"
|
"github.com/prometheus/prometheus/tsdb/chunkenc"
|
||||||
"github.com/prometheus/prometheus/tsdb/chunks"
|
"github.com/prometheus/prometheus/tsdb/chunks"
|
||||||
"github.com/prometheus/prometheus/tsdb/fileutil"
|
"github.com/prometheus/prometheus/tsdb/fileutil"
|
||||||
|
"github.com/prometheus/prometheus/tsdb/index"
|
||||||
"github.com/prometheus/prometheus/tsdb/tombstones"
|
"github.com/prometheus/prometheus/tsdb/tombstones"
|
||||||
"github.com/prometheus/prometheus/tsdb/tsdbutil"
|
"github.com/prometheus/prometheus/tsdb/tsdbutil"
|
||||||
"github.com/prometheus/prometheus/tsdb/wlog"
|
"github.com/prometheus/prometheus/tsdb/wlog"
|
||||||
|
@ -493,6 +494,7 @@ func TestCompaction_populateBlock(t *testing.T) {
|
||||||
inputSeriesSamples [][]seriesSamples
|
inputSeriesSamples [][]seriesSamples
|
||||||
compactMinTime int64
|
compactMinTime int64
|
||||||
compactMaxTime int64 // When not defined the test runner sets a default of math.MaxInt64.
|
compactMaxTime int64 // When not defined the test runner sets a default of math.MaxInt64.
|
||||||
|
irPostingsFunc IndexReaderPostingsFunc
|
||||||
expSeriesSamples []seriesSamples
|
expSeriesSamples []seriesSamples
|
||||||
expErr error
|
expErr error
|
||||||
}{
|
}{
|
||||||
|
@ -961,6 +963,60 @@ func TestCompaction_populateBlock(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Populate from single block with index reader postings function selecting different series. Expect empty block.",
|
||||||
|
inputSeriesSamples: [][]seriesSamples{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "b"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
irPostingsFunc: func(ctx context.Context, reader IndexReader) index.Postings {
|
||||||
|
p, err := reader.Postings(ctx, "a", "c")
|
||||||
|
if err != nil {
|
||||||
|
return index.EmptyPostings()
|
||||||
|
}
|
||||||
|
return reader.SortedPostings(p)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Populate from single block with index reader postings function selecting one series. Expect partial block.",
|
||||||
|
inputSeriesSamples: [][]seriesSamples{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "b"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "c"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "d"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
irPostingsFunc: func(ctx context.Context, reader IndexReader) index.Postings {
|
||||||
|
p, err := reader.Postings(ctx, "a", "c", "d")
|
||||||
|
if err != nil {
|
||||||
|
return index.EmptyPostings()
|
||||||
|
}
|
||||||
|
return reader.SortedPostings(p)
|
||||||
|
},
|
||||||
|
expSeriesSamples: []seriesSamples{
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "c"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lset: map[string]string{"a": "d"},
|
||||||
|
chunks: [][]sample{{{t: 0}, {t: 10}}, {{t: 11}, {t: 20}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(tc.title, func(t *testing.T) {
|
t.Run(tc.title, func(t *testing.T) {
|
||||||
blocks := make([]BlockReader, 0, len(tc.inputSeriesSamples))
|
blocks := make([]BlockReader, 0, len(tc.inputSeriesSamples))
|
||||||
|
@ -982,7 +1038,11 @@ func TestCompaction_populateBlock(t *testing.T) {
|
||||||
|
|
||||||
iw := &mockIndexWriter{}
|
iw := &mockIndexWriter{}
|
||||||
blockPopulator := DefaultBlockPopulator{}
|
blockPopulator := DefaultBlockPopulator{}
|
||||||
err = blockPopulator.PopulateBlock(c.ctx, c.metrics, c.logger, c.chunkPool, c.mergeFunc, blocks, meta, iw, nopChunkWriter{})
|
irPostingsFunc := AllSortedPostings
|
||||||
|
if tc.irPostingsFunc != nil {
|
||||||
|
irPostingsFunc = tc.irPostingsFunc
|
||||||
|
}
|
||||||
|
err = blockPopulator.PopulateBlock(c.ctx, c.metrics, c.logger, c.chunkPool, c.mergeFunc, blocks, meta, iw, nopChunkWriter{}, irPostingsFunc)
|
||||||
if tc.expErr != nil {
|
if tc.expErr != nil {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.Equal(t, tc.expErr.Error(), err.Error())
|
require.Equal(t, tc.expErr.Error(), err.Error())
|
||||||
|
|
Loading…
Reference in a new issue