integration: add 'TestTransferLeader/Stop'
This commit is contained in:
@ -687,7 +687,7 @@ func (m *member) Close() {
|
|||||||
m.grpcServer.Stop()
|
m.grpcServer.Stop()
|
||||||
m.grpcServer = nil
|
m.grpcServer = nil
|
||||||
}
|
}
|
||||||
m.s.Stop()
|
m.s.HardStop()
|
||||||
for _, hs := range m.hss {
|
for _, hs := range m.hss {
|
||||||
hs.CloseClientConnections()
|
hs.CloseClientConnections()
|
||||||
hs.Close()
|
hs.Close()
|
||||||
@ -702,6 +702,15 @@ func (m *member) Stop(t *testing.T) {
|
|||||||
plog.Printf("stopped %s (%s)", m.Name, m.grpcAddr)
|
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
|
// StopNotify unblocks when a member stop completes
|
||||||
func (m *member) StopNotify() <-chan struct{} {
|
func (m *member) StopNotify() <-chan struct{} {
|
||||||
return m.s.StopNotify()
|
return m.s.StopNotify()
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
|
|
||||||
"github.com/coreos/etcd/client"
|
"github.com/coreos/etcd/client"
|
||||||
"github.com/coreos/etcd/etcdserver"
|
"github.com/coreos/etcd/etcdserver"
|
||||||
|
"github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
"github.com/coreos/etcd/pkg/testutil"
|
"github.com/coreos/etcd/pkg/testutil"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
@ -462,3 +463,36 @@ func clusterMustProgress(t *testing.T, membs []*member) {
|
|||||||
mcancel()
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user