mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
integration: add TestV3LeaseFailover test
This commit is contained in:
parent
5d256b7b86
commit
e6c39108a7
@ -306,6 +306,65 @@ func TestV3LeaseSwitch(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestV3LeaseFailover ensures the old leader drops lease keepalive requests within
|
||||||
|
// election timeout after it loses its quorum. And the new leader extends the TTL of
|
||||||
|
// the lease to at least TTL + election timeout.
|
||||||
|
func TestV3LeaseFailover(t *testing.T) {
|
||||||
|
clus := NewClusterV3(t, &ClusterConfig{Size: 3})
|
||||||
|
defer clus.Terminate(t)
|
||||||
|
|
||||||
|
toIsolate := clus.waitLeader(t, clus.Members)
|
||||||
|
|
||||||
|
lc := toGRPC(clus.Client(toIsolate)).Lease
|
||||||
|
|
||||||
|
// create lease
|
||||||
|
lresp, err := lc.LeaseCreate(context.TODO(), &pb.LeaseCreateRequest{TTL: 5})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if lresp.Error != "" {
|
||||||
|
t.Fatal(lresp.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// isolate the current leader with its followers.
|
||||||
|
clus.Members[toIsolate].Pause()
|
||||||
|
|
||||||
|
lreq := &pb.LeaseKeepAliveRequest{ID: lresp.ID}
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
lac, err := lc.LeaseKeepAlive(ctx)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer lac.CloseSend()
|
||||||
|
|
||||||
|
// send keep alive to old leader until the old leader starts
|
||||||
|
// to drop lease request.
|
||||||
|
var expectedExp time.Time
|
||||||
|
for {
|
||||||
|
if err = lac.Send(lreq); err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
lkresp, rxerr := lac.Recv()
|
||||||
|
if rxerr != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
expectedExp = time.Now().Add(time.Duration(lkresp.TTL) * time.Second)
|
||||||
|
time.Sleep(time.Duration(lkresp.TTL/2) * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
clus.Members[toIsolate].Resume()
|
||||||
|
clus.waitLeader(t, clus.Members)
|
||||||
|
|
||||||
|
// lease should not expire at the last received expire deadline.
|
||||||
|
time.Sleep(expectedExp.Sub(time.Now()) - 500*time.Millisecond)
|
||||||
|
|
||||||
|
if !leaseExist(t, clus, lresp.ID) {
|
||||||
|
t.Error("unexpected lease not exists")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// acquireLeaseAndKey creates a new lease and creates an attached key.
|
// acquireLeaseAndKey creates a new lease and creates an attached key.
|
||||||
func acquireLeaseAndKey(clus *ClusterV3, key string) (int64, error) {
|
func acquireLeaseAndKey(clus *ClusterV3, key string) (int64, error) {
|
||||||
// create lease
|
// create lease
|
||||||
|
Loading…
x
Reference in New Issue
Block a user