|
@@ -33,6 +33,7 @@ type grpcClientProxy struct {
|
|
|
grpc grpcAPI
|
|
grpc grpcAPI
|
|
|
wdonec <-chan struct{}
|
|
wdonec <-chan struct{}
|
|
|
kvdonec <-chan struct{}
|
|
kvdonec <-chan struct{}
|
|
|
|
|
+ lpdonec <-chan struct{}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func toGRPC(c *clientv3.Client) grpcAPI {
|
|
func toGRPC(c *clientv3.Client) grpcAPI {
|
|
@@ -42,18 +43,18 @@ func toGRPC(c *clientv3.Client) grpcAPI {
|
|
|
if v, ok := proxies[c]; ok {
|
|
if v, ok := proxies[c]; ok {
|
|
|
return v.grpc
|
|
return v.grpc
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- wp, wpch := grpcproxy.NewWatchProxy(c)
|
|
|
|
|
kvp, kvpch := grpcproxy.NewKvProxy(c)
|
|
kvp, kvpch := grpcproxy.NewKvProxy(c)
|
|
|
|
|
+ wp, wpch := grpcproxy.NewWatchProxy(c)
|
|
|
|
|
+ lp, lpch := grpcproxy.NewLeaseProxy(c)
|
|
|
grpc := grpcAPI{
|
|
grpc := grpcAPI{
|
|
|
pb.NewClusterClient(c.ActiveConnection()),
|
|
pb.NewClusterClient(c.ActiveConnection()),
|
|
|
grpcproxy.KvServerToKvClient(kvp),
|
|
grpcproxy.KvServerToKvClient(kvp),
|
|
|
- pb.NewLeaseClient(c.ActiveConnection()),
|
|
|
|
|
|
|
+ grpcproxy.LeaseServerToLeaseClient(lp),
|
|
|
grpcproxy.WatchServerToWatchClient(wp),
|
|
grpcproxy.WatchServerToWatchClient(wp),
|
|
|
pb.NewMaintenanceClient(c.ActiveConnection()),
|
|
pb.NewMaintenanceClient(c.ActiveConnection()),
|
|
|
pb.NewAuthClient(c.ActiveConnection()),
|
|
pb.NewAuthClient(c.ActiveConnection()),
|
|
|
}
|
|
}
|
|
|
- proxies[c] = grpcClientProxy{grpc: grpc, wdonec: wpch, kvdonec: kvpch}
|
|
|
|
|
|
|
+ proxies[c] = grpcClientProxy{grpc: grpc, wdonec: wpch, kvdonec: kvpch, lpdonec: lpch}
|
|
|
return grpc
|
|
return grpc
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -61,13 +62,15 @@ type proxyCloser struct {
|
|
|
clientv3.Watcher
|
|
clientv3.Watcher
|
|
|
wdonec <-chan struct{}
|
|
wdonec <-chan struct{}
|
|
|
kvdonec <-chan struct{}
|
|
kvdonec <-chan struct{}
|
|
|
|
|
+ lpdonec <-chan struct{}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (pc *proxyCloser) Close() error {
|
|
func (pc *proxyCloser) Close() error {
|
|
|
- // client ctx is canceled before calling close, so kv will close out
|
|
|
|
|
|
|
+ // client ctx is canceled before calling close, so kv and lp will close out
|
|
|
<-pc.kvdonec
|
|
<-pc.kvdonec
|
|
|
err := pc.Watcher.Close()
|
|
err := pc.Watcher.Close()
|
|
|
<-pc.wdonec
|
|
<-pc.wdonec
|
|
|
|
|
+ <-pc.lpdonec
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -79,10 +82,12 @@ func newClientV3(cfg clientv3.Config) (*clientv3.Client, error) {
|
|
|
rpc := toGRPC(c)
|
|
rpc := toGRPC(c)
|
|
|
c.KV = clientv3.NewKVFromKVClient(rpc.KV)
|
|
c.KV = clientv3.NewKVFromKVClient(rpc.KV)
|
|
|
pmu.Lock()
|
|
pmu.Lock()
|
|
|
|
|
+ c.Lease = clientv3.NewLeaseFromLeaseClient(rpc.Lease, cfg.DialTimeout)
|
|
|
c.Watcher = &proxyCloser{
|
|
c.Watcher = &proxyCloser{
|
|
|
Watcher: clientv3.NewWatchFromWatchClient(rpc.Watch),
|
|
Watcher: clientv3.NewWatchFromWatchClient(rpc.Watch),
|
|
|
wdonec: proxies[c].wdonec,
|
|
wdonec: proxies[c].wdonec,
|
|
|
kvdonec: proxies[c].kvdonec,
|
|
kvdonec: proxies[c].kvdonec,
|
|
|
|
|
+ lpdonec: proxies[c].lpdonec,
|
|
|
}
|
|
}
|
|
|
pmu.Unlock()
|
|
pmu.Unlock()
|
|
|
return c, nil
|
|
return c, nil
|