mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
contrib/recipes: fix revision race in double barrier
current kv revision might be ahead of ready put event; watch using key's mod revision instead. Fixes #4425
This commit is contained in:
parent
c15b2a5077
commit
0f7f375043
@ -60,7 +60,7 @@ func (b *DoubleBarrier) Enter() error {
|
|||||||
_, err = WaitEvents(
|
_, err = WaitEvents(
|
||||||
b.client,
|
b.client,
|
||||||
b.key+"/ready",
|
b.key+"/ready",
|
||||||
resp.Header.Revision,
|
ek.Revision(),
|
||||||
[]storagepb.Event_EventType{storagepb.PUT})
|
[]storagepb.Event_EventType{storagepb.PUT})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -100,7 +100,7 @@ func (b *DoubleBarrier) Leave() error {
|
|||||||
_, err = WaitEvents(
|
_, err = WaitEvents(
|
||||||
b.client,
|
b.client,
|
||||||
string(highest.Key),
|
string(highest.Key),
|
||||||
resp.Header.Revision,
|
highest.ModRevision,
|
||||||
[]storagepb.Event_EventType{storagepb.DELETE})
|
[]storagepb.Event_EventType{storagepb.DELETE})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -117,7 +117,7 @@ func (b *DoubleBarrier) Leave() error {
|
|||||||
_, err = WaitEvents(
|
_, err = WaitEvents(
|
||||||
b.client,
|
b.client,
|
||||||
key,
|
key,
|
||||||
resp.Header.Revision,
|
lowest.ModRevision,
|
||||||
[]storagepb.Event_EventType{storagepb.DELETE})
|
[]storagepb.Event_EventType{storagepb.DELETE})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -112,13 +112,21 @@ func TestDoubleBarrierFailover(t *testing.T) {
|
|||||||
|
|
||||||
// wait for barrier enter to unblock
|
// wait for barrier enter to unblock
|
||||||
for i := 0; i < waiters; i++ {
|
for i := 0; i < waiters; i++ {
|
||||||
<-donec
|
select {
|
||||||
|
case <-donec:
|
||||||
|
case <-time.After(10 * time.Second):
|
||||||
|
t.Fatalf("timed out waiting for enter, %d", i)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// kill lease, expect Leave unblock
|
// kill lease, expect Leave unblock
|
||||||
recipe.RevokeSessionLease(clus.clients[0])
|
recipe.RevokeSessionLease(clus.clients[0])
|
||||||
// join on rest of waiters
|
// join on rest of waiters
|
||||||
for i := 0; i < waiters-1; i++ {
|
for i := 0; i < waiters-1; i++ {
|
||||||
<-donec
|
select {
|
||||||
|
case <-donec:
|
||||||
|
case <-time.After(10 * time.Second):
|
||||||
|
t.Fatalf("timed out waiting for leave, %d", i)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user