MCPcopy
hub / github.com/etcd-io/etcd / TestElectionFailover

Function TestElectionFailover

tests/integration/v3_election_test.go:114–175  ·  view source on GitHub ↗

TestElectionFailover tests that an election will

(t *testing.T)

Source from the content-addressed store, hash-verified

112
113// TestElectionFailover tests that an election will
114func TestElectionFailover(t *testing.T) {
115 integration.BeforeTest(t)
116 clus := integration.NewCluster(t, &integration.ClusterConfig{Size: 3})
117 defer clus.Terminate(t)
118
119 cctx, cancel := context.WithCancel(context.TODO())
120 defer cancel()
121
122 ss := make([]*concurrency.Session, 3)
123
124 for i := 0; i < 3; i++ {
125 var err error
126 ss[i], err = concurrency.NewSession(clus.Client(i))
127 if err != nil {
128 t.Error(err)
129 }
130 defer ss[i].Orphan()
131 }
132
133 // first leader (elected)
134 e := concurrency.NewElection(ss[0], "test-election")
135 if err := e.Campaign(context.TODO(), "foo"); err != nil {
136 t.Fatalf("failed volunteer (%v)", err)
137 }
138
139 // check first leader
140 resp, ok := <-e.Observe(cctx)
141 if !ok {
142 t.Fatalf("could not wait for first election; channel closed")
143 }
144 s := string(resp.Kvs[0].Value)
145 if s != "foo" {
146 t.Fatalf("wrong election result. got %s, wanted foo", s)
147 }
148
149 // next leader
150 electedErrC := make(chan error, 1)
151 go func() {
152 ee := concurrency.NewElection(ss[1], "test-election")
153 eer := ee.Campaign(context.TODO(), "bar")
154 electedErrC <- eer // If eer != nil, the test will fail by calling t.Fatal(eer)
155 }()
156
157 // invoke leader failover
158 err := ss[0].Close()
159 require.NoError(t, err)
160
161 // check new leader
162 e = concurrency.NewElection(ss[2], "test-election")
163 resp, ok = <-e.Observe(cctx)
164 if !ok {
165 t.Fatalf("could not wait for second election; channel closed")
166 }
167 s = string(resp.Kvs[0].Value)
168 if s != "bar" {
169 t.Fatalf("wrong election result. got %s, wanted bar", s)
170 }
171

Callers

nothing calls this directly

Calls 10

TerminateMethod · 0.95
ClientMethod · 0.95
CampaignMethod · 0.95
ObserveMethod · 0.95
OrphanMethod · 0.80
BeforeTestMethod · 0.65
NewClusterMethod · 0.65
ErrorMethod · 0.65
FatalfMethod · 0.65
CloseMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…