瀏覽代碼

clientv3: don't panic on Get if NewKV is created with a closed client

Anthony Romano 9 年之前
父節點
當前提交
a83051d0fc
共有 2 個文件被更改,包括 28 次插入1 次删除
  1. 27 0
      clientv3/integration/kv_test.go
  2. 1 1
      clientv3/remote_client.go

+ 27 - 0
clientv3/integration/kv_test.go

@@ -309,6 +309,33 @@ func TestKVGetErrConnClosed(t *testing.T) {
 	}
 }
 
+func TestKVNewAfterClose(t *testing.T) {
+	defer testutil.AfterTest(t)
+
+	clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1})
+	defer clus.Terminate(t)
+
+	cli := clus.Client(0)
+	clus.TakeClient(0)
+	if err := cli.Close(); err != nil {
+		t.Fatal(err)
+	}
+
+	donec := make(chan struct{})
+	go func() {
+		kv := clientv3.NewKV(cli)
+		if _, err := kv.Get(context.TODO(), "foo"); err != rpctypes.ErrConnClosed {
+			t.Fatalf("expected %v, got %v", rpctypes.ErrConnClosed, err)
+		}
+		close(donec)
+	}()
+	select {
+	case <-time.After(3 * time.Second):
+		t.Fatal("kv.Get took too long")
+	case <-donec:
+	}
+}
+
 func TestKVDeleteRange(t *testing.T) {
 	defer testutil.AfterTest(t)
 

+ 1 - 1
clientv3/remote_client.go

@@ -90,7 +90,7 @@ func (r *remoteClient) acquire(ctx context.Context) error {
 		c := r.client.conn
 		match := r.conn == c
 		r.mu.Unlock()
-		if match {
+		if c != nil && match {
 			return nil
 		}
 		r.client.mu.RUnlock()