Skip to content

Commit cd7d881

Browse files
authored
Update parquet common + fix queryStoreAfter config for parquet querier (#6799)
* Update Parquet Common Signed-off-by: alanprot <[email protected]> * Fixing Query Store After on parquet -> we need to change the hints to we filter out the right chunks Signed-off-by: alanprot <[email protected]> * try to fix ingester test Signed-off-by: alanprot <[email protected]> * rename metric Signed-off-by: alanprot <[email protected]> --------- Signed-off-by: alanprot <[email protected]>
1 parent 9895f64 commit cd7d881

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+755
-19648
lines changed

go.mod

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ require (
8181
github.com/google/go-cmp v0.7.0
8282
github.com/hashicorp/golang-lru/v2 v2.0.7
8383
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
84-
github.com/parquet-go/parquet-go v0.25.0
85-
github.com/prometheus-community/parquet-common v0.0.0-20250528231323-eec9c3c020f0
84+
github.com/parquet-go/parquet-go v0.25.1
85+
github.com/prometheus-community/parquet-common v0.0.0-20250606162055-b81ebb7e1b96
8686
github.com/prometheus/procfs v0.16.1
8787
github.com/sercand/kuberesolver/v5 v5.1.1
8888
github.com/tjhop/slog-gokit v0.1.4
@@ -189,7 +189,6 @@ require (
189189
github.com/mailru/easyjson v0.9.0 // indirect
190190
github.com/mattn/go-colorable v0.1.14 // indirect
191191
github.com/mattn/go-isatty v0.0.20 // indirect
192-
github.com/mattn/go-runewidth v0.0.16 // indirect
193192
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
194193
github.com/mdlayher/socket v0.5.1 // indirect
195194
github.com/mdlayher/vsock v1.2.1 // indirect
@@ -206,7 +205,6 @@ require (
206205
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
207206
github.com/ncw/swift v1.0.53 // indirect
208207
github.com/oklog/run v1.1.0 // indirect
209-
github.com/olekukonko/tablewriter v0.0.5 // indirect
210208
github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.121.0 // indirect
211209
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.121.0 // indirect
212210
github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.121.0 // indirect
@@ -217,7 +215,6 @@ require (
217215
github.com/prometheus/exporter-toolkit v0.14.0 // indirect
218216
github.com/prometheus/sigv4 v0.1.2 // indirect
219217
github.com/redis/rueidis v1.0.60 // indirect
220-
github.com/rivo/uniseg v0.4.7 // indirect
221218
github.com/rs/cors v1.11.1 // indirect
222219
github.com/rs/xid v1.6.0 // indirect
223220
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect

go.sum

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,9 +1422,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
14221422
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
14231423
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
14241424
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
1425-
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
1426-
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
1427-
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
14281425
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
14291426
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
14301427
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
@@ -1490,8 +1487,6 @@ github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
14901487
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
14911488
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
14921489
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
1493-
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
1494-
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
14951490
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
14961491
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
14971492
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
@@ -1520,8 +1515,8 @@ github.com/oracle/oci-go-sdk/v65 v65.91.1/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8
15201515
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
15211516
github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI=
15221517
github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c=
1523-
github.com/parquet-go/parquet-go v0.25.0 h1:GwKy11MuF+al/lV6nUsFw8w8HCiPOSAx1/y8yFxjH5c=
1524-
github.com/parquet-go/parquet-go v0.25.0/go.mod h1:OqBBRGBl7+llplCvDMql8dEKaDqjaFA/VAPw+OJiNiw=
1518+
github.com/parquet-go/parquet-go v0.25.1 h1:l7jJwNM0xrk0cnIIptWMtnSnuxRkwq53S+Po3KG8Xgo=
1519+
github.com/parquet-go/parquet-go v0.25.1/go.mod h1:AXBuotO1XiBtcqJb/FKFyjBG4aqa3aQAAWF3ZPzCanY=
15251520
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
15261521
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
15271522
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -1548,8 +1543,8 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr
15481543
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
15491544
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
15501545
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
1551-
github.com/prometheus-community/parquet-common v0.0.0-20250528231323-eec9c3c020f0 h1:XCSo9v3if0v0G+aAO/hSUr/Ck9KJXcUPzDFt1dJnAV8=
1552-
github.com/prometheus-community/parquet-common v0.0.0-20250528231323-eec9c3c020f0/go.mod h1:zRW/xXBlELf8v9h9uqWvDkjOr3N5BtQGZ6LsDX9Ea/A=
1546+
github.com/prometheus-community/parquet-common v0.0.0-20250606162055-b81ebb7e1b96 h1:5EbDNJOxTWGpe6yzXdgcBCU63BRSrRAh0Q1oB5AVyoA=
1547+
github.com/prometheus-community/parquet-common v0.0.0-20250606162055-b81ebb7e1b96/go.mod h1:MwYpD+FKot7LWBMFaPS6FeM8oqo77u5erRlNkSSFPA0=
15531548
github.com/prometheus-community/prom-label-proxy v0.11.0 h1:IO02WiiFMfcIqvjhwMbCYnDJiTNcSHBrkCGRQ/7KDd0=
15541549
github.com/prometheus-community/prom-label-proxy v0.11.0/go.mod h1:lfvrG70XqsxWDrSh1843QXBG0fSg8EbIXmAo8xGsvw8=
15551550
github.com/prometheus/alertmanager v0.28.1 h1:BK5pCoAtaKg01BYRUJhEDV1tqJMEtYBGzPw8QdvnnvA=
@@ -1586,9 +1581,6 @@ github.com/redis/rueidis v1.0.60 h1:MGZX8uNdw7iyWz22JhjA/9iXzddfCUE/EMK4VxKoKpA=
15861581
github.com/redis/rueidis v1.0.60/go.mod h1:Lkhr2QTgcoYBhxARU7kJRO8SyVlgUuEkcJO1Y8MCluA=
15871582
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
15881583
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
1589-
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
1590-
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
1591-
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
15921584
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
15931585
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
15941586
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=

pkg/ingester/ingester_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6447,7 +6447,7 @@ func TestIngester_inflightPushRequests(t *testing.T) {
64476447

64486448
g, ctx := errgroup.WithContext(ctx)
64496449
g.Go(func() error {
6450-
count := 3500000
6450+
count := 150000
64516451
req := generateSamplesForLabel(labels.FromStrings(labels.MetricName, fmt.Sprintf("real-%d", count)), count, 1)
64526452
// Signal that we're going to do the real push now.
64536453
close(startCh)

pkg/querier/parquet_queryable.go

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func getBlockStoreType(ctx context.Context, defaultBlockStoreType blockStoreType
6868

6969
type parquetQueryableFallbackMetrics struct {
7070
blocksQueriedTotal *prometheus.CounterVec
71-
selectCount *prometheus.CounterVec
71+
operationsTotal *prometheus.CounterVec
7272
}
7373

7474
func newParquetQueryableFallbackMetrics(reg prometheus.Registerer) *parquetQueryableFallbackMetrics {
@@ -77,10 +77,10 @@ func newParquetQueryableFallbackMetrics(reg prometheus.Registerer) *parquetQuery
7777
Name: "cortex_parquet_queryable_blocks_queried_total",
7878
Help: "Total number of blocks found to query.",
7979
}, []string{"type"}),
80-
selectCount: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
81-
Name: "cortex_parquet_queryable_selects_queried_total",
82-
Help: "Total number of selects.",
83-
}, []string{"type"}),
80+
operationsTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
81+
Name: "cortex_parquet_queryable_operations_total",
82+
Help: "Total number of Operations.",
83+
}, []string{"type", "method"}),
8484
}
8585
}
8686

@@ -267,6 +267,7 @@ type parquetQuerierWithFallback struct {
267267

268268
func (q *parquetQuerierWithFallback) LabelValues(ctx context.Context, name string, hints *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) {
269269
remaining, parquet, err := q.getBlocks(ctx, q.minT, q.maxT)
270+
defer q.incrementOpsMetric("LabelValues", remaining, parquet)
270271
if err != nil {
271272
return nil, nil, err
272273
}
@@ -312,6 +313,7 @@ func (q *parquetQuerierWithFallback) LabelValues(ctx context.Context, name strin
312313

313314
func (q *parquetQuerierWithFallback) LabelNames(ctx context.Context, hints *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) {
314315
remaining, parquet, err := q.getBlocks(ctx, q.minT, q.maxT)
316+
defer q.incrementOpsMetric("LabelNames", remaining, parquet)
315317
if err != nil {
316318
return nil, nil, err
317319
}
@@ -356,7 +358,7 @@ func (q *parquetQuerierWithFallback) LabelNames(ctx context.Context, hints *stor
356358
return result, rAnnotations, nil
357359
}
358360

359-
func (q *parquetQuerierWithFallback) Select(ctx context.Context, sortSeries bool, hints *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet {
361+
func (q *parquetQuerierWithFallback) Select(ctx context.Context, sortSeries bool, h *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet {
360362
userID, err := tenant.TenantID(ctx)
361363
if err != nil {
362364
storage.ErrSeriesSet(err)
@@ -366,68 +368,101 @@ func (q *parquetQuerierWithFallback) Select(ctx context.Context, sortSeries bool
366368
uLogger := util_log.WithUserID(userID, q.logger)
367369
level.Warn(uLogger).Log("msg", "parquet queryable enabled but vertical sharding > 1. Falling back to the block storage")
368370

369-
return q.blocksStoreQuerier.Select(ctx, sortSeries, hints, matchers...)
371+
return q.blocksStoreQuerier.Select(ctx, sortSeries, h, matchers...)
370372
}
371373

372-
mint, maxt, limit := q.minT, q.maxT, 0
374+
hints := storage.SelectHints{
375+
Start: q.minT,
376+
End: q.maxT,
377+
}
373378

374-
if hints != nil {
379+
mint, maxt, limit := q.minT, q.maxT, 0
380+
if h != nil {
381+
// let copy the hints here as we wanna potentially modify it
382+
hints = *h
375383
mint, maxt, limit = hints.Start, hints.End, hints.Limit
376384
}
377385

386+
maxt = q.adjustMaxT(maxt)
387+
hints.End = maxt
388+
389+
if maxt < mint {
390+
return nil
391+
}
392+
378393
remaining, parquet, err := q.getBlocks(ctx, mint, maxt)
394+
defer q.incrementOpsMetric("Select", remaining, parquet)
395+
379396
if err != nil {
380397
return storage.ErrSeriesSet(err)
381398
}
382399

383-
serieSets := []storage.SeriesSet{}
384-
385400
// Lets sort the series to merge
386401
if len(parquet) > 0 && len(remaining) > 0 {
387402
sortSeries = true
388403
}
389404

405+
promises := make([]chan storage.SeriesSet, 0, 2)
406+
390407
if len(parquet) > 0 {
391-
serieSets = append(serieSets, q.parquetQuerier.Select(InjectBlocksIntoContext(ctx, parquet...), sortSeries, hints, matchers...))
408+
p := make(chan storage.SeriesSet, 1)
409+
promises = append(promises, p)
410+
go func() {
411+
p <- q.parquetQuerier.Select(InjectBlocksIntoContext(ctx, parquet...), sortSeries, &hints, matchers...)
412+
}()
392413
}
393414

394415
if len(remaining) > 0 {
395-
serieSets = append(serieSets, q.blocksStoreQuerier.Select(InjectBlocksIntoContext(ctx, remaining...), sortSeries, hints, matchers...))
416+
p := make(chan storage.SeriesSet, 1)
417+
promises = append(promises, p)
418+
go func() {
419+
p <- q.blocksStoreQuerier.Select(InjectBlocksIntoContext(ctx, remaining...), sortSeries, &hints, matchers...)
420+
}()
396421
}
397422

398-
if len(serieSets) == 1 {
399-
return serieSets[0]
423+
if len(promises) == 1 {
424+
return <-promises[0]
400425
}
401426

402-
return storage.NewMergeSeriesSet(serieSets, limit, storage.ChainedSeriesMerge)
403-
}
427+
seriesSets := make([]storage.SeriesSet, len(promises))
428+
for i, promise := range promises {
429+
seriesSets[i] = <-promise
430+
}
404431

405-
func (q *parquetQuerierWithFallback) Close() error {
406-
mErr := multierror.MultiError{}
407-
mErr.Add(q.parquetQuerier.Close())
408-
mErr.Add(q.blocksStoreQuerier.Close())
409-
return mErr.Err()
432+
return storage.NewMergeSeriesSet(seriesSets, limit, storage.ChainedSeriesMerge)
410433
}
411434

412-
func (q *parquetQuerierWithFallback) getBlocks(ctx context.Context, minT, maxT int64) ([]*bucketindex.Block, []*bucketindex.Block, error) {
435+
func (q *parquetQuerierWithFallback) adjustMaxT(maxt int64) int64 {
413436
// If queryStoreAfter is enabled, we do manipulate the query maxt to query samples up until
414437
// now - queryStoreAfter, because the most recent time range is covered by ingesters. This
415438
// optimization is particularly important for the blocks storage because can be used to skip
416439
// querying most recent not-compacted-yet blocks from the storage.
417440
if q.queryStoreAfter > 0 {
418441
now := time.Now()
419-
maxT = min(maxT, util.TimeToMillis(now.Add(-q.queryStoreAfter)))
420-
421-
if maxT < minT {
422-
return nil, nil, nil
423-
}
442+
maxt = min(maxt, util.TimeToMillis(now.Add(-q.queryStoreAfter)))
424443
}
444+
return maxt
445+
}
446+
447+
func (q *parquetQuerierWithFallback) Close() error {
448+
mErr := multierror.MultiError{}
449+
mErr.Add(q.parquetQuerier.Close())
450+
mErr.Add(q.blocksStoreQuerier.Close())
451+
return mErr.Err()
452+
}
425453

454+
func (q *parquetQuerierWithFallback) getBlocks(ctx context.Context, minT, maxT int64) ([]*bucketindex.Block, []*bucketindex.Block, error) {
426455
userID, err := tenant.TenantID(ctx)
427456
if err != nil {
428457
return nil, nil, err
429458
}
430459

460+
maxT = q.adjustMaxT(maxT)
461+
462+
if maxT < minT {
463+
return nil, nil, nil
464+
}
465+
431466
blocks, _, err := q.finder.GetBlocks(ctx, userID, minT, maxT)
432467
if err != nil {
433468
return nil, nil, err
@@ -446,17 +481,18 @@ func (q *parquetQuerierWithFallback) getBlocks(ctx context.Context, minT, maxT i
446481

447482
q.metrics.blocksQueriedTotal.WithLabelValues("parquet").Add(float64(len(parquetBlocks)))
448483
q.metrics.blocksQueriedTotal.WithLabelValues("tsdb").Add(float64(len(remaining)))
484+
return remaining, parquetBlocks, nil
485+
}
449486

487+
func (q *parquetQuerierWithFallback) incrementOpsMetric(method string, remaining []*bucketindex.Block, parquetBlocks []*bucketindex.Block) {
450488
switch {
451489
case len(remaining) > 0 && len(parquetBlocks) > 0:
452-
q.metrics.selectCount.WithLabelValues("mixed").Inc()
490+
q.metrics.operationsTotal.WithLabelValues("mixed", method).Inc()
453491
case len(remaining) > 0 && len(parquetBlocks) == 0:
454-
q.metrics.selectCount.WithLabelValues("tsdb").Inc()
492+
q.metrics.operationsTotal.WithLabelValues("tsdb", method).Inc()
455493
case len(remaining) == 0 && len(parquetBlocks) > 0:
456-
q.metrics.selectCount.WithLabelValues("parquet").Inc()
494+
q.metrics.operationsTotal.WithLabelValues("parquet", method).Inc()
457495
}
458-
459-
return remaining, parquetBlocks, nil
460496
}
461497

462498
type cacheInterface[T any] interface {

pkg/querier/parquet_queryable_test.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package querier
33
import (
44
"context"
55
"testing"
6+
"time"
67

78
"github.com/go-kit/log"
89
"github.com/oklog/ulid"
@@ -19,6 +20,7 @@ import (
1920
"github.com/cortexproject/cortex/pkg/querier/series"
2021
"github.com/cortexproject/cortex/pkg/storage/parquet"
2122
"github.com/cortexproject/cortex/pkg/storage/tsdb/bucketindex"
23+
"github.com/cortexproject/cortex/pkg/util"
2224
"github.com/cortexproject/cortex/pkg/util/flagext"
2325
"github.com/cortexproject/cortex/pkg/util/validation"
2426
)
@@ -27,7 +29,7 @@ func TestParquetQueryableFallbackLogic(t *testing.T) {
2729
block1 := ulid.MustNew(1, nil)
2830
block2 := ulid.MustNew(2, nil)
2931
minT := int64(10)
30-
maxT := int64(20)
32+
maxT := util.TimeToMillis(time.Now())
3133

3234
createStore := func() *blocksStoreSetMock {
3335
return &blocksStoreSetMock{mockedResponses: []interface{}{
@@ -124,13 +126,14 @@ func TestParquetQueryableFallbackLogic(t *testing.T) {
124126
finder: finder,
125127
blocksStoreQuerier: q,
126128
parquetQuerier: mParquetQuerier,
129+
queryStoreAfter: time.Hour,
127130
metrics: newParquetQueryableFallbackMetrics(prometheus.NewRegistry()),
128131
limits: defaultOverrides(t, 0),
129132
logger: log.NewNopLogger(),
130133
defaultBlockStoreType: parquetBlockStore,
131134
}
132135

133-
finder.On("GetBlocks", mock.Anything, "user-1", minT, maxT).Return(bucketindex.Blocks{
136+
finder.On("GetBlocks", mock.Anything, "user-1", minT, mock.Anything).Return(bucketindex.Blocks{
134137
&bucketindex.Block{ID: block1},
135138
&bucketindex.Block{ID: block2},
136139
}, map[ulid.ULID]*bucketindex.BlockDeletionMark(nil), nil)
@@ -246,30 +249,39 @@ func TestParquetQueryableFallbackLogic(t *testing.T) {
246249
}
247250

248251
mParquetQuerier := &mockParquetQuerier{}
252+
queryStoreAfter := time.Hour
249253
pq := &parquetQuerierWithFallback{
250254
minT: minT,
251255
maxT: maxT,
252256
finder: finder,
253257
blocksStoreQuerier: q,
254258
parquetQuerier: mParquetQuerier,
259+
queryStoreAfter: queryStoreAfter,
255260
metrics: newParquetQueryableFallbackMetrics(prometheus.NewRegistry()),
256261
limits: defaultOverrides(t, 0),
257262
logger: log.NewNopLogger(),
258263
defaultBlockStoreType: parquetBlockStore,
259264
}
260265

261-
finder.On("GetBlocks", mock.Anything, "user-1", minT, maxT).Return(bucketindex.Blocks{
266+
finder.On("GetBlocks", mock.Anything, "user-1", minT, mock.Anything).Return(bucketindex.Blocks{
262267
&bucketindex.Block{ID: block1, Parquet: &parquet.ConverterMarkMeta{Version: 1}},
263268
&bucketindex.Block{ID: block2, Parquet: &parquet.ConverterMarkMeta{Version: 1}},
264269
}, map[ulid.ULID]*bucketindex.BlockDeletionMark(nil), nil)
265270

266271
t.Run("select", func(t *testing.T) {
267272
stores.Reset()
268273
mParquetQuerier.Reset()
269-
ss := pq.Select(ctx, true, nil, matchers...)
274+
hints := storage.SelectHints{
275+
Start: minT,
276+
End: maxT,
277+
}
278+
ss := pq.Select(ctx, true, &hints, matchers...)
270279
require.NoError(t, ss.Err())
271280
require.Len(t, stores.queriedBlocks, 0)
272281
require.Len(t, mParquetQuerier.queriedBlocks, 2)
282+
require.Equal(t, mParquetQuerier.queriedHints.Start, minT)
283+
queriedDelta := time.Duration(maxT-mParquetQuerier.queriedHints.End) * time.Millisecond
284+
require.InDeltaf(t, queriedDelta.Minutes(), queryStoreAfter.Minutes(), 0.1, "query after not set")
273285
})
274286

275287
t.Run("labelNames", func(t *testing.T) {
@@ -409,13 +421,14 @@ func defaultOverrides(t *testing.T, queryVerticalShardSize int) *validation.Over
409421

410422
type mockParquetQuerier struct {
411423
queriedBlocks []*bucketindex.Block
424+
queriedHints *storage.SelectHints
412425
}
413426

414427
func (m *mockParquetQuerier) Select(ctx context.Context, sortSeries bool, sp *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet {
415428
if blocks, ok := ExtractBlocksFromContext(ctx); ok {
416429
m.queriedBlocks = append(m.queriedBlocks, blocks...)
417430
}
418-
431+
m.queriedHints = sp
419432
return series.NewConcreteSeriesSet(sortSeries, nil)
420433
}
421434

0 commit comments

Comments
 (0)