diff --git a/client/v3/experimental/recipes/barrier.go b/client/v3/experimental/recipes/barrier.go index 7e950a3e385..ce88e4ff86d 100644 --- a/client/v3/experimental/recipes/barrier.go +++ b/client/v3/experimental/recipes/barrier.go @@ -49,7 +49,7 @@ func (b *Barrier) Release() error { // Wait blocks on the barrier key until it is deleted. If there is no key, Wait // assumes Release has already been called and returns immediately. func (b *Barrier) Wait() error { - resp, err := b.client.Get(b.ctx, b.key, v3.WithFirstKey()...) + resp, err := b.client.Get(b.ctx, b.key) if err != nil { return err } diff --git a/tests/integration/clientv3/experimental/recipes/v3_barrier_test.go b/tests/integration/clientv3/experimental/recipes/v3_barrier_test.go index 36ed38e55cc..9d4ba9249d5 100644 --- a/tests/integration/clientv3/experimental/recipes/v3_barrier_test.go +++ b/tests/integration/clientv3/experimental/recipes/v3_barrier_test.go @@ -83,3 +83,42 @@ func testBarrier(t *testing.T, waiters int, chooseClient func() *clientv3.Client } } } + +func TestBarrierWaitNonexistentKey(t *testing.T) { + integration2.BeforeTest(t) + clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1}) + defer clus.Terminate(t) + cli := clus.Client(0) + + if _, err := cli.Put(cli.Ctx(), "test-barrier-0", ""); err != nil { + t.Errorf("could not put test-barrier0, err:%v", err) + } + + donec := make(chan struct{}) + stopc := make(chan struct{}) + defer close(stopc) + + waiters := 5 + for i := 0; i < waiters; i++ { + go func() { + br := recipe.NewBarrier(cli, "test-barrier") + if err := br.Wait(); err != nil { + t.Errorf("could not wait on barrier (%v)", err) + } + select { + case donec <- struct{}{}: + case <-stopc: + } + }() + } + + // all waiters should return immediately if waiting on a nonexistent key "test-barrier" even if key "test-barrier-0" exists + timerC := time.After(time.Duration(waiters*100) * time.Millisecond) + for i := 0; i < waiters; i++ { + select { + case <-timerC: + t.Fatal("barrier timed out") + case <-donec: + } + } +}