MCPcopy
hub / github.com/grafana/dskit / TestRejoin

Function TestRejoin

kv/memberlist/memberlist_client_test.go:1593–1645  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

1591}
1592
1593func TestRejoin(t *testing.T) {
1594 ports, err := getFreePorts(2)
1595 require.NoError(t, err)
1596
1597 var cfg1 KVConfig
1598 flagext.DefaultValues(&cfg1)
1599 cfg1.TCPTransport.BindAddrs = getLocalhostAddrs()
1600 cfg1.TCPTransport.BindPort = ports[0]
1601
1602 cfg1.RandomizeNodeName = true
1603 cfg1.Codecs = []codec.Codec{dataCodec{}}
1604 cfg1.AbortIfJoinFails = false
1605 cfg1.probeInterval = 500 * time.Millisecond
1606
1607 cfg2 := cfg1
1608 cfg2.TCPTransport.BindPort = ports[1]
1609 cfg2.JoinMembers = []string{net.JoinHostPort("localhost", strconv.Itoa(ports[0]))}
1610 cfg2.RejoinInterval = 1 * time.Second
1611
1612 mkv1 := NewKV(cfg1, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1613 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv1))
1614 t.Cleanup(func() {
1615 // Ignore error since we explicitly stop this instance mid-test
1616 _ = services.StopAndAwaitTerminated(context.Background(), mkv1)
1617 })
1618
1619 mkv2 := NewKV(cfg2, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1620 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv2))
1621 t.Cleanup(func() {
1622 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv2))
1623 })
1624
1625 expectMembers := func(expected int) func() bool {
1626 return func() bool { return mkv2.memberlist.NumMembers() == expected }
1627 }
1628
1629 require.Eventually(t, expectMembers(2), 10*time.Second, 100*time.Millisecond, "expected 2 members in the cluster")
1630
1631 // Shutdown first KV
1632 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv1))
1633
1634 // Second KV should see single member now.
1635 require.Eventually(t, expectMembers(1), 10*time.Second, 100*time.Millisecond, "expected 1 member in the cluster")
1636
1637 // Let's start first KV again. It is not configured to join the cluster, but KV2 is rejoining.
1638 mkv1Restarted := NewKV(cfg1, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1639 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv1Restarted))
1640 t.Cleanup(func() {
1641 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv1Restarted))
1642 })
1643
1644 require.Eventually(t, expectMembers(2), 10*time.Second, 100*time.Millisecond, "expected 2 members in the cluster")
1645}
1646
1647func TestRejoinWithDifferentSeedNodes(t *testing.T) {
1648 ports, err := getFreePorts(3)

Callers

nothing calls this directly

Calls 6

DefaultValuesFunction · 0.92
StartAndAwaitRunningFunction · 0.92
StopAndAwaitTerminatedFunction · 0.92
getFreePortsFunction · 0.85
getLocalhostAddrsFunction · 0.85
NewKVFunction · 0.85

Tested by

no test coverage detected