From d9cf752060f03cd07a3fe688255ed15f078eeb46 Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Sat, 12 Sep 2015 18:11:23 -0700 Subject: [PATCH] etcdserver: add test for isReadyToAddNewMember Also fixed check for special case of one-member cluster --- etcdserver/cluster.go | 2 +- etcdserver/cluster_test.go | 65 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/etcdserver/cluster.go b/etcdserver/cluster.go index a14673d1e..8cf90b535 100644 --- a/etcdserver/cluster.go +++ b/etcdserver/cluster.go @@ -379,7 +379,7 @@ func (c *cluster) isReadyToAddNewMember() bool { nmembers++ } - if nstarted == 1 { + if nstarted == 1 && nmembers == 2 { // a case of adding a new node to 1-member cluster for restoring cluster data // https://github.com/coreos/etcd/blob/master/Documentation/admin_guide.md#restoring-the-cluster diff --git a/etcdserver/cluster_test.go b/etcdserver/cluster_test.go index fa571e10d..cecb736c0 100644 --- a/etcdserver/cluster_test.go +++ b/etcdserver/cluster_test.go @@ -566,3 +566,68 @@ func newTestCluster(membs []*Member) *cluster { } func stringp(s string) *string { return &s } + +func TestIsReadyToAddNewMember(t *testing.T) { + tests := []struct { + members []*Member + want bool + }{ + { + // 0/3 members ready, should fail + []*Member{ + newTestMember(1, nil, "", nil), + newTestMember(2, nil, "", nil), + newTestMember(3, nil, "", nil), + }, + false, + }, + { + // 1/2 members ready, should fail + []*Member{ + newTestMember(1, nil, "1", nil), + newTestMember(2, nil, "", nil), + }, + false, + }, + { + // 1/3 members ready, should fail + []*Member{ + newTestMember(1, nil, "1", nil), + newTestMember(2, nil, "", nil), + newTestMember(3, nil, "", nil), + }, + false, + }, + { + // 1/1 members ready, should succeed (special case of 1-member cluster for recovery) + []*Member{ + newTestMember(1, nil, "1", nil), + }, + true, + }, + { + // 2/3 members ready, should fail + []*Member{ + newTestMember(1, nil, "1", nil), + newTestMember(2, nil, "2", nil), + newTestMember(3, nil, "", nil), + }, + false, + }, + { + // 3/3 members ready, should be fine to add one member and retain quorum + []*Member{ + newTestMember(1, nil, "1", nil), + newTestMember(2, nil, "2", nil), + newTestMember(3, nil, "3", nil), + }, + true, + }, + } + for i, tt := range tests { + c := newTestCluster(tt.members) + if got := c.isReadyToAddNewMember(); got != tt.want { + t.Errorf("%d: isReadyToAddNewMember returned %t, want %t", i, got, tt.want) + } + } +}