5
5
"time"
6
6
7
7
"github.com/go-kit/log"
8
+ "github.com/go-kit/log/level"
9
+ "github.com/parquet-go/parquet-go"
8
10
"github.com/pkg/errors"
9
11
"github.com/prometheus-community/parquet-common/schema"
10
12
"github.com/prometheus-community/parquet-common/search"
@@ -16,14 +18,17 @@ import (
16
18
"github.com/prometheus/prometheus/tsdb/chunkenc"
17
19
"github.com/prometheus/prometheus/util/annotations"
18
20
"github.com/thanos-io/thanos/pkg/strutil"
21
+ "golang.org/x/sync/errgroup"
19
22
20
23
"github.com/cortexproject/cortex/pkg/storage/bucket"
21
24
cortex_tsdb "github.com/cortexproject/cortex/pkg/storage/tsdb"
22
25
"github.com/cortexproject/cortex/pkg/storage/tsdb/bucketindex"
23
26
"github.com/cortexproject/cortex/pkg/tenant"
24
27
"github.com/cortexproject/cortex/pkg/util"
28
+ util_log "github.com/cortexproject/cortex/pkg/util/log"
25
29
"github.com/cortexproject/cortex/pkg/util/multierror"
26
30
"github.com/cortexproject/cortex/pkg/util/services"
31
+ "github.com/cortexproject/cortex/pkg/util/validation"
27
32
)
28
33
29
34
type parquetQueryableFallbackMetrics struct {
@@ -59,12 +64,15 @@ type parquetQueryableWithFallback struct {
59
64
60
65
// metrics
61
66
metrics * parquetQueryableFallbackMetrics
67
+
68
+ limits * validation.Overrides
69
+ logger log.Logger
62
70
}
63
71
64
72
func NewParquetQueryable (
65
73
config Config ,
66
74
storageCfg cortex_tsdb.BlocksStorageConfig ,
67
- limits BlocksStoreLimits ,
75
+ limits * validation. Overrides ,
68
76
blockStorageQueryable * BlocksStoreQueryable ,
69
77
logger log.Logger ,
70
78
reg prometheus.Registerer ,
@@ -93,18 +101,29 @@ func NewParquetQueryable(
93
101
}
94
102
userBkt := bucket .NewUserBucketClient (userID , bucketClient , limits )
95
103
96
- shards := make ([]* parquet_storage.ParquetShard , 0 , len (blocks ))
97
-
98
- for _ , block := range blocks {
99
- // we always only have 1 shard - shard 0
100
- shard , err := parquet_storage .OpenParquetShard (ctx , userBkt , block .ID .String (), 0 )
101
- if err != nil {
102
- return nil , err
103
- }
104
- shards = append (shards , shard )
104
+ shards := make ([]* parquet_storage.ParquetShard , len (blocks ))
105
+ errGroup := & errgroup.Group {}
106
+
107
+ for i , block := range blocks {
108
+ errGroup .Go (func () error {
109
+ // we always only have 1 shard - shard 0
110
+ shard , err := parquet_storage .OpenParquetShard (ctx ,
111
+ userBkt ,
112
+ block .ID .String (),
113
+ 0 ,
114
+ parquet_storage .WithFileOptions (
115
+ parquet .SkipMagicBytes (true ),
116
+ parquet .ReadBufferSize (100 * 1024 ),
117
+ parquet .SkipBloomFilters (true ),
118
+ ),
119
+ parquet_storage .WithOptimisticReader (true ),
120
+ )
121
+ shards [i ] = shard
122
+ return err
123
+ })
105
124
}
106
125
107
- return shards , nil
126
+ return shards , errGroup . Wait ()
108
127
})
109
128
110
129
p := & parquetQueryableWithFallback {
@@ -115,6 +134,8 @@ func NewParquetQueryable(
115
134
subservicesWatcher : services .NewFailureWatcher (),
116
135
finder : blockStorageQueryable .finder ,
117
136
metrics : newParquetQueryableFallbackMetrics (reg ),
137
+ limits : limits ,
138
+ logger : logger ,
118
139
}
119
140
120
141
p .Service = services .NewBasicService (p .starting , p .running , p .stopping )
@@ -164,6 +185,8 @@ func (p *parquetQueryableWithFallback) Querier(mint, maxt int64) (storage.Querie
164
185
blocksStoreQuerier : bsq ,
165
186
finder : p .finder ,
166
187
metrics : p .metrics ,
188
+ limits : p .limits ,
189
+ logger : p .logger ,
167
190
}, nil
168
191
}
169
192
@@ -181,6 +204,9 @@ type parquetQuerierWithFallback struct {
181
204
182
205
// metrics
183
206
metrics * parquetQueryableFallbackMetrics
207
+
208
+ limits * validation.Overrides
209
+ logger log.Logger
184
210
}
185
211
186
212
func (q * parquetQuerierWithFallback ) LabelValues (ctx context.Context , name string , hints * storage.LabelHints , matchers ... * labels.Matcher ) ([]string , annotations.Annotations , error ) {
@@ -275,6 +301,18 @@ func (q *parquetQuerierWithFallback) LabelNames(ctx context.Context, hints *stor
275
301
}
276
302
277
303
func (q * parquetQuerierWithFallback ) Select (ctx context.Context , sortSeries bool , hints * storage.SelectHints , matchers ... * labels.Matcher ) storage.SeriesSet {
304
+ userID , err := tenant .TenantID (ctx )
305
+ if err != nil {
306
+ storage .ErrSeriesSet (err )
307
+ }
308
+
309
+ if q .limits .QueryVerticalShardSize (userID ) > 1 {
310
+ uLogger := util_log .WithUserID (userID , q .logger )
311
+ level .Warn (uLogger ).Log ("msg" , "parquet queryable enabled but vertical sharding > 1. Falling back to the block storage" )
312
+
313
+ return q .blocksStoreQuerier .Select (ctx , sortSeries , hints , matchers ... )
314
+ }
315
+
278
316
mint , maxt , limit := q .minT , q .maxT , 0
279
317
280
318
if hints != nil {
@@ -288,6 +326,11 @@ func (q *parquetQuerierWithFallback) Select(ctx context.Context, sortSeries bool
288
326
289
327
serieSets := []storage.SeriesSet {}
290
328
329
+ // Lets sort the series to merge
330
+ if len (parquet ) > 0 && len (remaining ) > 0 {
331
+ sortSeries = true
332
+ }
333
+
291
334
if len (parquet ) > 0 {
292
335
serieSets = append (serieSets , q .parquetQuerier .Select (InjectBlocksIntoContext (ctx , parquet ... ), sortSeries , hints , matchers ... ))
293
336
}
0 commit comments