|
@@ -25,11 +25,12 @@ import (
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
type LeaseServer struct {
|
|
type LeaseServer struct {
|
|
|
- le etcdserver.Lessor
|
|
|
|
|
|
|
+ hdr header
|
|
|
|
|
+ le etcdserver.Lessor
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func NewLeaseServer(le etcdserver.Lessor) pb.LeaseServer {
|
|
|
|
|
- return &LeaseServer{le: le}
|
|
|
|
|
|
|
+func NewLeaseServer(s *etcdserver.EtcdServer) pb.LeaseServer {
|
|
|
|
|
+ return &LeaseServer{le: s, hdr: newHeader(s)}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (ls *LeaseServer) LeaseGrant(ctx context.Context, cr *pb.LeaseGrantRequest) (*pb.LeaseGrantResponse, error) {
|
|
func (ls *LeaseServer) LeaseGrant(ctx context.Context, cr *pb.LeaseGrantRequest) (*pb.LeaseGrantResponse, error) {
|
|
@@ -37,15 +38,17 @@ func (ls *LeaseServer) LeaseGrant(ctx context.Context, cr *pb.LeaseGrantRequest)
|
|
|
if err == lease.ErrLeaseExists {
|
|
if err == lease.ErrLeaseExists {
|
|
|
return nil, rpctypes.ErrLeaseExist
|
|
return nil, rpctypes.ErrLeaseExist
|
|
|
}
|
|
}
|
|
|
|
|
+ ls.hdr.fill(resp.Header)
|
|
|
return resp, err
|
|
return resp, err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (ls *LeaseServer) LeaseRevoke(ctx context.Context, rr *pb.LeaseRevokeRequest) (*pb.LeaseRevokeResponse, error) {
|
|
func (ls *LeaseServer) LeaseRevoke(ctx context.Context, rr *pb.LeaseRevokeRequest) (*pb.LeaseRevokeResponse, error) {
|
|
|
- r, err := ls.le.LeaseRevoke(ctx, rr)
|
|
|
|
|
|
|
+ resp, err := ls.le.LeaseRevoke(ctx, rr)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, rpctypes.ErrLeaseNotFound
|
|
return nil, rpctypes.ErrLeaseNotFound
|
|
|
}
|
|
}
|
|
|
- return r, nil
|
|
|
|
|
|
|
+ ls.hdr.fill(resp.Header)
|
|
|
|
|
+ return resp, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error {
|
|
func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error {
|
|
@@ -58,6 +61,15 @@ func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Create header before we sent out the renew request.
|
|
|
|
|
+ // This can make sure that the revision is strictly smaller or equal to
|
|
|
|
|
+ // when the keepalive happened at the local server (when the local server is the leader)
|
|
|
|
|
+ // or remote leader.
|
|
|
|
|
+ // Without this, a lease might be revoked at rev 3 but client can see the keepalive succeeded
|
|
|
|
|
+ // at rev 4.
|
|
|
|
|
+ resp := &pb.LeaseKeepAliveResponse{ID: req.ID, Header: &pb.ResponseHeader{}}
|
|
|
|
|
+ ls.hdr.fill(resp.Header)
|
|
|
|
|
+
|
|
|
ttl, err := ls.le.LeaseRenew(lease.LeaseID(req.ID))
|
|
ttl, err := ls.le.LeaseRenew(lease.LeaseID(req.ID))
|
|
|
if err == lease.ErrLeaseNotFound {
|
|
if err == lease.ErrLeaseNotFound {
|
|
|
err = nil
|
|
err = nil
|
|
@@ -68,7 +80,7 @@ func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- resp := &pb.LeaseKeepAliveResponse{ID: req.ID, TTL: ttl}
|
|
|
|
|
|
|
+ resp.TTL = ttl
|
|
|
err = stream.Send(resp)
|
|
err = stream.Send(resp)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|