diff --git a/CHANGELOG.md b/CHANGELOG.md index 6147b7e307..3df3b6efd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ * [ENHANCEMENT] Store-gateway: retry synching blocks if a per-tenant sync fails. #3975 #4088 * [ENHANCEMENT] Add metric `cortex_tcp_connections` exposing the current number of accepted TCP connections. #4099 * [ENHANCEMENT] Querier: Allow federated queries to run concurrently. #4065 +* [ENHANCEMENT] Label Values API call now supports `match[]` parameter when querying blocks on storage (assuming `-querier.query-store-for-labels-enabled` is enabled). #4133 * [BUGFIX] Ruler-API: fix bug where `/api/v1/rules//` endpoint return `400` instead of `404`. #4013 * [BUGFIX] Distributor: reverted changes done to rate limiting in #3825. #3948 * [BUGFIX] Ingester: Fix race condition when opening and closing tsdb concurrently. #3959 diff --git a/go.mod b/go.mod index 7542fc0e00..f7dd0520b6 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( github.com/sony/gobreaker v0.4.1 github.com/spf13/afero v1.2.2 github.com/stretchr/testify v1.7.0 - github.com/thanos-io/thanos v0.19.1-0.20210423085824-268cc30e2dd8 + github.com/thanos-io/thanos v0.19.1-0.20210427154226-d5bd651319d2 github.com/uber/jaeger-client-go v2.25.0+incompatible github.com/weaveworks/common v0.0.0-20210419092856-009d1eebd624 go.etcd.io/bbolt v1.3.5 diff --git a/go.sum b/go.sum index bcdd42b534..70f1f8956e 100644 --- a/go.sum +++ b/go.sum @@ -1351,8 +1351,8 @@ github.com/thanos-io/thanos v0.13.1-0.20210204123931-82545cdd16fe/go.mod h1:ZLDG github.com/thanos-io/thanos v0.13.1-0.20210224074000-659446cab117/go.mod h1:kdqFpzdkveIKpNNECVJd75RPvgsAifQgJymwCdfev1w= github.com/thanos-io/thanos v0.13.1-0.20210226164558-03dace0a1aa1/go.mod h1:gMCy4oCteKTT7VuXVvXLTPGzzjovX1VPE5p+HgL1hyU= github.com/thanos-io/thanos v0.13.1-0.20210401085038-d7dff0c84d17/go.mod h1:zU8KqE+6A+HksK4wiep8e/3UvCZLm+Wrw9AqZGaAm9k= -github.com/thanos-io/thanos v0.19.1-0.20210423085824-268cc30e2dd8 h1:M1t8SnLQgsF8x6HWS4TMUB7SmrmJBffnXZKu0CmYZcg= -github.com/thanos-io/thanos v0.19.1-0.20210423085824-268cc30e2dd8/go.mod h1:zvSf4uKtey4KjSVcalV/5oUuGthaTzI8kVDrO42I8II= +github.com/thanos-io/thanos v0.19.1-0.20210427154226-d5bd651319d2 h1:L6U4VYeIConcO4GaFOAaZW4Gwr+lIVfBprW9a0+py/k= +github.com/thanos-io/thanos v0.19.1-0.20210427154226-d5bd651319d2/go.mod h1:zvSf4uKtey4KjSVcalV/5oUuGthaTzI8kVDrO42I8II= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab h1:7ZR3hmisBWw77ZpO1/o86g+JV3VKlk3d48jopJxzTjU= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab/go.mod h1:eheTFp954zcWZXCU8d0AT76ftsQOTo4DTqkN/h3k1MY= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= diff --git a/integration/e2ecortex/client.go b/integration/e2ecortex/client.go index 99621cf720..0885d4084d 100644 --- a/integration/e2ecortex/client.go +++ b/integration/e2ecortex/client.go @@ -185,8 +185,8 @@ func (c *Client) Series(matches []string, start, end time.Time) ([]model.LabelSe } // LabelValues gets label values -func (c *Client) LabelValues(label string, start, end time.Time) (model.LabelValues, error) { - result, _, err := c.querierClient.LabelValues(context.Background(), label, nil, start, end) +func (c *Client) LabelValues(label string, start, end time.Time, matches []string) (model.LabelValues, error) { + result, _, err := c.querierClient.LabelValues(context.Background(), label, matches, start, end) return result, err } diff --git a/integration/getting_started_single_process_config_test.go b/integration/getting_started_single_process_config_test.go index f1e04da6a4..ee497ada5b 100644 --- a/integration/getting_started_single_process_config_test.go +++ b/integration/getting_started_single_process_config_test.go @@ -45,7 +45,7 @@ func TestGettingStartedSingleProcessConfigWithChunksStorage(t *testing.T) { require.Equal(t, model.ValVector, result.Type()) assert.Equal(t, expectedVector, result.(model.Vector)) - labelValues, err := c.LabelValues("foo", time.Time{}, time.Time{}) + labelValues, err := c.LabelValues("foo", time.Time{}, time.Time{}, nil) require.NoError(t, err) require.Equal(t, model.LabelValues{"bar"}, labelValues) @@ -100,7 +100,7 @@ func TestGettingStartedSingleProcessConfigWithBlocksStorage(t *testing.T) { require.Equal(t, model.ValVector, result.Type()) assert.Equal(t, expectedVector, result.(model.Vector)) - labelValues, err := c.LabelValues("foo", time.Time{}, time.Time{}) + labelValues, err := c.LabelValues("foo", time.Time{}, time.Time{}, nil) require.NoError(t, err) require.Equal(t, model.LabelValues{"bar"}, labelValues) diff --git a/integration/querier_test.go b/integration/querier_test.go index baef356dfc..cb84cb3e41 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -483,8 +483,9 @@ func testMetadataQueriesWithBlocksStorage( resp []prompb.Label } type labelValuesTest struct { - label string - resp []string + label string + matches []string + resp []string } testCases := map[string]struct { @@ -520,6 +521,16 @@ func testMetadataQueriesWithBlocksStorage( label: labels.MetricName, resp: []string{firstSeriesInIngesterHeadName}, }, + { + label: labels.MetricName, + resp: []string{firstSeriesInIngesterHeadName}, + matches: []string{firstSeriesInIngesterHeadName}, + }, + { + label: labels.MetricName, + resp: []string{}, + matches: []string{lastSeriesInStorageName}, + }, }, labelNames: []string{labels.MetricName, firstSeriesInIngesterHeadName}, }, @@ -546,6 +557,17 @@ func testMetadataQueriesWithBlocksStorage( label: labels.MetricName, resp: []string{lastSeriesInIngesterBlocksName}, }, + + { + label: labels.MetricName, + resp: []string{lastSeriesInIngesterBlocksName}, + matches: []string{lastSeriesInIngesterBlocksName}, + }, + { + label: labels.MetricName, + resp: []string{}, + matches: []string{firstSeriesInIngesterHeadName}, + }, }, labelNames: []string{labels.MetricName, lastSeriesInIngesterBlocksName}, }, @@ -574,6 +596,21 @@ func testMetadataQueriesWithBlocksStorage( label: labels.MetricName, resp: []string{lastSeriesInStorageName, lastSeriesInIngesterBlocksName, firstSeriesInIngesterHeadName}, }, + { + label: labels.MetricName, + resp: []string{lastSeriesInStorageName}, + matches: []string{lastSeriesInStorageName}, + }, + { + label: labels.MetricName, + resp: []string{lastSeriesInIngesterBlocksName}, + matches: []string{lastSeriesInIngesterBlocksName}, + }, + { + label: labels.MetricName, + resp: []string{lastSeriesInStorageName, lastSeriesInIngesterBlocksName}, + matches: []string{lastSeriesInStorageName, lastSeriesInIngesterBlocksName}, + }, }, labelNames: []string{labels.MetricName, lastSeriesInStorageName, lastSeriesInIngesterBlocksName, firstSeriesInIngesterHeadName}, }, @@ -601,6 +638,16 @@ func testMetadataQueriesWithBlocksStorage( label: labels.MetricName, resp: []string{lastSeriesInStorageName, firstSeriesInIngesterHeadName}, }, + { + label: labels.MetricName, + resp: []string{lastSeriesInStorageName}, + matches: []string{lastSeriesInStorageName}, + }, + { + label: labels.MetricName, + resp: []string{firstSeriesInIngesterHeadName}, + matches: []string{firstSeriesInIngesterHeadName}, + }, }, labelNames: []string{labels.MetricName, lastSeriesInStorageName, firstSeriesInIngesterHeadName}, }, @@ -620,7 +667,7 @@ func testMetadataQueriesWithBlocksStorage( } for _, lvt := range tc.labelValuesTests { - labelsRes, err := c.LabelValues(lvt.label, tc.from, tc.to) + labelsRes, err := c.LabelValues(lvt.label, tc.from, tc.to, lvt.matches) require.NoError(t, err) exp := model.LabelValues{} for _, val := range lvt.resp { diff --git a/pkg/querier/blocks_store_queryable.go b/pkg/querier/blocks_store_queryable.go index a561b7e271..42121e951d 100644 --- a/pkg/querier/blocks_store_queryable.go +++ b/pkg/querier/blocks_store_queryable.go @@ -875,11 +875,11 @@ func createLabelNamesRequest(minT, maxT int64, blockIDs []ulid.ULID) (*storepb.L } func createLabelValuesRequest(minT, maxT int64, label string, blockIDs []ulid.ULID, matchers ...*labels.Matcher) (*storepb.LabelValuesRequest, error) { - // TODO(replay): add matchers to LabelValuesRequest once it has that property req := &storepb.LabelValuesRequest{ - Start: minT, - End: maxT, - Label: label, + Start: minT, + End: maxT, + Label: label, + Matchers: convertMatchersToLabelMatcher(matchers), } // Selectively query only specific blocks. diff --git a/vendor/github.com/thanos-io/thanos/pkg/block/indexheader/header.go b/vendor/github.com/thanos-io/thanos/pkg/block/indexheader/header.go index 657427bd6f..8ecef33564 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/block/indexheader/header.go +++ b/vendor/github.com/thanos-io/thanos/pkg/block/indexheader/header.go @@ -35,6 +35,6 @@ type Reader interface { // then empty string is returned and no error. LabelValues(name string) ([]string, error) - // LabelNames returns all label names. + // LabelNames returns all label names in sorted order. LabelNames() ([]string, error) } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go index e2f384f0da..e8aaf293e1 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go @@ -282,7 +282,8 @@ type BucketStore struct { // chunksLimiterFactory creates a new limiter used to limit the number of chunks fetched by each Series() call. chunksLimiterFactory ChunksLimiterFactory - // seriesLimiterFactory creates a new limiter used to limit the number of touched series by each Series() call. + // seriesLimiterFactory creates a new limiter used to limit the number of touched series by each Series() call, + // or LabelName and LabelValues calls when used with matchers. seriesLimiterFactory SeriesLimiterFactory partitioner Partitioner @@ -746,14 +747,17 @@ func (s *bucketSeriesSet) Err() error { return s.err } +// blockSeries returns series matching given matchers, that have some data in given time range. func blockSeries( - extLset labels.Labels, - indexr *bucketIndexReader, - chunkr *bucketChunkReader, - matchers []*labels.Matcher, - req *storepb.SeriesRequest, - chunksLimiter ChunksLimiter, - seriesLimiter SeriesLimiter, + extLset labels.Labels, // External labels added to the returned series labels. + indexr *bucketIndexReader, // Index reader for block. + chunkr *bucketChunkReader, // Chunk reader for block. + matchers []*labels.Matcher, // Series matchers. + chunksLimiter ChunksLimiter, // Rate limiter for loading chunks. + seriesLimiter SeriesLimiter, // Rate limiter for loading series. + skipChunks bool, // If true, chunks are not loaded. + minTime, maxTime int64, // Series must have data in this time range to be returned. + loadAggregates []storepb.Aggr, // List of aggregates to load when loading chunks. ) (storepb.SeriesSet, *queryStats, error) { ps, err := indexr.ExpandedPostings(matchers) if err != nil { @@ -785,7 +789,7 @@ func blockSeries( chks []chunks.Meta ) for _, id := range ps { - ok, err := indexr.LoadSeriesForTime(id, &symbolizedLset, &chks, req.SkipChunks, req.MinTime, req.MaxTime) + ok, err := indexr.LoadSeriesForTime(id, &symbolizedLset, &chks, skipChunks, minTime, maxTime) if err != nil { return nil, nil, errors.Wrap(err, "read series") } @@ -795,7 +799,7 @@ func blockSeries( } s := seriesEntry{} - if !req.SkipChunks { + if !skipChunks { // Schedule loading chunks. s.refs = make([]uint64, 0, len(chks)) s.chks = make([]storepb.AggrChunk, 0, len(chks)) @@ -825,11 +829,11 @@ func blockSeries( res = append(res, s) } - if req.SkipChunks { + if skipChunks { return newBucketSeriesSet(res), indexr.stats, nil } - if err := chunkr.load(res, req.Aggregates); err != nil { + if err := chunkr.load(res, loadAggregates); err != nil { return nil, nil, errors.Wrap(err, "load chunks") } @@ -1026,9 +1030,11 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie indexr, chunkr, blockMatchers, - req, chunksLimiter, seriesLimiter, + req.SkipChunks, + req.MinTime, req.MaxTime, + req.Aggregates, ) if err != nil { return errors.Wrapf(err, "fetch series for block %s", b.meta.ULID) @@ -1154,16 +1160,14 @@ func chunksSize(chks []storepb.AggrChunk) (size int) { // LabelNames implements the storepb.StoreServer interface. func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesRequest) (*storepb.LabelNamesResponse, error) { - resHints := &hintspb.LabelNamesResponseHints{} - - g, gctx := errgroup.WithContext(ctx) + reqSeriesMatchers, err := storepb.MatchersToPromMatchers(req.Matchers...) + if err != nil { + return nil, status.Error(codes.InvalidArgument, errors.Wrap(err, "translate request labels matchers").Error()) + } - s.mtx.RLock() + resHints := &hintspb.LabelNamesResponseHints{} - var mtx sync.Mutex - var sets [][]string var reqBlockMatchers []*labels.Matcher - if req.Hints != nil { reqHints := &hintspb.LabelNamesRequestHints{} err := types.UnmarshalAny(req.Hints, reqHints) @@ -1177,7 +1181,16 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq } } + g, gctx := errgroup.WithContext(ctx) + + s.mtx.RLock() + + var mtx sync.Mutex + var sets [][]string + var seriesLimiter = s.seriesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("series")) + for _, b := range s.blocks { + b := b if !b.overlapsClosedInterval(req.Start, req.End) { continue } @@ -1188,32 +1201,60 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq resHints.AddQueriedBlock(b.meta.ULID) indexr := b.indexReader(gctx) - extLabels := b.meta.Thanos.Labels g.Go(func() error { defer runutil.CloseWithLogOnErr(s.logger, indexr, "label names") - // Do it via index reader to have pending reader registered correctly. - res, err := indexr.block.indexHeaderReader.LabelNames() - if err != nil { - return errors.Wrap(err, "label names") - } + var result []string + if len(reqSeriesMatchers) == 0 { + // Do it via index reader to have pending reader registered correctly. + // LabelNames are already sorted. + res, err := indexr.block.indexHeaderReader.LabelNames() + if err != nil { + return errors.Wrapf(err, "label names for block %s", b.meta.ULID) + } - // Add a set for the external labels as well. - // We're not adding them directly to res because there could be duplicates. - extRes := make([]string, 0, len(extLabels)) - for lName := range extLabels { - extRes = append(extRes, lName) - } + // Add a set for the external labels as well. + // We're not adding them directly to res because there could be duplicates. + // b.extLset is already sorted by label name, no need to sort it again. + extRes := make([]string, 0, len(b.extLset)) + for _, l := range b.extLset { + extRes = append(extRes, l.Name) + } + + result = strutil.MergeSlices(res, extRes) + } else { + seriesSet, _, err := blockSeries(b.extLset, indexr, nil, reqSeriesMatchers, nil, seriesLimiter, true, req.Start, req.End, nil) + if err != nil { + return errors.Wrapf(err, "fetch series for block %s", b.meta.ULID) + } - sort.Strings(res) - sort.Strings(extRes) + // Extract label names from all series. Many label names will be the same, so we need to deduplicate them. + // Note that label names will already include external labels (passed to blockSeries), so we don't need + // to add them again. + labelNames := map[string]struct{}{} + for seriesSet.Next() { + ls, _ := seriesSet.At() + for _, l := range ls { + labelNames[l.Name] = struct{}{} + } + } + if seriesSet.Err() != nil { + return errors.Wrapf(seriesSet.Err(), "iterate series for block %s", b.meta.ULID) + } - res = strutil.MergeSlices(res, extRes) + result = make([]string, 0, len(labelNames)) + for n := range labelNames { + result = append(result, n) + } + sort.Strings(result) + } - mtx.Lock() - sets = append(sets, res) - mtx.Unlock() + if len(result) > 0 { + mtx.Lock() + sets = append(sets, result) + mtx.Unlock() + } return nil }) @@ -1238,16 +1279,16 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq // LabelValues implements the storepb.StoreServer interface. func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesRequest) (*storepb.LabelValuesResponse, error) { + reqSeriesMatchers, err := storepb.MatchersToPromMatchers(req.Matchers...) + if err != nil { + return nil, status.Error(codes.InvalidArgument, errors.Wrap(err, "translate request labels matchers").Error()) + } + resHints := &hintspb.LabelValuesResponseHints{} g, gctx := errgroup.WithContext(ctx) - s.mtx.RLock() - - var mtx sync.Mutex - var sets [][]string var reqBlockMatchers []*labels.Matcher - if req.Hints != nil { reqHints := &hintspb.LabelValuesRequestHints{} err := types.UnmarshalAny(req.Hints, reqHints) @@ -1261,7 +1302,25 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR } } + // If we have series matchers, add != "" matcher, to only select series that have given label name. + if len(reqSeriesMatchers) > 0 { + m, err := labels.NewMatcher(labels.MatchNotEqual, req.Label, "") + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + reqSeriesMatchers = append(reqSeriesMatchers, m) + } + + s.mtx.RLock() + + var mtx sync.Mutex + var sets [][]string + var seriesLimiter = s.seriesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("series")) + for _, b := range s.blocks { + b := b + if !b.overlapsClosedInterval(req.Start, req.End) { continue } @@ -1272,25 +1331,55 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR resHints.AddQueriedBlock(b.meta.ULID) indexr := b.indexReader(gctx) - extLabels := b.meta.Thanos.Labels g.Go(func() error { defer runutil.CloseWithLogOnErr(s.logger, indexr, "label values") - // Do it via index reader to have pending reader registered correctly. - res, err := indexr.block.indexHeaderReader.LabelValues(req.Label) - if err != nil { - return errors.Wrap(err, "index header label values") - } + var result []string + if len(reqSeriesMatchers) == 0 { + // Do it via index reader to have pending reader registered correctly. + res, err := indexr.block.indexHeaderReader.LabelValues(req.Label) + if err != nil { + return errors.Wrapf(err, "index header label values for block %s", b.meta.ULID) + } - // Add the external label value as well. - if extLabelValue, ok := extLabels[req.Label]; ok { - res = strutil.MergeSlices(res, []string{extLabelValue}) + // Add the external label value as well. + if extLabelValue := b.extLset.Get(req.Label); extLabelValue != "" { + res = strutil.MergeSlices(res, []string{extLabelValue}) + } + result = res + } else { + seriesSet, _, err := blockSeries(b.extLset, indexr, nil, reqSeriesMatchers, nil, seriesLimiter, true, req.Start, req.End, nil) + if err != nil { + return errors.Wrapf(err, "fetch series for block %s", b.meta.ULID) + } + + // Extract given label's value from all series and deduplicate them. + // We don't need to deal with external labels, since they are already added by blockSeries. + values := map[string]struct{}{} + for seriesSet.Next() { + ls, _ := seriesSet.At() + val := ls.Get(req.Label) + if val != "" { // Should never be empty since we added labelName!="" matcher to the list of matchers. + values[val] = struct{}{} + } + } + if seriesSet.Err() != nil { + return errors.Wrapf(seriesSet.Err(), "iterate series for block %s", b.meta.ULID) + } + + result = make([]string, 0, len(values)) + for n := range values { + result = append(result, n) + } + sort.Strings(result) } - mtx.Lock() - sets = append(sets, res) - mtx.Unlock() + if len(result) > 0 { + mtx.Lock() + sets = append(sets, result) + mtx.Unlock() + } return nil }) diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go index 26e334a30f..9c0ddf4ae8 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go @@ -422,7 +422,8 @@ type LabelNamesRequest struct { // hints is an opaque data structure that can be used to carry additional information. // The content of this field and whether it's supported depends on the // implementation of a specific store. - Hints *types.Any `protobuf:"bytes,5,opt,name=hints,proto3" json:"hints,omitempty"` + Hints *types.Any `protobuf:"bytes,5,opt,name=hints,proto3" json:"hints,omitempty"` + Matchers []LabelMatcher `protobuf:"bytes,6,rep,name=matchers,proto3" json:"matchers"` } func (m *LabelNamesRequest) Reset() { *m = LabelNamesRequest{} } @@ -607,73 +608,74 @@ func init() { func init() { proto.RegisterFile("store/storepb/rpc.proto", fileDescriptor_a938d55a388af629) } var fileDescriptor_a938d55a388af629 = []byte{ - // 1054 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x5d, 0x6f, 0x1b, 0x45, - 0x17, 0xf6, 0x7a, 0xfd, 0x79, 0x9c, 0xe4, 0xdd, 0x4e, 0x9c, 0x74, 0xe3, 0x4a, 0x8e, 0x65, 0xe9, - 0x95, 0xac, 0xa8, 0xd8, 0x60, 0x50, 0x25, 0x50, 0x6f, 0xec, 0xc4, 0x90, 0x88, 0xc6, 0x81, 0x71, - 0xdc, 0x40, 0x11, 0xb2, 0xd6, 0xce, 0x74, 0xbd, 0x8a, 0xf7, 0x83, 0x9d, 0x31, 0x89, 0xef, 0x10, - 0xdc, 0x23, 0xc4, 0x7f, 0x42, 0xca, 0x1d, 0xbd, 0x44, 0x5c, 0x54, 0x90, 0xfc, 0x11, 0x34, 0x1f, - 0x6b, 0x7b, 0x43, 0xda, 0x20, 0xa5, 0x37, 0xd6, 0x9c, 0xf3, 0x9c, 0x33, 0xe7, 0x99, 0xf3, 0xcc, - 0x19, 0x2f, 0x3c, 0xa4, 0xcc, 0x0f, 0x49, 0x43, 0xfc, 0x06, 0xc3, 0x46, 0x18, 0x8c, 0xea, 0x41, - 0xe8, 0x33, 0x1f, 0x65, 0xd8, 0xd8, 0xf2, 0x7c, 0x5a, 0xda, 0x8a, 0x07, 0xb0, 0x59, 0x40, 0xa8, - 0x0c, 0x29, 0x15, 0x6d, 0xdf, 0xf6, 0xc5, 0xb2, 0xc1, 0x57, 0xca, 0x5b, 0x89, 0x27, 0x04, 0xa1, - 0xef, 0xde, 0xc8, 0x53, 0x5b, 0x4e, 0xac, 0x21, 0x99, 0xdc, 0x84, 0x6c, 0xdf, 0xb7, 0x27, 0xa4, - 0x21, 0xac, 0xe1, 0xf4, 0x65, 0xc3, 0xf2, 0x66, 0x12, 0xaa, 0xfe, 0x0f, 0x56, 0x4f, 0x42, 0x87, - 0x11, 0x4c, 0x68, 0xe0, 0x7b, 0x94, 0x54, 0x7f, 0xd2, 0x60, 0x45, 0x79, 0xbe, 0x9b, 0x12, 0xca, - 0x50, 0x0b, 0x80, 0x39, 0x2e, 0xa1, 0x24, 0x74, 0x08, 0x35, 0xb5, 0x8a, 0x5e, 0x2b, 0x34, 0x1f, - 0xf1, 0x6c, 0x97, 0xb0, 0x31, 0x99, 0xd2, 0xc1, 0xc8, 0x0f, 0x66, 0xf5, 0x63, 0xc7, 0x25, 0x3d, - 0x11, 0xd2, 0x4e, 0x5d, 0xbe, 0xde, 0x4e, 0xe0, 0xa5, 0x24, 0xb4, 0x09, 0x19, 0x46, 0x3c, 0xcb, - 0x63, 0x66, 0xb2, 0xa2, 0xd5, 0xf2, 0x58, 0x59, 0xc8, 0x84, 0x6c, 0x48, 0x82, 0x89, 0x33, 0xb2, - 0x4c, 0xbd, 0xa2, 0xd5, 0x74, 0x1c, 0x99, 0xd5, 0x55, 0x28, 0x1c, 0x78, 0x2f, 0x7d, 0xc5, 0xa1, - 0xfa, 0x6b, 0x12, 0x56, 0xa4, 0x2d, 0x59, 0xa2, 0x11, 0x64, 0xc4, 0x41, 0x23, 0x42, 0xab, 0x75, - 0xd9, 0xd8, 0xfa, 0x33, 0xee, 0x6d, 0x3f, 0xe5, 0x14, 0xfe, 0x7c, 0xbd, 0xfd, 0x91, 0xed, 0xb0, - 0xf1, 0x74, 0x58, 0x1f, 0xf9, 0x6e, 0x43, 0x06, 0xbc, 0xe7, 0xf8, 0x6a, 0xd5, 0x08, 0xce, 0xec, - 0x46, 0xac, 0x67, 0xf5, 0x17, 0x22, 0x1b, 0xab, 0xad, 0xd1, 0x16, 0xe4, 0x5c, 0xc7, 0x1b, 0xf0, - 0x83, 0x08, 0xe2, 0x3a, 0xce, 0xba, 0x8e, 0xc7, 0x4f, 0x2a, 0x20, 0xeb, 0x42, 0x42, 0x8a, 0xba, - 0x6b, 0x5d, 0x08, 0xa8, 0x01, 0x79, 0xb1, 0xeb, 0xf1, 0x2c, 0x20, 0x66, 0xaa, 0xa2, 0xd5, 0xd6, - 0x9a, 0x0f, 0x22, 0x76, 0xbd, 0x08, 0xc0, 0x8b, 0x18, 0xf4, 0x04, 0x40, 0x14, 0x1c, 0x50, 0xc2, - 0xa8, 0x99, 0x16, 0xe7, 0x99, 0x67, 0x48, 0x4a, 0x3d, 0xc2, 0x54, 0x5b, 0xf3, 0x13, 0x65, 0xd3, - 0xea, 0x6f, 0x3a, 0xac, 0xca, 0x96, 0x47, 0x52, 0x2d, 0x13, 0xd6, 0xde, 0x4c, 0x38, 0x19, 0x27, - 0xfc, 0x84, 0x43, 0x6c, 0x34, 0x26, 0x21, 0x35, 0x75, 0x51, 0xbd, 0x18, 0xeb, 0xe6, 0xa1, 0x04, - 0x15, 0x81, 0x79, 0x2c, 0x6a, 0xc2, 0x06, 0xdf, 0x32, 0x24, 0xd4, 0x9f, 0x4c, 0x99, 0xe3, 0x7b, - 0x83, 0x73, 0xc7, 0x3b, 0xf5, 0xcf, 0xc5, 0xa1, 0x75, 0xbc, 0xee, 0x5a, 0x17, 0x78, 0x8e, 0x9d, - 0x08, 0x08, 0x3d, 0x06, 0xb0, 0x6c, 0x3b, 0x24, 0xb6, 0xc5, 0x88, 0x3c, 0xeb, 0x5a, 0x73, 0x25, - 0xaa, 0xd6, 0xb2, 0xed, 0x10, 0x2f, 0xe1, 0xe8, 0x13, 0xd8, 0x0a, 0xac, 0x90, 0x39, 0xd6, 0x84, - 0x57, 0x11, 0xca, 0x0f, 0x4e, 0x1d, 0x6a, 0x0d, 0x27, 0xe4, 0xd4, 0xcc, 0x54, 0xb4, 0x5a, 0x0e, - 0x3f, 0x54, 0x01, 0xd1, 0xcd, 0xd8, 0x53, 0x30, 0xfa, 0xe6, 0x96, 0x5c, 0xca, 0x42, 0x8b, 0x11, - 0x7b, 0x66, 0x66, 0x85, 0x2c, 0xdb, 0x51, 0xe1, 0x2f, 0xe2, 0x7b, 0xf4, 0x54, 0xd8, 0xbf, 0x36, - 0x8f, 0x00, 0xb4, 0x0d, 0x05, 0x7a, 0xe6, 0x04, 0x83, 0xd1, 0x78, 0xea, 0x9d, 0x51, 0x33, 0x27, - 0xa8, 0x00, 0x77, 0xed, 0x0a, 0x0f, 0xda, 0x81, 0xf4, 0xd8, 0xf1, 0x18, 0x35, 0xf3, 0x15, 0x4d, - 0x34, 0x54, 0x4e, 0x60, 0x3d, 0x9a, 0xc0, 0x7a, 0xcb, 0x9b, 0x61, 0x19, 0x52, 0xfd, 0x59, 0x83, - 0xb5, 0x48, 0x47, 0x75, 0xbd, 0x6b, 0x90, 0x99, 0xcf, 0x1b, 0xcf, 0x5f, 0x9b, 0x5f, 0x20, 0xe1, - 0xdd, 0x4f, 0x60, 0x85, 0xa3, 0x12, 0x64, 0xcf, 0xad, 0xd0, 0x73, 0x3c, 0x5b, 0xce, 0xd6, 0x7e, - 0x02, 0x47, 0x0e, 0xf4, 0x38, 0x22, 0xa1, 0xbf, 0x99, 0xc4, 0x7e, 0x42, 0xd1, 0x68, 0xe7, 0x20, - 0x13, 0x12, 0x3a, 0x9d, 0xb0, 0xea, 0x0f, 0x49, 0x78, 0x20, 0x94, 0xef, 0x5a, 0xee, 0xe2, 0x72, - 0xbd, 0x55, 0x0c, 0xed, 0x1e, 0x62, 0x24, 0xef, 0x29, 0x46, 0x11, 0xd2, 0x94, 0x59, 0x21, 0x53, - 0x83, 0x28, 0x0d, 0x64, 0x80, 0x4e, 0xbc, 0x53, 0x75, 0x17, 0xf9, 0x72, 0xa1, 0x49, 0xfa, 0x6e, - 0x4d, 0x42, 0x40, 0xcb, 0x1d, 0x50, 0xb2, 0x14, 0x21, 0xed, 0x71, 0x87, 0x78, 0x74, 0xf2, 0x58, - 0x1a, 0xa8, 0x04, 0x39, 0xd5, 0x71, 0x6a, 0x26, 0x05, 0x30, 0xb7, 0x17, 0x35, 0xf5, 0xbb, 0x6b, - 0xfe, 0x9e, 0x54, 0x45, 0x9f, 0x5b, 0x93, 0xe9, 0xa2, 0xef, 0x45, 0x48, 0x8b, 0x99, 0x17, 0x3d, - 0xce, 0x63, 0x69, 0xbc, 0x5d, 0x8d, 0xe4, 0x3d, 0xd4, 0xd0, 0xdf, 0x95, 0x1a, 0xa9, 0x5b, 0xd4, - 0x48, 0xdf, 0xa2, 0x46, 0xe6, 0xce, 0xce, 0xc4, 0x5e, 0xa8, 0xec, 0x7f, 0x7f, 0xa1, 0xaa, 0x53, - 0x58, 0x8f, 0x35, 0x54, 0xc9, 0xb8, 0x09, 0x99, 0xef, 0x85, 0x47, 0xe9, 0xa8, 0xac, 0x77, 0x25, - 0xe4, 0xce, 0xb7, 0x90, 0x9f, 0x3f, 0xf4, 0xa8, 0x00, 0xd9, 0x7e, 0xf7, 0xf3, 0xee, 0xd1, 0x49, - 0xd7, 0x48, 0xa0, 0x3c, 0xa4, 0xbf, 0xec, 0x77, 0xf0, 0xd7, 0x86, 0x86, 0x72, 0x90, 0xc2, 0xfd, - 0x67, 0x1d, 0x23, 0xc9, 0x23, 0x7a, 0x07, 0x7b, 0x9d, 0xdd, 0x16, 0x36, 0x74, 0x1e, 0xd1, 0x3b, - 0x3e, 0xc2, 0x1d, 0x23, 0xc5, 0xfd, 0xb8, 0xb3, 0xdb, 0x39, 0x78, 0xde, 0x31, 0xd2, 0xdc, 0xbf, - 0xd7, 0x69, 0xf7, 0x3f, 0x33, 0x32, 0x3b, 0x6d, 0x48, 0xf1, 0x97, 0x12, 0x65, 0x41, 0xc7, 0xad, - 0x13, 0xb9, 0xeb, 0xee, 0x51, 0xbf, 0x7b, 0x6c, 0x68, 0xdc, 0xd7, 0xeb, 0x1f, 0x1a, 0x49, 0xbe, - 0x38, 0x3c, 0xe8, 0x1a, 0xba, 0x58, 0xb4, 0xbe, 0x92, 0xdb, 0x89, 0xa8, 0x0e, 0x36, 0xd2, 0xcd, - 0x1f, 0x93, 0x90, 0x16, 0x1c, 0xd1, 0x07, 0x90, 0xe2, 0xff, 0xac, 0x68, 0x3d, 0xea, 0xe8, 0xd2, - 0xff, 0x6e, 0xa9, 0x18, 0x77, 0xaa, 0xfe, 0x7d, 0x0c, 0x19, 0xf9, 0x0e, 0xa1, 0x8d, 0xf8, 0xbb, - 0x14, 0xa5, 0x6d, 0xde, 0x74, 0xcb, 0xc4, 0xf7, 0x35, 0xb4, 0x0b, 0xb0, 0x98, 0x2b, 0xb4, 0x15, - 0x53, 0x71, 0xf9, 0xb5, 0x29, 0x95, 0x6e, 0x83, 0x54, 0xfd, 0x4f, 0xa1, 0xb0, 0x24, 0x2b, 0x8a, - 0x87, 0xc6, 0x86, 0xa7, 0xf4, 0xe8, 0x56, 0x4c, 0xee, 0xd3, 0xec, 0xc2, 0x9a, 0xf8, 0xd2, 0xe1, - 0x53, 0x21, 0x9b, 0xf1, 0x14, 0x0a, 0x98, 0xb8, 0x3e, 0x23, 0xc2, 0x8f, 0xe6, 0xc7, 0x5f, 0xfe, - 0x20, 0x2a, 0x6d, 0xdc, 0xf0, 0xaa, 0x0f, 0xa7, 0x44, 0xfb, 0xff, 0x97, 0x7f, 0x97, 0x13, 0x97, - 0x57, 0x65, 0xed, 0xd5, 0x55, 0x59, 0xfb, 0xeb, 0xaa, 0xac, 0xfd, 0x72, 0x5d, 0x4e, 0xbc, 0xba, - 0x2e, 0x27, 0xfe, 0xb8, 0x2e, 0x27, 0x5e, 0x64, 0xd5, 0xb7, 0xdb, 0x30, 0x23, 0xee, 0xcc, 0x87, - 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xe5, 0x37, 0xcd, 0x25, 0x0a, 0x00, 0x00, + // 1060 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdf, 0x6e, 0x1a, 0xc7, + 0x17, 0x66, 0x59, 0x58, 0xe0, 0x60, 0xfb, 0xb7, 0x19, 0x63, 0x67, 0x4d, 0x24, 0x8c, 0x90, 0x7e, + 0x12, 0xb2, 0x52, 0x68, 0x69, 0x15, 0xa9, 0x55, 0x6e, 0xc0, 0xa6, 0xb5, 0xd5, 0x18, 0xb7, 0x83, + 0x89, 0xdb, 0x54, 0x15, 0x5a, 0xf0, 0x64, 0x59, 0x19, 0x76, 0xb7, 0x3b, 0x43, 0x6d, 0x6e, 0xdb, + 0xfb, 0xaa, 0xea, 0xd3, 0xf4, 0x05, 0x2a, 0xf9, 0xae, 0xb9, 0xac, 0x7a, 0x11, 0xb5, 0xf6, 0x8b, + 0x54, 0xf3, 0x67, 0x81, 0x75, 0x9d, 0xa4, 0x91, 0x73, 0x83, 0xe6, 0x9c, 0xef, 0x9c, 0x33, 0xdf, + 0x9c, 0x6f, 0xce, 0xb0, 0x70, 0x9f, 0x32, 0x3f, 0x24, 0x75, 0xf1, 0x1b, 0x0c, 0xea, 0x61, 0x30, + 0xac, 0x05, 0xa1, 0xcf, 0x7c, 0x64, 0xb0, 0x91, 0xed, 0xf9, 0xb4, 0xb8, 0x15, 0x0f, 0x60, 0xb3, + 0x80, 0x50, 0x19, 0x52, 0x2c, 0x38, 0xbe, 0xe3, 0x8b, 0x65, 0x9d, 0xaf, 0x94, 0xb7, 0x1c, 0x4f, + 0x08, 0x42, 0x7f, 0x72, 0x23, 0x4f, 0x95, 0x1c, 0xdb, 0x03, 0x32, 0xbe, 0x09, 0x39, 0xbe, 0xef, + 0x8c, 0x49, 0x5d, 0x58, 0x83, 0xe9, 0xf3, 0xba, 0xed, 0xcd, 0x24, 0x54, 0xf9, 0x1f, 0xac, 0x9e, + 0x84, 0x2e, 0x23, 0x98, 0xd0, 0xc0, 0xf7, 0x28, 0xa9, 0xfc, 0xa8, 0xc1, 0x8a, 0xf2, 0x7c, 0x37, + 0x25, 0x94, 0xa1, 0x26, 0x00, 0x73, 0x27, 0x84, 0x92, 0xd0, 0x25, 0xd4, 0xd2, 0xca, 0x7a, 0x35, + 0xdf, 0x78, 0xc0, 0xb3, 0x27, 0x84, 0x8d, 0xc8, 0x94, 0xf6, 0x87, 0x7e, 0x30, 0xab, 0x1d, 0xbb, + 0x13, 0xd2, 0x15, 0x21, 0xad, 0xd4, 0xe5, 0xcb, 0xed, 0x04, 0x5e, 0x4a, 0x42, 0x9b, 0x60, 0x30, + 0xe2, 0xd9, 0x1e, 0xb3, 0x92, 0x65, 0xad, 0x9a, 0xc3, 0xca, 0x42, 0x16, 0x64, 0x42, 0x12, 0x8c, + 0xdd, 0xa1, 0x6d, 0xe9, 0x65, 0xad, 0xaa, 0xe3, 0xc8, 0xac, 0xac, 0x42, 0xfe, 0xc0, 0x7b, 0xee, + 0x2b, 0x0e, 0x95, 0x5f, 0x92, 0xb0, 0x22, 0x6d, 0xc9, 0x12, 0x0d, 0xc1, 0x10, 0x07, 0x8d, 0x08, + 0xad, 0xd6, 0x64, 0x63, 0x6b, 0x4f, 0xb8, 0xb7, 0xf5, 0x98, 0x53, 0xf8, 0xf3, 0xe5, 0xf6, 0x47, + 0x8e, 0xcb, 0x46, 0xd3, 0x41, 0x6d, 0xe8, 0x4f, 0xea, 0x32, 0xe0, 0x3d, 0xd7, 0x57, 0xab, 0x7a, + 0x70, 0xe6, 0xd4, 0x63, 0x3d, 0xab, 0x3d, 0x13, 0xd9, 0x58, 0x95, 0x46, 0x5b, 0x90, 0x9d, 0xb8, + 0x5e, 0x9f, 0x1f, 0x44, 0x10, 0xd7, 0x71, 0x66, 0xe2, 0x7a, 0xfc, 0xa4, 0x02, 0xb2, 0x2f, 0x24, + 0xa4, 0xa8, 0x4f, 0xec, 0x0b, 0x01, 0xd5, 0x21, 0x27, 0xaa, 0x1e, 0xcf, 0x02, 0x62, 0xa5, 0xca, + 0x5a, 0x75, 0xad, 0x71, 0x2f, 0x62, 0xd7, 0x8d, 0x00, 0xbc, 0x88, 0x41, 0x8f, 0x00, 0xc4, 0x86, + 0x7d, 0x4a, 0x18, 0xb5, 0xd2, 0xe2, 0x3c, 0xf3, 0x0c, 0x49, 0xa9, 0x4b, 0x98, 0x6a, 0x6b, 0x6e, + 0xac, 0x6c, 0x5a, 0xf9, 0x4d, 0x87, 0x55, 0xd9, 0xf2, 0x48, 0xaa, 0x65, 0xc2, 0xda, 0xab, 0x09, + 0x27, 0xe3, 0x84, 0x1f, 0x71, 0x88, 0x0d, 0x47, 0x24, 0xa4, 0x96, 0x2e, 0x76, 0x2f, 0xc4, 0xba, + 0x79, 0x28, 0x41, 0x45, 0x60, 0x1e, 0x8b, 0x1a, 0xb0, 0xc1, 0x4b, 0x86, 0x84, 0xfa, 0xe3, 0x29, + 0x73, 0x7d, 0xaf, 0x7f, 0xee, 0x7a, 0xa7, 0xfe, 0xb9, 0x38, 0xb4, 0x8e, 0xd7, 0x27, 0xf6, 0x05, + 0x9e, 0x63, 0x27, 0x02, 0x42, 0x0f, 0x01, 0x6c, 0xc7, 0x09, 0x89, 0x63, 0x33, 0x22, 0xcf, 0xba, + 0xd6, 0x58, 0x89, 0x76, 0x6b, 0x3a, 0x4e, 0x88, 0x97, 0x70, 0xf4, 0x09, 0x6c, 0x05, 0x76, 0xc8, + 0x5c, 0x7b, 0xcc, 0x77, 0x11, 0xca, 0xf7, 0x4f, 0x5d, 0x6a, 0x0f, 0xc6, 0xe4, 0xd4, 0x32, 0xca, + 0x5a, 0x35, 0x8b, 0xef, 0xab, 0x80, 0xe8, 0x66, 0xec, 0x29, 0x18, 0x7d, 0x73, 0x4b, 0x2e, 0x65, + 0xa1, 0xcd, 0x88, 0x33, 0xb3, 0x32, 0x42, 0x96, 0xed, 0x68, 0xe3, 0x2f, 0xe2, 0x35, 0xba, 0x2a, + 0xec, 0x5f, 0xc5, 0x23, 0x00, 0x6d, 0x43, 0x9e, 0x9e, 0xb9, 0x41, 0x7f, 0x38, 0x9a, 0x7a, 0x67, + 0xd4, 0xca, 0x0a, 0x2a, 0xc0, 0x5d, 0xbb, 0xc2, 0x83, 0x76, 0x20, 0x3d, 0x72, 0x3d, 0x46, 0xad, + 0x5c, 0x59, 0x13, 0x0d, 0x95, 0x13, 0x58, 0x8b, 0x26, 0xb0, 0xd6, 0xf4, 0x66, 0x58, 0x86, 0x54, + 0x7e, 0xd2, 0x60, 0x2d, 0xd2, 0x51, 0x5d, 0xef, 0x2a, 0x18, 0xf3, 0x79, 0xe3, 0xf9, 0x6b, 0xf3, + 0x0b, 0x24, 0xbc, 0xfb, 0x09, 0xac, 0x70, 0x54, 0x84, 0xcc, 0xb9, 0x1d, 0x7a, 0xae, 0xe7, 0xc8, + 0xd9, 0xda, 0x4f, 0xe0, 0xc8, 0x81, 0x1e, 0x46, 0x24, 0xf4, 0x57, 0x93, 0xd8, 0x4f, 0x28, 0x1a, + 0xad, 0x2c, 0x18, 0x21, 0xa1, 0xd3, 0x31, 0xab, 0xfc, 0x9a, 0x84, 0x7b, 0x42, 0xf9, 0x8e, 0x3d, + 0x59, 0x5c, 0xae, 0xd7, 0x8a, 0xa1, 0xdd, 0x41, 0x8c, 0xe4, 0x1d, 0xc5, 0x28, 0x40, 0x9a, 0x32, + 0x3b, 0x64, 0x6a, 0x10, 0xa5, 0x81, 0x4c, 0xd0, 0x89, 0x77, 0xaa, 0xee, 0x22, 0x5f, 0x2e, 0x34, + 0x49, 0xbf, 0x51, 0x93, 0xd8, 0x4c, 0x18, 0xff, 0x7d, 0x26, 0x2a, 0x21, 0xa0, 0xe5, 0xce, 0x29, + 0x39, 0x0b, 0x90, 0xf6, 0xb8, 0x43, 0x3c, 0x56, 0x39, 0x2c, 0x0d, 0x54, 0x84, 0xac, 0x52, 0x8a, + 0x5a, 0x49, 0x01, 0xcc, 0xed, 0x05, 0x57, 0xfd, 0xcd, 0xf7, 0xe7, 0xf7, 0xa4, 0xda, 0xf4, 0xa9, + 0x3d, 0x9e, 0x2e, 0xf4, 0x2a, 0x40, 0x5a, 0xbc, 0x15, 0x42, 0x9b, 0x1c, 0x96, 0xc6, 0xeb, 0x55, + 0x4c, 0xde, 0x41, 0x45, 0xfd, 0x5d, 0xa9, 0x98, 0xba, 0x45, 0xc5, 0xf4, 0x2d, 0x2a, 0x1a, 0x6f, + 0xa7, 0x62, 0xe6, 0x2d, 0x54, 0x9c, 0xc2, 0x7a, 0xac, 0xa1, 0x4a, 0xc6, 0x4d, 0x30, 0xbe, 0x17, + 0x1e, 0xa5, 0xa3, 0xb2, 0xde, 0x95, 0x90, 0x3b, 0xdf, 0x42, 0x6e, 0xfe, 0x07, 0x81, 0xf2, 0x90, + 0xe9, 0x75, 0x3e, 0xef, 0x1c, 0x9d, 0x74, 0xcc, 0x04, 0xca, 0x41, 0xfa, 0xcb, 0x5e, 0x1b, 0x7f, + 0x6d, 0x6a, 0x28, 0x0b, 0x29, 0xdc, 0x7b, 0xd2, 0x36, 0x93, 0x3c, 0xa2, 0x7b, 0xb0, 0xd7, 0xde, + 0x6d, 0x62, 0x53, 0xe7, 0x11, 0xdd, 0xe3, 0x23, 0xdc, 0x36, 0x53, 0xdc, 0x8f, 0xdb, 0xbb, 0xed, + 0x83, 0xa7, 0x6d, 0x33, 0xcd, 0xfd, 0x7b, 0xed, 0x56, 0xef, 0x33, 0xd3, 0xd8, 0x69, 0x41, 0x8a, + 0xbf, 0xb0, 0x28, 0x03, 0x3a, 0x6e, 0x9e, 0xc8, 0xaa, 0xbb, 0x47, 0xbd, 0xce, 0xb1, 0xa9, 0x71, + 0x5f, 0xb7, 0x77, 0x68, 0x26, 0xf9, 0xe2, 0xf0, 0xa0, 0x63, 0xea, 0x62, 0xd1, 0xfc, 0x4a, 0x96, + 0x13, 0x51, 0x6d, 0x6c, 0xa6, 0x1b, 0x3f, 0x24, 0x21, 0x2d, 0x38, 0xa2, 0x0f, 0x20, 0xc5, 0xff, + 0x91, 0xd1, 0x7a, 0xd4, 0xd1, 0xa5, 0xff, 0xeb, 0x62, 0x21, 0xee, 0x54, 0xfd, 0xfb, 0x18, 0x0c, + 0xf9, 0x7e, 0xa1, 0x8d, 0xf8, 0x7b, 0x16, 0xa5, 0x6d, 0xde, 0x74, 0xcb, 0xc4, 0xf7, 0x35, 0xb4, + 0x0b, 0xb0, 0x98, 0x2b, 0xb4, 0x15, 0x53, 0x71, 0xf9, 0x95, 0x2a, 0x16, 0x6f, 0x83, 0xd4, 0xfe, + 0x9f, 0x42, 0x7e, 0x49, 0x56, 0x14, 0x0f, 0x8d, 0x0d, 0x4f, 0xf1, 0xc1, 0xad, 0x98, 0xac, 0xd3, + 0xe8, 0xc0, 0x9a, 0xf8, 0x42, 0xe2, 0x53, 0x21, 0x9b, 0xf1, 0x18, 0xf2, 0x98, 0x4c, 0x7c, 0x46, + 0x84, 0x1f, 0xcd, 0x8f, 0xbf, 0xfc, 0x21, 0x55, 0xdc, 0xb8, 0xe1, 0x55, 0x1f, 0x5c, 0x89, 0xd6, + 0xff, 0x2f, 0xff, 0x2e, 0x25, 0x2e, 0xaf, 0x4a, 0xda, 0x8b, 0xab, 0x92, 0xf6, 0xd7, 0x55, 0x49, + 0xfb, 0xf9, 0xba, 0x94, 0x78, 0x71, 0x5d, 0x4a, 0xfc, 0x71, 0x5d, 0x4a, 0x3c, 0xcb, 0xa8, 0x6f, + 0xbe, 0x81, 0x21, 0xee, 0xcc, 0x87, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x83, 0x98, 0x24, + 0x5d, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1370,6 +1372,20 @@ func (m *LabelNamesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Matchers) > 0 { + for iNdEx := len(m.Matchers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Matchers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRpc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } if m.Hints != nil { { size, err := m.Hints.MarshalToSizedBuffer(dAtA[:i]) @@ -1790,6 +1806,12 @@ func (m *LabelNamesRequest) Size() (n int) { l = m.Hints.Size() n += 1 + l + sovRpc(uint64(l)) } + if len(m.Matchers) > 0 { + for _, e := range m.Matchers { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } return n } @@ -2893,6 +2915,40 @@ func (m *LabelNamesRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Matchers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Matchers = append(m.Matchers, LabelMatcher{}) + if err := m.Matchers[len(m.Matchers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto index 78a8763396..3ef0185af8 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto @@ -150,6 +150,8 @@ message LabelNamesRequest { // The content of this field and whether it's supported depends on the // implementation of a specific store. google.protobuf.Any hints = 5; + + repeated LabelMatcher matchers = 6 [(gogoproto.nullable) = false]; } message LabelNamesResponse { diff --git a/vendor/modules.txt b/vendor/modules.txt index 2bb30fed43..fb83308c99 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -558,7 +558,7 @@ github.com/stretchr/objx github.com/stretchr/testify/assert github.com/stretchr/testify/mock github.com/stretchr/testify/require -# github.com/thanos-io/thanos v0.19.1-0.20210423085824-268cc30e2dd8 +# github.com/thanos-io/thanos v0.19.1-0.20210427154226-d5bd651319d2 ## explicit github.com/thanos-io/thanos/pkg/block github.com/thanos-io/thanos/pkg/block/indexheader