Skip to content

Commit

Permalink
Fix(blooms): Initialize bloom gateway client only once
Browse files Browse the repository at this point in the history
The bloom gateway client is used both in the bloom builder and in the
index gateways. When running Loki in SSD mode, both services are part of
the `backend` target, and therefore the client is initialised twice,
leading to duplicate metrics registration and a subsequent panic.

This commit extracts the initialisation of the bloom gateway client into
a separate service that is started once and becomes a dependency of both
bloom builder and index gateway.

Ref: #14083

Signed-off-by: Christian Haudum <christian.haudum@gmail.com>
  • Loading branch information
chaudum committed Jan 29, 2025
1 parent 65f5990 commit 005f17f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
4 changes: 3 additions & 1 deletion pkg/loki/loki.go
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ type Loki struct {
ingesterQuerier *querier.IngesterQuerier
Store storage.Store
BloomStore bloomshipper.Store
bloomGatewayClient bloomgateway.Client
tableManager *index.TableManager
frontend Frontend
ruler *base_ruler.Ruler
Expand Down Expand Up @@ -694,6 +695,7 @@ func (t *Loki) setupModuleManager() error {
mm.RegisterModule(IndexGatewayRing, t.initIndexGatewayRing, modules.UserInvisibleModule)
mm.RegisterModule(IndexGatewayInterceptors, t.initIndexGatewayInterceptors, modules.UserInvisibleModule)
mm.RegisterModule(BloomGateway, t.initBloomGateway)
mm.RegisterModule(BloomGatewayClient, t.initBloomGatewayClient)
mm.RegisterModule(QueryScheduler, t.initQueryScheduler)
mm.RegisterModule(QuerySchedulerRing, t.initQuerySchedulerRing, modules.UserInvisibleModule)
mm.RegisterModule(Analytics, t.initAnalytics, modules.UserInvisibleModule)
Expand Down Expand Up @@ -732,7 +734,7 @@ func (t *Loki) setupModuleManager() error {
BloomGateway: {Server, BloomStore, Analytics},
BloomPlanner: {Server, BloomStore, Analytics, Store},
BloomBuilder: {Server, BloomStore, Analytics, Store},
BloomStore: {IndexGatewayRing},
BloomStore: {IndexGatewayRing, BloomGatewayClient},
PatternRingClient: {Server, MemberlistKV, Analytics},
PatternIngesterTee: {Server, MemberlistKV, Analytics, PatternRingClient},
PatternIngester: {Server, MemberlistKV, Analytics, PatternRingClient, PatternIngesterTee, Overrides},
Expand Down
30 changes: 15 additions & 15 deletions pkg/loki/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ const (
IndexGatewayInterceptors = "index-gateway-interceptors"
BloomStore = "bloom-store"
BloomGateway = "bloom-gateway"
BloomGatewayClient = "bloom-gateway-client"
BloomPlanner = "bloom-planner"
BloomBuilder = "bloom-builder"
QueryScheduler = "query-scheduler"
Expand Down Expand Up @@ -1549,16 +1550,12 @@ func (t *Loki) initIndexGateway() (services.Service, error) {

var bloomQuerier indexgateway.BloomQuerier
if t.Cfg.BloomGateway.Enabled {
bloomGatewayClient, err := bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
if err != nil {
return nil, err
}
resolver := bloomgateway.NewBlockResolver(t.BloomStore, logger)
querierCfg := bloomgateway.QuerierConfig{
BuildTableOffset: t.Cfg.BloomBuild.Planner.MinTableOffset,
BuildInterval: t.Cfg.BloomBuild.Planner.PlanningInterval,
}
bloomQuerier = bloomgateway.NewQuerier(bloomGatewayClient, querierCfg, t.Overrides, resolver, prometheus.DefaultRegisterer, logger)
bloomQuerier = bloomgateway.NewQuerier(t.bloomGatewayClient, querierCfg, t.Overrides, resolver, prometheus.DefaultRegisterer, logger)
}

gateway, err := indexgateway.NewIndexGateway(t.Cfg.IndexGateway, t.Overrides, logger, prometheus.DefaultRegisterer, t.Store, indexClients, bloomQuerier)
Expand Down Expand Up @@ -1653,6 +1650,18 @@ func (t *Loki) initBloomPlanner() (services.Service, error) {
return p, nil
}

func (t *Loki) initBloomGatewayClient() (services.Service, error) {
var err error
if t.Cfg.BloomGateway.Enabled {
logger := log.With(util_log.Logger, "component", "bloom-gateway-client")
t.bloomGatewayClient, err = bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
if err != nil {
return nil, err
}
}
return nil, nil
}

func (t *Loki) initBloomBuilder() (services.Service, error) {
if !t.Cfg.BloomBuild.Enabled {
return nil, nil
Expand All @@ -1670,15 +1679,6 @@ func (t *Loki) initBloomBuilder() (services.Service, error) {
ringManager = t.indexGatewayRingManager
}

var bloomGatewayClient bloomgateway.Client
if t.Cfg.BloomGateway.Enabled {
var err error
bloomGatewayClient, err = bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
if err != nil {
return nil, err
}
}

return builder.New(
t.Cfg.BloomBuild.Builder,
t.Overrides,
Expand All @@ -1687,7 +1687,7 @@ func (t *Loki) initBloomBuilder() (services.Service, error) {
t.ClientMetrics,
t.Store,
t.BloomStore,
bloomGatewayClient,
t.bloomGatewayClient,
logger,
prometheus.DefaultRegisterer,
ringManager,
Expand Down

0 comments on commit 005f17f

Please sign in to comment.