Browse Source

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
Anthony Romano 9 years ago
parent
commit
0f7f375043
2 changed files with 13 additions and 5 deletions
  1. 3 3
      contrib/recipes/double_barrier.go
  2. 10 2
      integration/v3_double_barrier_test.go

+ 3 - 3
contrib/recipes/double_barrier.go

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

+ 10 - 2
integration/v3_double_barrier_test.go

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