()
| 446 | } |
| 447 | |
| 448 | func (t *Cortex) initStoreQueryables() (services.Service, error) { |
| 449 | var servs []services.Service |
| 450 | |
| 451 | //nolint:revive // I prefer this form over removing 'else', because it allows q to have smaller scope. |
| 452 | var queriable prom_storage.Queryable |
| 453 | if q, err := initBlockStoreQueryable(t.Cfg, t.OverridesConfig, prometheus.DefaultRegisterer); err != nil { |
| 454 | return nil, fmt.Errorf("failed to initialize querier: %v", err) |
| 455 | } else { |
| 456 | queriable = q |
| 457 | if t.Cfg.Querier.EnableParquetQueryable { |
| 458 | pq, err := querier.NewParquetQueryable(t.Cfg.Querier, t.Cfg.BlocksStorage, t.OverridesConfig, q, util_log.Logger, prometheus.DefaultRegisterer) |
| 459 | if err != nil { |
| 460 | return nil, fmt.Errorf("failed to initialize parquet querier: %v", err) |
| 461 | } |
| 462 | queriable = pq |
| 463 | } |
| 464 | t.StoreQueryables = append(t.StoreQueryables, querier.UseAlwaysQueryable(queriable)) |
| 465 | if s, ok := queriable.(services.Service); ok { |
| 466 | servs = append(servs, s) |
| 467 | } |
| 468 | } |
| 469 | |
| 470 | // Return service, if any. |
| 471 | switch len(servs) { |
| 472 | case 0: |
| 473 | return nil, nil |
| 474 | case 1: |
| 475 | return servs[0], nil |
| 476 | default: |
| 477 | // TODO cleanup. |
| 478 | // No need to support this case yet. |
| 479 | // When we get there, we will need a wrapper service, that starts all subservices, and will also monitor them for failures. |
| 480 | // Not difficult, but also not necessary right now. |
| 481 | return nil, fmt.Errorf("too many services") |
| 482 | } |
| 483 | } |
| 484 | |
| 485 | func initBlockStoreQueryable(cfg Config, limits *validation.Overrides, reg prometheus.Registerer) (*querier.BlocksStoreQueryable, error) { |
| 486 | // When running in single binary, if the blocks sharding is disabled and no custom |
nothing calls this directly
no test coverage detected