Skip to content
This repository was archived by the owner on Jul 21, 2021. It is now read-only.

Commit dd6d4dd

Browse files
author
James DeFelice
committed
tests for idempotent Close and deadlock avoidance
1 parent 50b46e7 commit dd6d4dd

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

zk/zk_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,37 @@ func TestCreate(t *testing.T) {
9393
}
9494
}
9595

96+
func TestOpsAfterCloseDontDeadlock(t *testing.T) {
97+
ts, err := StartTestCluster(1, nil, logWriter{t: t, p: "[ZKERR] "})
98+
if err != nil {
99+
t.Fatal(err)
100+
}
101+
defer ts.Stop()
102+
zk, _, err := ts.ConnectAll()
103+
if err != nil {
104+
t.Fatalf("Connect returned error: %+v", err)
105+
}
106+
zk.Close()
107+
108+
path := "/gozk-test"
109+
110+
ch := make(chan struct{})
111+
go func() {
112+
defer close(ch)
113+
for range make([]struct{}, 30) {
114+
if _, err := zk.Create(path, []byte{1, 2, 3, 4}, 0, WorldACL(PermAll)); err == nil {
115+
t.Fatal("Create did not return error")
116+
}
117+
}
118+
}()
119+
select {
120+
case <-ch:
121+
// expected
122+
case <-time.After(10 * time.Second):
123+
t.Fatal("ZK connection deadlocked when executing ops after a Close operation")
124+
}
125+
}
126+
96127
func TestMulti(t *testing.T) {
97128
ts, err := StartTestCluster(1, nil, logWriter{t: t, p: "[ZKERR] "})
98129
if err != nil {
@@ -667,6 +698,16 @@ func TestRequestFail(t *testing.T) {
667698
}
668699
}
669700

701+
func TestIdempotentClose(t *testing.T) {
702+
zk, _, err := Connect([]string{"127.0.0.1:32444"}, time.Second*15)
703+
if err != nil {
704+
t.Fatal(err)
705+
}
706+
// multiple calls to Close() should not panic
707+
zk.Close()
708+
zk.Close()
709+
}
710+
670711
func TestSlowServer(t *testing.T) {
671712
ts, err := StartTestCluster(1, nil, logWriter{t: t, p: "[ZKERR] "})
672713
if err != nil {

0 commit comments

Comments
 (0)