Browse Source

integration: permit dropping intermediate leader values on observe

Weaken TestV3ElectionObserve so it only checks that it observes a strictly
monotonically ascending leader transition sequence following the first
observed leader. First, the Observe will issue the leader channel before
getting a response for its first get; the election revision is only bound
after returning the channel. So, Observe can't be expected to always
return the leader at the time it was started.  Second, Observe fetches
the current leader based on its create revision, but begins watching on its
ModRevision; this is important so that elections still work in case the
leader issues proclamations following a compaction that exceeds its
creation revision. So, Observe can't be expected to return the entire
proclamation sequence for a single leader.

Fixes #7749
Anthony Romano 8 years ago
parent
commit
e6a789d541
1 changed files with 7 additions and 3 deletions
  1. 7 3
      integration/v3election_grpc_test.go

+ 7 - 3
integration/v3election_grpc_test.go

@@ -96,7 +96,7 @@ func TestV3ElectionObserve(t *testing.T) {
 
 
 	lc := epb.NewElectionClient(clus.Client(0).ActiveConnection())
 	lc := epb.NewElectionClient(clus.Client(0).ActiveConnection())
 
 
-	// observe 10 leadership events
+	// observe leadership events
 	observec := make(chan struct{})
 	observec := make(chan struct{})
 	go func() {
 	go func() {
 		defer close(observec)
 		defer close(observec)
@@ -110,9 +110,13 @@ func TestV3ElectionObserve(t *testing.T) {
 			if rerr != nil {
 			if rerr != nil {
 				t.Fatal(rerr)
 				t.Fatal(rerr)
 			}
 			}
-			if string(resp.Kv.Value) != fmt.Sprintf("%d", i) {
-				t.Fatalf(`got observe value %q, expected "%d"`, string(resp.Kv.Value), i)
+			respV := 0
+			fmt.Sscanf(string(resp.Kv.Value), "%d", &respV)
+			// leader transitions should not go backwards
+			if respV < i {
+				t.Fatalf(`got observe value %q, expected >= "%d"`, string(resp.Kv.Value), i)
 			}
 			}
+			i = respV
 		}
 		}
 	}()
 	}()