(t *testing.T)
| 1645 | } |
| 1646 | |
| 1647 | func 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 | |
| 1703 | func TestMessageBuffer(t *testing.T) { |
| 1704 | buf := []Message(nil) |
nothing calls this directly
no test coverage detected