Przeglądaj źródła

integration: add 'TestTransferLeader/Stop'

Gyu-Ho Lee 9 lat temu
rodzic
commit
a205242ca5
2 zmienionych plików z 44 dodań i 1 usunięć
  1. 10 1
      integration/cluster.go
  2. 34 0
      integration/cluster_test.go

+ 10 - 1
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()

+ 34 - 0
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)
+	}
+}