(t *testing.T)
| 1591 | } |
| 1592 | |
| 1593 | func 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 | |
| 1647 | func TestRejoinWithDifferentSeedNodes(t *testing.T) { |
| 1648 | ports, err := getFreePorts(3) |
nothing calls this directly
no test coverage detected