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:
Anthony Romano 2016-02-12 16:54:39 -08:00
parent c15b2a5077
commit 0f7f375043
2 changed files with 13 additions and 5 deletions

View File

@ -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

View File

@ -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)
}
} }
} }