Skip to content

Commit 302aedf

Browse files
npazosmendezfrancoposa
authored andcommitted
fix(parquet store gateway): panic in Series call with SkipChunks (#12020)
`chunksIt` is `nil` when `SkipChunks` is `true`.
1 parent 643f571 commit 302aedf

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

pkg/storegateway/parquet_bucket_store.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -771,14 +771,14 @@ func (s *ParquetBucketStore) sendSeriesChunks(req *storepb.SeriesRequest, srv st
771771
stats.streamingSeriesSendResponseDuration += sendDuration
772772
})
773773

774-
for labelsIt.Next() && chunksIt.Next() {
774+
for labelsIt.Next() && (req.SkipChunks || chunksIt.Next()) {
775775
lset := labelsIt.At()
776-
chks := chunksIt.At()
777776
seriesCount++
778777
series := storepb.Series{
779778
Labels: mimirpb.FromLabelsToLabelAdapters(lset),
780779
}
781780
if !req.SkipChunks {
781+
chks := chunksIt.At()
782782
series.Chunks = chks
783783
chunksCount += len(chks)
784784
s.metrics.chunkSizeBytes.Observe(float64(chunksSize(chks)))
@@ -792,7 +792,7 @@ func (s *ParquetBucketStore) sendSeriesChunks(req *storepb.SeriesRequest, srv st
792792
if labelsIt.Err() != nil {
793793
return errors.Wrap(labelsIt.Err(), "error iterating labels")
794794
}
795-
if chunksIt.Err() != nil {
795+
if !req.SkipChunks && chunksIt.Err() != nil {
796796
return errors.Wrap(chunksIt.Err(), "error iterating chunks")
797797
}
798798

pkg/storegateway/parquet_bucket_store_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,39 @@ func TestParquetBucketStore_Queries(t *testing.T) {
179179
require.Equal(t, seriesResultCount, 1, "Expected only one series result across all shards")
180180
})
181181

182+
t.Run("Series_SkipChunks", func(t *testing.T) {
183+
for _, tc := range []struct {
184+
name string
185+
batch uint64
186+
}{
187+
{name: "NonStreaming", batch: 0},
188+
{name: "Streaming", batch: 10},
189+
} {
190+
t.Run(tc.name, func(t *testing.T) {
191+
req := &storepb.SeriesRequest{
192+
MinTime: 0,
193+
MaxTime: 100,
194+
SkipChunks: true,
195+
StreamingChunksBatchSize: tc.batch,
196+
Matchers: []storepb.LabelMatcher{
197+
{
198+
Type: storepb.LabelMatcher_EQ,
199+
Name: labels.MetricName,
200+
Value: metricName,
201+
},
202+
},
203+
}
204+
seriesSet, warnings, err := grpcSeries(t, context.Background(), store, req)
205+
require.NoError(t, err)
206+
require.Empty(t, warnings)
207+
require.Len(t, seriesSet, 1)
208+
series := seriesSet[0]
209+
require.NotEmpty(t, series.Labels)
210+
require.Empty(t, series.Chunks)
211+
require.Equal(t, metricName, series.Labels[0].Value)
212+
})
213+
}
214+
})
182215
}
183216

184217
func createTestParquetBucketStore(t *testing.T, userID string, bkt objstore.Bucket) *ParquetBucketStore {

0 commit comments

Comments
 (0)