Skip to content

Commit 1f66c3b

Browse files
committed
Use WaitRingTokensAndZonesStability instead of WaitRingStability
Signed-off-by: Justin Jung <[email protected]>
1 parent 42445b6 commit 1f66c3b

File tree

8 files changed

+43
-117
lines changed

8 files changed

+43
-117
lines changed

pkg/ring/replication_set.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,9 @@ func HasReplicationSetChangedWithoutState(before, after ReplicationSet) bool {
145145
})
146146
}
147147

148-
// HasReplicationSetChangedWithoutStateAndAddress returns false if two replications sets
149-
// are the same (with possibly different timestamps, instance states and address),
150-
// true if they differ in any other way (number of instances, tokens, or zones).
151-
func HasReplicationSetChangedWithoutStateAndAddress(before, after ReplicationSet) bool {
148+
// HasReplicationSetTokensOrZonesChanged returns true if two replications sets
149+
// are different in number of instances, tokens and zones, false otherwise.
150+
func HasReplicationSetTokensOrZonesChanged(before, after ReplicationSet) bool {
152151
return hasReplicationSetChangedExcluding(before, after, func(i *InstanceDesc) {
153152
i.Timestamp = 0
154153
i.State = PENDING

pkg/ring/replication_set_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ func TestHasReplicationSetChangedWithoutStateAndAddress_IgnoresTimeStampAndState
341341
// Only testing difference to underlying Equal function
342342
for testName, testData := range replicationSetChangesTestCases {
343343
t.Run(testName, func(t *testing.T) {
344-
assert.Equal(t, testData.expectHasReplicationSetChangedWithoutStateAndAddress, HasReplicationSetChangedWithoutStateAndAddress(replicationSetChangesInitialState, testData.nextState), "HasReplicationSetChangedWithoutStateAndAddress wrong result")
344+
assert.Equal(t, testData.expectHasReplicationSetChangedWithoutStateAndAddress, HasReplicationSetTokensOrZonesChanged(replicationSetChangesInitialState, testData.nextState), "HasReplicationSetChangedWithoutStateAndAddress wrong result")
345345
})
346346
}
347347
}

pkg/ring/util.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,11 @@ func WaitRingStability(ctx context.Context, r *Ring, op Operation, minStability,
9999
return waitStability(ctx, r, op, minStability, maxWaiting, HasReplicationSetChanged)
100100
}
101101

102-
// WaitRingTokensStability waits for the Ring to be unchanged at
103-
// least for minStability time period, excluding transitioning between
104-
// allowed states (e.g. JOINING->ACTIVE if allowed by op).
105-
// This can be used to avoid wasting resources on moving data around
102+
// WaitRingTokensAndZonesStability waits for the Ring tokens and zones to be unchanged at least
103+
// for minStability time period. This can be used to avoid wasting resources on moving data around
106104
// due to multiple changes in the Ring.
107-
func WaitRingTokensStability(ctx context.Context, r *Ring, op Operation, minStability, maxWaiting time.Duration) error {
108-
return waitStability(ctx, r, op, minStability, maxWaiting, HasReplicationSetChangedWithoutState)
105+
func WaitRingTokensAndZonesStability(ctx context.Context, r *Ring, op Operation, minStability, maxWaiting time.Duration) error {
106+
return waitStability(ctx, r, op, minStability, maxWaiting, HasReplicationSetTokensOrZonesChanged)
109107
}
110108

111109
func waitStability(ctx context.Context, r *Ring, op Operation, minStability, maxWaiting time.Duration, isChanged func(ReplicationSet, ReplicationSet) bool) error {

pkg/ring/util_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func TestWaitRingStability_ShouldReturnAsSoonAsMinStabilityIsReachedOnNoChanges(
138138
assert.Less(t, elapsedTime, 2*minStability)
139139
}
140140

141-
func TestWaitRingTokensStability_ShouldReturnAsSoonAsMinStabilityIsReachedOnNoChanges(t *testing.T) {
141+
func TestWaitRingTokensAndZonesStability_ShouldReturnAsSoonAsMinStabilityIsReachedOnNoChanges(t *testing.T) {
142142
t.Parallel()
143143

144144
const (
@@ -149,7 +149,7 @@ func TestWaitRingTokensStability_ShouldReturnAsSoonAsMinStabilityIsReachedOnNoCh
149149
ring := createStartingRing()
150150

151151
startTime := time.Now()
152-
require.NoError(t, WaitRingTokensStability(context.Background(), ring, Reporting, minStability, maxWaiting))
152+
require.NoError(t, WaitRingTokensAndZonesStability(context.Background(), ring, Reporting, minStability, maxWaiting))
153153
elapsedTime := time.Since(startTime)
154154

155155
assert.GreaterOrEqual(t, elapsedTime, minStability)
@@ -195,7 +195,7 @@ func TestWaitRingStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenReached
195195
assert.LessOrEqual(t, elapsedTime, minStability+addInstanceAfter+3*time.Second)
196196
}
197197

198-
func TestWaitRingTokensStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenReached(t *testing.T) {
198+
func TestWaitRingTokensAndZonesStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenReached(t *testing.T) {
199199
t.Parallel()
200200

201201
const (
@@ -210,7 +210,7 @@ func TestWaitRingTokensStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenR
210210
addInstanceAfterSomeTime(ring, addInstanceAfter)
211211

212212
startTime := time.Now()
213-
require.NoError(t, WaitRingTokensStability(context.Background(), ring, Reporting, minStability, maxWaiting))
213+
require.NoError(t, WaitRingTokensAndZonesStability(context.Background(), ring, Reporting, minStability, maxWaiting))
214214
elapsedTime := time.Since(startTime)
215215

216216
assert.GreaterOrEqual(t, elapsedTime, minStability+addInstanceAfter)
@@ -264,7 +264,7 @@ func TestWaitRingStability_ShouldReturnErrorIfInstancesAddedAndMaxWaitingIsReach
264264
assert.GreaterOrEqual(t, elapsedTime, maxWaiting)
265265
}
266266

267-
func TestWaitRingTokensStability_ShouldReturnErrorIfInstancesAddedAndMaxWaitingIsReached(t *testing.T) {
267+
func TestWaitRingTokensAndZonesStability_ShouldReturnErrorIfInstancesAddedAndMaxWaitingIsReached(t *testing.T) {
268268
t.Parallel()
269269

270270
const (
@@ -278,7 +278,7 @@ func TestWaitRingTokensStability_ShouldReturnErrorIfInstancesAddedAndMaxWaitingI
278278
defer close(done)
279279

280280
startTime := time.Now()
281-
require.Equal(t, context.DeadlineExceeded, WaitRingTokensStability(context.Background(), ring, Reporting, minStability, maxWaiting))
281+
require.Equal(t, context.DeadlineExceeded, WaitRingTokensAndZonesStability(context.Background(), ring, Reporting, minStability, maxWaiting))
282282
elapsedTime := time.Since(startTime)
283283

284284
assert.GreaterOrEqual(t, elapsedTime, maxWaiting)
@@ -335,7 +335,7 @@ func TestWaitRingStability_ShouldReturnErrorIfInstanceStateIsChangingAndMaxWaiti
335335
assert.GreaterOrEqual(t, elapsedTime, maxWaiting)
336336
}
337337

338-
func TestWaitRingTokensStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenReachedWhileStateCanChange(t *testing.T) {
338+
func TestWaitRingTokensAndZonesStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenReachedWhileStateCanChange(t *testing.T) {
339339
t.Parallel()
340340

341341
const (
@@ -350,7 +350,7 @@ func TestWaitRingTokensStability_ShouldReturnOnceMinStabilityOfInstancesHasBeenR
350350
defer close(done)
351351

352352
startTime := time.Now()
353-
require.NoError(t, WaitRingTokensStability(context.Background(), ring, Reporting, minStability, maxWaiting))
353+
require.NoError(t, WaitRingTokensAndZonesStability(context.Background(), ring, Reporting, minStability, maxWaiting))
354354
elapsedTime := time.Since(startTime)
355355

356356
assert.GreaterOrEqual(t, elapsedTime, minStability)

pkg/storegateway/bucket_stores.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ type BucketStores struct {
6666
storesMu sync.RWMutex
6767
stores map[string]*store.BucketStore
6868

69-
// List of users assigned to the BucketStores
70-
userIDs []string
71-
7269
// Metrics.
7370
syncTimes prometheus.Histogram
7471
syncLastSuccess prometheus.Gauge
@@ -143,7 +140,7 @@ func NewBucketStores(cfg tsdb.BlocksStorageConfig, shardingStrategy ShardingStra
143140
func (u *BucketStores) InitialSync(ctx context.Context) error {
144141
level.Info(u.logger).Log("msg", "synchronizing TSDB blocks for all users")
145142

146-
if err := u.syncUsersBlocksWithRetries(ctx, true, func(ctx context.Context, s *store.BucketStore) error {
143+
if err := u.syncUsersBlocksWithRetries(ctx, func(ctx context.Context, s *store.BucketStore) error {
147144
return s.InitialSync(ctx)
148145
}); err != nil {
149146
level.Warn(u.logger).Log("msg", "failed to synchronize TSDB blocks", "err", err)
@@ -155,13 +152,13 @@ func (u *BucketStores) InitialSync(ctx context.Context) error {
155152
}
156153

157154
// SyncBlocks synchronizes the stores state with the Bucket store for every user.
158-
func (u *BucketStores) SyncBlocks(ctx context.Context, shouldUpdateUserList bool) error {
159-
return u.syncUsersBlocksWithRetries(ctx, shouldUpdateUserList, func(ctx context.Context, s *store.BucketStore) error {
155+
func (u *BucketStores) SyncBlocks(ctx context.Context) error {
156+
return u.syncUsersBlocksWithRetries(ctx, func(ctx context.Context, s *store.BucketStore) error {
160157
return s.SyncBlocks(ctx)
161158
})
162159
}
163160

164-
func (u *BucketStores) syncUsersBlocksWithRetries(ctx context.Context, shouldUpdateUserList bool, f func(context.Context, *store.BucketStore) error) error {
161+
func (u *BucketStores) syncUsersBlocksWithRetries(ctx context.Context, f func(context.Context, *store.BucketStore) error) error {
165162
retries := backoff.New(ctx, backoff.Config{
166163
MinBackoff: 1 * time.Second,
167164
MaxBackoff: 10 * time.Second,
@@ -170,7 +167,7 @@ func (u *BucketStores) syncUsersBlocksWithRetries(ctx context.Context, shouldUpd
170167

171168
var lastErr error
172169
for retries.Ongoing() {
173-
lastErr = u.syncUsersBlocks(ctx, shouldUpdateUserList, f)
170+
lastErr = u.syncUsersBlocks(ctx, f)
174171
if lastErr == nil {
175172
return nil
176173
}
@@ -185,7 +182,7 @@ func (u *BucketStores) syncUsersBlocksWithRetries(ctx context.Context, shouldUpd
185182
return lastErr
186183
}
187184

188-
func (u *BucketStores) syncUsersBlocks(ctx context.Context, shouldUpdateUserList bool, f func(context.Context, *store.BucketStore) error) (returnErr error) {
185+
func (u *BucketStores) syncUsersBlocks(ctx context.Context, f func(context.Context, *store.BucketStore) error) (returnErr error) {
189186
defer func(start time.Time) {
190187
u.syncTimes.Observe(time.Since(start).Seconds())
191188
if returnErr == nil {
@@ -213,11 +210,7 @@ func (u *BucketStores) syncUsersBlocks(ctx context.Context, shouldUpdateUserList
213210

214211
includeUserIDs := make(map[string]struct{})
215212

216-
if shouldUpdateUserList {
217-
u.userIDs = u.shardingStrategy.FilterUsers(ctx, scannedUserIDs)
218-
}
219-
220-
for _, userID := range u.userIDs {
213+
for _, userID := range u.shardingStrategy.FilterUsers(ctx, scannedUserIDs) {
221214
includeUserIDs[userID] = struct{}{}
222215
}
223216

pkg/storegateway/bucket_stores_test.go

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ func TestBucketStores_SyncBlocks(t *testing.T) {
209209

210210
// Generate another block and sync blocks again.
211211
generateStorageBlock(t, storageDir, userID, metricName, 100, 200, 15)
212-
require.NoError(t, stores.SyncBlocks(ctx, false))
212+
require.NoError(t, stores.SyncBlocks(ctx))
213213

214214
seriesSet, warnings, err = querySeries(stores, userID, metricName, 150, 180)
215215
require.NoError(t, err)
@@ -257,27 +257,16 @@ func TestBucketStores_syncUsersBlocks(t *testing.T) {
257257
shouldUpdateUserList bool
258258
}{
259259
"when sharding is disabled all users should be synced": {
260-
shardingStrategy: NewNoShardingStrategy(),
261-
expectedStores: 3,
262-
shouldUpdateUserList: true,
260+
shardingStrategy: NewNoShardingStrategy(),
261+
expectedStores: 3,
263262
},
264263
"when sharding is enabled only stores for filtered users should be created": {
265264
shardingStrategy: func() ShardingStrategy {
266265
s := &mockShardingStrategy{}
267266
s.On("FilterUsers", mock.Anything, allUsers).Return([]string{"user-1", "user-2"})
268267
return s
269268
}(),
270-
expectedStores: 2,
271-
shouldUpdateUserList: true,
272-
},
273-
"should not sync any blocks if shouldUpdateUserList was never true": {
274-
shardingStrategy: func() ShardingStrategy {
275-
s := &mockShardingStrategy{}
276-
s.On("FilterUsers", mock.Anything, allUsers).Return([]string{"user-1", "user-2"})
277-
return s
278-
}(),
279-
expectedStores: 0,
280-
shouldUpdateUserList: false,
269+
expectedStores: 2,
281270
},
282271
}
283272

@@ -294,7 +283,7 @@ func TestBucketStores_syncUsersBlocks(t *testing.T) {
294283

295284
// Sync user stores and count the number of times the callback is called.
296285
var storesCount atomic.Int32
297-
err = stores.syncUsersBlocks(context.Background(), testData.shouldUpdateUserList, func(ctx context.Context, bs *store.BucketStore) error {
286+
err = stores.syncUsersBlocks(context.Background(), func(ctx context.Context, bs *store.BucketStore) error {
298287
storesCount.Inc()
299288
return nil
300289
})
@@ -505,7 +494,7 @@ func TestBucketStores_deleteLocalFilesForExcludedTenants(t *testing.T) {
505494

506495
// Single user left in shard.
507496
sharding.users = []string{user1}
508-
require.NoError(t, stores.SyncBlocks(ctx, true))
497+
require.NoError(t, stores.SyncBlocks(ctx))
509498
require.Equal(t, []string{user1}, getUsersInDir(t, cfg.BucketStore.SyncDir))
510499

511500
require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(`
@@ -522,7 +511,7 @@ func TestBucketStores_deleteLocalFilesForExcludedTenants(t *testing.T) {
522511

523512
// No users left in this shard.
524513
sharding.users = nil
525-
require.NoError(t, stores.SyncBlocks(ctx, true))
514+
require.NoError(t, stores.SyncBlocks(ctx))
526515
require.Equal(t, []string(nil), getUsersInDir(t, cfg.BucketStore.SyncDir))
527516

528517
require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(`
@@ -536,7 +525,7 @@ func TestBucketStores_deleteLocalFilesForExcludedTenants(t *testing.T) {
536525

537526
// We can always get user back.
538527
sharding.users = []string{user1}
539-
require.NoError(t, stores.SyncBlocks(ctx, true))
528+
require.NoError(t, stores.SyncBlocks(ctx))
540529
require.Equal(t, []string{user1}, getUsersInDir(t, cfg.BucketStore.SyncDir))
541530

542531
require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(`

pkg/storegateway/gateway.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,16 +285,15 @@ func (g *StoreGateway) running(ctx context.Context) error {
285285
for {
286286
select {
287287
case <-syncTicker.C:
288-
g.syncStores(ctx, syncReasonPeriodic, false)
288+
g.syncStores(ctx, ringLastState, syncReasonPeriodic)
289289
case <-ringTickerChan:
290290
// We ignore the error because in case of error it will return an empty
291291
// replication set which we use to compare with the previous state.
292292
currRingState, _ := g.ring.GetAllHealthy(BlocksOwnerSync) // nolint:errcheck
293293

294294
// Ignore address when comparing to avoid block re-sync if tokens are persisted with tokens_file_path
295-
if ring.HasReplicationSetChangedWithoutStateAndAddress(ringLastState, currRingState) {
296-
ringLastState = currRingState
297-
g.syncStores(ctx, syncReasonRingChange, true)
295+
if ring.HasReplicationSetTokensOrZonesChanged(ringLastState, currRingState) {
296+
ringLastState = g.syncStores(ctx, currRingState, syncReasonRingChange)
298297
}
299298
case <-ctx.Done():
300299
return nil
@@ -311,19 +310,23 @@ func (g *StoreGateway) stopping(_ error) error {
311310
return nil
312311
}
313312

314-
func (g *StoreGateway) syncStores(ctx context.Context, reason string, shouldUpdateUserList bool) {
313+
func (g *StoreGateway) syncStores(ctx context.Context, currRingState ring.ReplicationSet, reason string) ring.ReplicationSet {
314+
ringLastState := currRingState
315315
if g.gatewayCfg.ShardingEnabled && g.gatewayCfg.ShardingRing.WaitStabilityMinDuration > 0 {
316316
g.waitRingStability(ctx, reason)
317+
ringLastState, _ = g.ring.GetAllHealthy(BlocksOwnerSync)
317318
}
318319

319320
level.Info(g.logger).Log("msg", "synchronizing TSDB blocks for all users", "reason", reason)
320321
g.bucketSync.WithLabelValues(reason).Inc()
321322

322-
if err := g.stores.SyncBlocks(ctx, shouldUpdateUserList); err != nil {
323+
if err := g.stores.SyncBlocks(ctx); err != nil {
323324
level.Warn(g.logger).Log("msg", "failed to synchronize TSDB blocks", "reason", reason, "err", err)
324325
} else {
325326
level.Info(g.logger).Log("msg", "successfully synchronized TSDB blocks for all users", "reason", reason)
326327
}
328+
329+
return ringLastState
327330
}
328331

329332
func (g *StoreGateway) Series(req *storepb.SeriesRequest, srv storegatewaypb.StoreGateway_SeriesServer) error {
@@ -368,7 +371,7 @@ func (g *StoreGateway) waitRingStability(ctx context.Context, reason string) {
368371
maxWaiting := g.gatewayCfg.ShardingRing.WaitStabilityMaxDuration
369372

370373
level.Info(g.logger).Log("msg", "waiting until store-gateway ring topology is stable", "min_waiting", minWaiting.String(), "max_waiting", maxWaiting.String(), "reason", reason)
371-
if err := ring.WaitRingStability(ctx, g.ring, BlocksOwnerSync, minWaiting, maxWaiting); err != nil {
374+
if err := ring.WaitRingTokensAndZonesStability(ctx, g.ring, BlocksOwnerSync, minWaiting, maxWaiting); err != nil {
372375
level.Warn(g.logger).Log("msg", "store-gateway ring topology is not stable after the max waiting time, proceeding anyway", "reason", reason)
373376
} else {
374377
level.Info(g.logger).Log("msg", "store-gateway ring topology is stable", "reason", reason)

pkg/storegateway/gateway_test.go

Lines changed: 2 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,8 @@ func TestStoreGateway_syncStoresShouldWaitRingStability(t *testing.T) {
796796
}))
797797

798798
syncCtx, cancelCtx := context.WithTimeout(ctx, 3*time.Second)
799-
g.syncStores(syncCtx, "test", true)
799+
ringState, _ := g.ring.GetAllHealthy(BlocksOwnerSync)
800+
g.syncStores(syncCtx, ringState, "test")
800801
cancelCtx()
801802

802803
// No blocks should be synced
@@ -806,63 +807,6 @@ func TestStoreGateway_syncStoresShouldWaitRingStability(t *testing.T) {
806807
assert.Equal(t, float64(0), metrics.GetSumOfGauges("cortex_bucket_store_blocks_loaded"))
807808
}
808809

809-
func TestStoreGateway_PeriodicSyncShouldNotUpdateUserList(t *testing.T) {
810-
registeredAt := time.Now()
811-
bucketClient, storageDir := cortex_testutil.PrepareFilesystemBucket(t)
812-
813-
// This tests uses real TSDB blocks. 24h time range, 2h block range period
814-
now := time.Now()
815-
mockTSDB(t, path.Join(storageDir, "user-1"), 1, 12, now.Add(-24*time.Hour).Unix()*1000, now.Unix()*1000)
816-
817-
ctx := context.Background()
818-
gatewayCfg := mockGatewayConfig()
819-
gatewayCfg.ShardingEnabled = true
820-
gatewayCfg.ShardingRing.RingCheckPeriod = time.Hour // Do not trigger the ring change sync in this test.
821-
822-
storageCfg := mockStorageConfig(t)
823-
storageCfg.BucketStore.SyncInterval = 100 * time.Millisecond
824-
825-
reg := prometheus.NewPedanticRegistry()
826-
ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil)
827-
t.Cleanup(func() { assert.NoError(t, closer.Close()) })
828-
829-
g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg)
830-
require.NoError(t, err)
831-
832-
require.NoError(t, ringStore.CAS(ctx, RingKey, func(in interface{}) (interface{}, bool, error) {
833-
ringDesc := ring.GetOrCreateRingDesc(in)
834-
ringDesc.AddIngester("instance-1", "127.0.0.1", "", ring.Tokens{1, 2, 3}, ring.ACTIVE, registeredAt)
835-
return ringDesc, true, nil
836-
}))
837-
838-
require.NoError(t, services.StartAndAwaitRunning(ctx, g))
839-
defer services.StopAndAwaitTerminated(ctx, g) //nolint:errcheck
840-
841-
// Assert on the initial state.
842-
regs := util.NewUserRegistries()
843-
regs.AddUserRegistry("test", reg)
844-
metrics := regs.BuildMetricFamiliesPerUser()
845-
assert.Equal(t, float64(12), metrics.GetSumOfGauges("cortex_bucket_store_blocks_loaded"))
846-
847-
// Add more blocks, and extra user
848-
mockTSDB(t, path.Join(storageDir, "user-1"), 1, 3, now.Unix()*1000, now.Add(6*time.Hour).Unix()*1000)
849-
mockTSDB(t, path.Join(storageDir, "user-2"), 1, 3, now.Unix()*1000, now.Add(6*time.Hour).Unix()*1000)
850-
851-
// Verify only user-1 blocks are synced
852-
time.Sleep(time.Second)
853-
metrics = regs.BuildMetricFamiliesPerUser()
854-
assert.Equal(t, float64(12+3), metrics.GetSumOfGauges("cortex_bucket_store_blocks_loaded"))
855-
856-
// Force update user list
857-
g.syncStores(ctx, "test", true)
858-
g.waitRingStability(ctx, "test")
859-
860-
// Verify user-2 blocks are also synced
861-
time.Sleep(time.Second)
862-
metrics = regs.BuildMetricFamiliesPerUser()
863-
assert.Equal(t, float64(12+3+3), metrics.GetSumOfGauges("cortex_bucket_store_blocks_loaded"))
864-
}
865-
866810
func TestStoreGateway_RingLifecyclerShouldAutoForgetUnhealthyInstances(t *testing.T) {
867811
const unhealthyInstanceID = "unhealthy-id"
868812
const heartbeatTimeout = time.Minute

0 commit comments

Comments
 (0)