diff --git a/integration/cluster_test.go b/integration/cluster_test.go index 8a95c00c0..c847ae1ee 100644 --- a/integration/cluster_test.go +++ b/integration/cluster_test.go @@ -209,6 +209,46 @@ func TestForceNewCluster(t *testing.T) { clusterMustProgress(t, c.Members[:1]) } +// Ensure we can remove a member then add a new one back immediately. +func TestIssue2681(t *testing.T) { + defer afterTest(t) + c := NewCluster(t, 5) + c.Launch(t) + defer c.Terminate(t) + + c.RemoveMember(t, uint64(c.Members[4].s.ID())) + c.waitLeader(t, c.Members) + + c.AddMember(t) + c.waitLeader(t, c.Members) + clusterMustProgress(t, c.Members) +} + +// Ensure we can remove a member after a snapshot then add a new one back. +func TestIssue2746(t *testing.T) { + defer afterTest(t) + c := NewCluster(t, 5) + + for _, m := range c.Members { + m.SnapCount = 10 + } + + c.Launch(t) + defer c.Terminate(t) + + // force a snapshot + for i := 0; i < 20; i++ { + clusterMustProgress(t, c.Members) + } + + c.RemoveMember(t, uint64(c.Members[4].s.ID())) + c.waitLeader(t, c.Members) + + c.AddMember(t) + c.waitLeader(t, c.Members) + clusterMustProgress(t, c.Members) +} + // clusterMustProgress ensures that cluster can make progress. It creates // a random key first, and check the new key could be got from all client urls // of the cluster.