(t *testing.T)
| 1432 | func (f *noopFlushTransferer) TransferOut(_ context.Context) error { return nil } |
| 1433 | |
| 1434 | func TestRestartIngester_NoUnregister_LongHeartbeat(t *testing.T) { |
| 1435 | t.Parallel() |
| 1436 | |
| 1437 | ringStore, closer := consul.NewInMemoryClient(GetCodec(), log.NewNopLogger(), nil) |
| 1438 | t.Cleanup(func() { assert.NoError(t, closer.Close()) }) |
| 1439 | |
| 1440 | origTokens := initTokenGenerator(t).GenerateTokens(100, nil) |
| 1441 | |
| 1442 | const id = "test" |
| 1443 | registeredAt := time.Now().Add(-1 * time.Hour) |
| 1444 | |
| 1445 | err := ringStore.CAS(context.Background(), ringKey, func(in interface{}) (out interface{}, retry bool, err error) { |
| 1446 | // Create ring with LEAVING entry with some tokens |
| 1447 | r := GetOrCreateRingDesc(in) |
| 1448 | r.AddIngester(id, "3.3.3.3:333", "old", origTokens, LEAVING, registeredAt, false, time.Time{}, nil) |
| 1449 | return r, true, err |
| 1450 | }) |
| 1451 | require.NoError(t, err) |
| 1452 | |
| 1453 | var lifecyclerConfig LifecyclerConfig |
| 1454 | flagext.DefaultValues(&lifecyclerConfig) |
| 1455 | lifecyclerConfig.Addr = "1.1.1.1" |
| 1456 | lifecyclerConfig.Port = 111 |
| 1457 | lifecyclerConfig.Zone = "new" |
| 1458 | lifecyclerConfig.RingConfig.KVStore.Mock = ringStore |
| 1459 | lifecyclerConfig.NumTokens = len(origTokens) |
| 1460 | lifecyclerConfig.ID = id |
| 1461 | lifecyclerConfig.HeartbeatPeriod = 5 * time.Minute // Long hearbeat period. |
| 1462 | lifecyclerConfig.MinReadyDuration = 0 // Disable waiting extra time for Ready |
| 1463 | lifecyclerConfig.JoinAfter = 1 * time.Minute // Use long value to make sure that we don't use "join" code path. |
| 1464 | |
| 1465 | l, err := NewLifecycler(lifecyclerConfig, &noopFlushTransferer{}, "test", ringKey, false, log.NewNopLogger(), nil) |
| 1466 | require.NoError(t, err) |
| 1467 | |
| 1468 | require.NoError(t, services.StartAndAwaitRunning(context.Background(), l)) |
| 1469 | defer services.StopAndAwaitTerminated(context.Background(), l) //nolint:errcheck |
| 1470 | |
| 1471 | test.Poll(t, 1*time.Second, nil, func() interface{} { |
| 1472 | return l.CheckReady(context.Background()) |
| 1473 | }) |
| 1474 | |
| 1475 | // Lifecycler should be in ACTIVE state, using tokens from the ring. |
| 1476 | require.Equal(t, ACTIVE, l.GetState()) |
| 1477 | require.Equal(t, origTokens, l.getTokens()) |
| 1478 | require.Equal(t, registeredAt.Truncate(time.Second), l.getRegisteredAt()) |
| 1479 | |
| 1480 | // check that ring entry has updated address and state |
| 1481 | desc, err := ringStore.Get(context.Background(), ringKey) |
| 1482 | require.NoError(t, err) |
| 1483 | |
| 1484 | r := GetOrCreateRingDesc(desc) |
| 1485 | require.Equal(t, lifecyclerConfig.ID, r.Ingesters[id].Id) |
| 1486 | require.Equal(t, ACTIVE, r.Ingesters[id].State) |
| 1487 | require.Equal(t, "1.1.1.1:111", r.Ingesters[id].Addr) |
| 1488 | require.Equal(t, "new", r.Ingesters[id].Zone) |
| 1489 | require.Equal(t, registeredAt.Unix(), r.Ingesters[id].RegisteredTimestamp) |
| 1490 | } |
| 1491 |
nothing calls this directly
no test coverage detected