*: LeaseTimeToLive returns error if leader changed
The old leader demotes lessor and all the leases' expire time will be updated. Instead of returning incorrect remaining TTL, we should return errors to force client retry. Signed-off-by: Wei Fu <fuweid89@gmail.com>
This commit is contained in:
@ -357,6 +357,9 @@ func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR
|
||||
if err := s.waitAppliedIndex(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// gofail: var beforeLookupWhenLeaseTimeToLive struct{}
|
||||
|
||||
// primary; timetolive directly from leader
|
||||
le := s.lessor.Lookup(lease.LeaseID(r.ID))
|
||||
if le == nil {
|
||||
@ -372,6 +375,15 @@ func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR
|
||||
}
|
||||
resp.Keys = kbs
|
||||
}
|
||||
|
||||
// The leasor could be demoted if leader changed during lookup.
|
||||
// We should return error to force retry instead of returning
|
||||
// incorrect remaining TTL.
|
||||
if le.Demoted() {
|
||||
// NOTE: lease.ErrNotPrimary is not retryable error for
|
||||
// client. Instead, uses ErrLeaderChanged.
|
||||
return nil, errors.ErrLeaderChanged
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user