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

Function TestRejoinWithDifferentSeedNodes

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

Source from the content-addressed store, hash-verified

1645}
1646
1647func TestRejoinWithDifferentSeedNodes(t *testing.T) {
1648 ports, err := getFreePorts(3)
1649 require.NoError(t, err)
1650
1651 var cfg1 KVConfig
1652 flagext.DefaultValues(&cfg1)
1653 cfg1.TCPTransport.BindAddrs = getLocalhostAddrs()
1654 cfg1.TCPTransport.BindPort = ports[0]
1655
1656 cfg1.RandomizeNodeName = true
1657 cfg1.Codecs = []codec.Codec{dataCodec{}}
1658 cfg1.AbortIfJoinFails = false
1659
1660 // cfg2: joins cfg1 initially, rejoins using cfg3's address via RejoinSeedNodes.
1661 cfg2 := cfg1
1662 cfg2.TCPTransport.BindPort = ports[1]
1663 cfg2.JoinMembers = []string{net.JoinHostPort("localhost", strconv.Itoa(ports[0]))}
1664 cfg2.RejoinSeedNodes = []string{net.JoinHostPort("localhost", strconv.Itoa(ports[2]))}
1665 cfg2.RejoinInterval = 1 * time.Second
1666
1667 // cfg3: standalone node (no join members), will be discovered by cfg2 via rejoin.
1668 cfg3 := cfg1
1669 cfg3.TCPTransport.BindPort = ports[2]
1670
1671 mkv1 := NewKV(cfg1, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1672 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv1))
1673 t.Cleanup(func() {
1674 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv1))
1675 })
1676
1677 mkv2 := NewKV(cfg2, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1678 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv2))
1679 t.Cleanup(func() {
1680 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv2))
1681 })
1682
1683 // Initially mkv2 should be connected to mkv1.
1684 expectMembers := func(kv *KV, expected int) func() bool {
1685 return func() bool { return kv.memberlist.NumMembers() == expected }
1686 }
1687 require.Eventually(t, expectMembers(mkv2, 2), 10*time.Second, 100*time.Millisecond, "expected 2 members in the cluster")
1688
1689 // Now start mkv3. mkv2's RejoinSeedNodes points to mkv3, so mkv2 should discover mkv3 via periodic rejoin.
1690 mkv3 := NewKV(cfg3, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
1691 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv3))
1692 t.Cleanup(func() {
1693 require.NoError(t, services.StopAndAwaitTerminated(context.Background(), mkv3))
1694 })
1695
1696 // mkv2 should connect to mkv3 via rejoin (using RejoinSeedNodes).
1697 // All three should eventually see each other.
1698 require.Eventually(t, expectMembers(mkv1, 3), 10*time.Second, 100*time.Millisecond, "expected mkv1 to see 3 members")
1699 require.Eventually(t, expectMembers(mkv2, 3), 10*time.Second, 100*time.Millisecond, "expected mkv2 to see 3 members")
1700 require.Eventually(t, expectMembers(mkv3, 3), 10*time.Second, 100*time.Millisecond, "expected mkv3 to see 3 members")
1701}
1702
1703func TestMessageBuffer(t *testing.T) {
1704 buf := []Message(nil)

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