@@ -43,6 +43,7 @@ type fakeHealthServer struct {
43
43
linearizableReadError error
44
44
missingLeader bool
45
45
authStore auth.AuthStore
46
+ isLearner bool
46
47
}
47
48
48
49
func (s * fakeHealthServer ) Range (_ context.Context , req * pb.RangeRequest ) (* pb.RangeResponse , error ) {
@@ -52,6 +53,10 @@ func (s *fakeHealthServer) Range(_ context.Context, req *pb.RangeRequest) (*pb.R
52
53
return nil , s .linearizableReadError
53
54
}
54
55
56
+ func (s * fakeHealthServer ) IsLearner () bool {
57
+ return s .isLearner
58
+ }
59
+
55
60
func (s * fakeHealthServer ) Config () config.ServerConfig {
56
61
return config.ServerConfig {}
57
62
}
@@ -77,6 +82,7 @@ type healthTestCase struct {
77
82
alarms []* pb.AlarmMember
78
83
apiError error
79
84
missingLeader bool
85
+ isLearner bool
80
86
}
81
87
82
88
func TestHealthHandler (t * testing.T ) {
@@ -181,6 +187,11 @@ func TestHTTPSubPath(t *testing.T) {
181
187
expectStatusCode : http .StatusServiceUnavailable ,
182
188
notInResult : []string {"data_corruption" },
183
189
},
190
+ {
191
+ name : "/readyz/learner ok" ,
192
+ healthCheckURL : "/readyz/learner" ,
193
+ expectStatusCode : http .StatusOK ,
194
+ },
184
195
{
185
196
name : "/readyz/non_exist 404" ,
186
197
healthCheckURL : "/readyz/non_exist" ,
@@ -344,6 +355,42 @@ func TestLinearizableReadCheck(t *testing.T) {
344
355
}
345
356
}
346
357
358
+ func TestLearnerReadyCheck (t * testing.T ) {
359
+ be , _ := betesting .NewDefaultTmpBackend (t )
360
+ defer betesting .Close (t , be )
361
+ tests := []healthTestCase {
362
+ {
363
+ name : "readyz normal" ,
364
+ healthCheckURL : "/readyz" ,
365
+ expectStatusCode : http .StatusOK ,
366
+ isLearner : false ,
367
+ },
368
+ {
369
+ name : "not ready because member is learner" ,
370
+ healthCheckURL : "/readyz" ,
371
+ expectStatusCode : http .StatusServiceUnavailable ,
372
+ isLearner : true ,
373
+ },
374
+ }
375
+
376
+ for _ , tt := range tests {
377
+ t .Run (tt .name , func (t * testing.T ) {
378
+ mux := http .NewServeMux ()
379
+ logger := zaptest .NewLogger (t )
380
+ s := & fakeHealthServer {
381
+ linearizableReadError : tt .apiError ,
382
+ authStore : auth .NewAuthStore (logger , schema .NewAuthBackend (logger , be ), nil , 0 ),
383
+ }
384
+ s .isLearner = tt .isLearner
385
+ HandleHealth (logger , mux , s )
386
+ ts := httptest .NewServer (mux )
387
+ defer ts .Close ()
388
+ checkHTTPResponse (t , ts , tt .healthCheckURL , tt .expectStatusCode , tt .inResult , tt .notInResult )
389
+ checkMetrics (t , tt .healthCheckURL , "linearizable_read" , tt .expectStatusCode )
390
+ })
391
+ }
392
+ }
393
+
347
394
func checkHTTPResponse (t * testing.T , ts * httptest.Server , url string , expectStatusCode int , inResult []string , notInResult []string ) {
348
395
res , err := ts .Client ().Do (& http.Request {Method : http .MethodGet , URL : testutil .MustNewURL (t , ts .URL + url )})
349
396
if err != nil {
0 commit comments