From 8f40517adb0cbd1c96fd474a01c37d8e9d5716a8 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Mon, 24 Apr 2017 22:33:56 -0700 Subject: [PATCH 1/2] integration: close proxy's lease client --- integration/cluster_proxy.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integration/cluster_proxy.go b/integration/cluster_proxy.go index 0152a16c6..8593b5064 100644 --- a/integration/cluster_proxy.go +++ b/integration/cluster_proxy.go @@ -75,6 +75,7 @@ type proxyCloser struct { clientv3.Watcher wdonec <-chan struct{} kvdonec <-chan struct{} + lclose func() lpdonec <-chan struct{} } @@ -83,6 +84,7 @@ func (pc *proxyCloser) Close() error { <-pc.kvdonec err := pc.Watcher.Close() <-pc.wdonec + pc.lclose() <-pc.lpdonec return err } @@ -95,11 +97,13 @@ func newClientV3(cfg clientv3.Config) (*clientv3.Client, error) { rpc := toGRPC(c) c.KV = clientv3.NewKVFromKVClient(rpc.KV) pmu.Lock() + lc := c.Lease c.Lease = clientv3.NewLeaseFromLeaseClient(rpc.Lease, cfg.DialTimeout) c.Watcher = &proxyCloser{ Watcher: clientv3.NewWatchFromWatchClient(rpc.Watch), wdonec: proxies[c].wdonec, kvdonec: proxies[c].kvdonec, + lclose: func() { lc.Close() }, lpdonec: proxies[c].lpdonec, } pmu.Unlock() From f6d0dda1871e0e5fd075eb6c2db0e9d9f5f75478 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Wed, 3 May 2017 13:22:45 -0700 Subject: [PATCH 2/2] clientv3/integration: drain keepalives before waiting for leader loss 500ms keepalive delay on proxy side causes client to sometimes send a second keepalive since it waits more than 500ms for the first response. Fixes #7658 --- clientv3/integration/lease_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clientv3/integration/lease_test.go b/clientv3/integration/lease_test.go index a0c411826..ef176fddf 100644 --- a/clientv3/integration/lease_test.go +++ b/clientv3/integration/lease_test.go @@ -729,6 +729,12 @@ func TestLeaseWithRequireLeader(t *testing.T) { } clus.Members[1].Stop(t) + // kaReqLeader may issue multiple requests while waiting for the first + // response from proxy server; drain any stray keepalive responses + time.Sleep(100 * time.Millisecond) + for len(kaReqLeader) > 0 { + <-kaReqLeader + } select { case resp, ok := <-kaReqLeader: