|
@@ -18,6 +18,7 @@ import (
|
|
|
"io"
|
|
"io"
|
|
|
|
|
|
|
|
"github.com/coreos/etcd/etcdserver"
|
|
"github.com/coreos/etcd/etcdserver"
|
|
|
|
|
+ "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
|
|
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
|
|
"github.com/coreos/etcd/lease"
|
|
"github.com/coreos/etcd/lease"
|
|
|
"golang.org/x/net/context"
|
|
"golang.org/x/net/context"
|
|
@@ -67,7 +68,24 @@ func (ls *LeaseServer) LeaseTimeToLive(ctx context.Context, rr *pb.LeaseTimeToLi
|
|
|
return resp, nil
|
|
return resp, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error {
|
|
|
|
|
|
|
+func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) (err error) {
|
|
|
|
|
+ errc := make(chan error, 1)
|
|
|
|
|
+ go func() {
|
|
|
|
|
+ errc <- ls.leaseKeepAlive(stream)
|
|
|
|
|
+ }()
|
|
|
|
|
+ select {
|
|
|
|
|
+ case err = <-errc:
|
|
|
|
|
+ case <-stream.Context().Done():
|
|
|
|
|
+ // the only server-side cancellation is noleader for now.
|
|
|
|
|
+ err = stream.Context().Err()
|
|
|
|
|
+ if err == context.Canceled {
|
|
|
|
|
+ err = rpctypes.ErrGRPCNoLeader
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return err
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error {
|
|
|
for {
|
|
for {
|
|
|
req, err := stream.Recv()
|
|
req, err := stream.Recv()
|
|
|
if err == io.EOF {
|
|
if err == io.EOF {
|