From a205242ca5a4afa7a4f8172f1af848ae8b44d9f9 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Sat, 13 Aug 2016 12:41:10 -0700 Subject: [PATCH] integration: add 'TestTransferLeader/Stop' --- integration/cluster.go | 11 ++++++++++- integration/cluster_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/integration/cluster.go b/integration/cluster.go index 3f24bbd07..755ba1905 100644 --- a/integration/cluster.go +++ b/integration/cluster.go @@ -687,7 +687,7 @@ func (m *member) Close() { m.grpcServer.Stop() m.grpcServer = nil } - m.s.Stop() + m.s.HardStop() for _, hs := range m.hss { hs.CloseClientConnections() hs.Close() @@ -702,6 +702,15 @@ func (m *member) Stop(t *testing.T) { plog.Printf("stopped %s (%s)", m.Name, m.grpcAddr) } +// StopWithAutoLeaderTransfer stops the member with auto leader transfer. +func (m *member) StopWithAutoLeaderTransfer(t *testing.T) { + plog.Printf("stopping %s (%s)", m.Name, m.grpcAddr) + m.s.TransferLeadership() + m.Close() + m.hss = nil + plog.Printf("stopped %s (%s)", m.Name, m.grpcAddr) +} + // StopNotify unblocks when a member stop completes func (m *member) StopNotify() <-chan struct{} { return m.s.StopNotify() diff --git a/integration/cluster_test.go b/integration/cluster_test.go index a2ca91145..f91bc428c 100644 --- a/integration/cluster_test.go +++ b/integration/cluster_test.go @@ -26,6 +26,7 @@ import ( "github.com/coreos/etcd/client" "github.com/coreos/etcd/etcdserver" + "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/pkg/testutil" "golang.org/x/net/context" @@ -462,3 +463,36 @@ func clusterMustProgress(t *testing.T, membs []*member) { mcancel() } } + +func TestTransferLeader(t *testing.T) { + defer testutil.AfterTest(t) + + clus := NewClusterV3(t, &ClusterConfig{Size: 3}) + defer clus.Terminate(t) + + leaderIdx := clus.WaitLeader(t) + + err := clus.Members[leaderIdx].s.TransferLeadership() + if err != nil { + t.Fatal(err) + } +} + +func TestTransferLeaderStopTrigger(t *testing.T) { + defer testutil.AfterTest(t) + + clus := NewClusterV3(t, &ClusterConfig{Size: 3}) + defer clus.Terminate(t) + + oldLeadIdx := clus.WaitLeader(t) + clus.Members[oldLeadIdx].StopWithAutoLeaderTransfer(t) + + // issue put to one of the other member + kvc := toGRPC(clus.Client((oldLeadIdx + 1) % 3)).KV + sctx, scancel := context.WithTimeout(context.TODO(), clus.Members[oldLeadIdx].electionTimeout()) + _, err := kvc.Range(sctx, &etcdserverpb.RangeRequest{Key: []byte("foo")}) + scancel() + if err != nil { + t.Fatal(err) + } +}