@@ -27,6 +27,7 @@ type fakeHealthServer struct {
2727 linearizableReadError error
2828 missingLeader bool
2929 authStore auth.AuthStore
30+ isLearner bool
3031}
3132
3233func (s * fakeHealthServer ) Range (_ context.Context , req * pb.RangeRequest ) (* pb.RangeResponse , error ) {
@@ -36,6 +37,10 @@ func (s *fakeHealthServer) Range(_ context.Context, req *pb.RangeRequest) (*pb.R
3637 return nil , s .linearizableReadError
3738}
3839
40+ func (s * fakeHealthServer ) IsLearner () bool {
41+ return s .isLearner
42+ }
43+
3944func (s * fakeHealthServer ) Config () config.ServerConfig {
4045 return config.ServerConfig {}
4146}
@@ -61,6 +66,7 @@ type healthTestCase struct {
6166 alarms []* pb.AlarmMember
6267 apiError error
6368 missingLeader bool
69+ isLearner bool
6470}
6571
6672func TestHealthHandler (t * testing.T ) {
@@ -165,6 +171,11 @@ func TestHttpSubPath(t *testing.T) {
165171 expectStatusCode : http .StatusServiceUnavailable ,
166172 notInResult : []string {"data_corruption" },
167173 },
174+ {
175+ name : "/readyz/learner ok" ,
176+ healthCheckURL : "/readyz/non_learner" ,
177+ expectStatusCode : http .StatusOK ,
178+ },
168179 {
169180 name : "/readyz/non_exist 404" ,
170181 healthCheckURL : "/readyz/non_exist" ,
@@ -328,6 +339,42 @@ func TestLinearizableReadCheck(t *testing.T) {
328339 }
329340}
330341
342+ func TestLearnerReadyCheck (t * testing.T ) {
343+ be , _ := betesting .NewDefaultTmpBackend (t )
344+ defer betesting .Close (t , be )
345+ tests := []healthTestCase {
346+ {
347+ name : "readyz normal" ,
348+ healthCheckURL : "/readyz" ,
349+ expectStatusCode : http .StatusOK ,
350+ isLearner : false ,
351+ },
352+ {
353+ name : "not ready because member is learner" ,
354+ healthCheckURL : "/readyz" ,
355+ expectStatusCode : http .StatusServiceUnavailable ,
356+ isLearner : true ,
357+ },
358+ }
359+
360+ for _ , tt := range tests {
361+ t .Run (tt .name , func (t * testing.T ) {
362+ mux := http .NewServeMux ()
363+ logger := zaptest .NewLogger (t )
364+ s := & fakeHealthServer {
365+ linearizableReadError : tt .apiError ,
366+ authStore : auth .NewAuthStore (logger , be , nil , 0 ),
367+ }
368+ s .isLearner = tt .isLearner
369+ HandleHealth (logger , mux , s )
370+ ts := httptest .NewServer (mux )
371+ defer ts .Close ()
372+ checkHttpResponse (t , ts , tt .healthCheckURL , tt .expectStatusCode , tt .inResult , tt .notInResult )
373+ checkMetrics (t , tt .healthCheckURL , "linearizable_read" , tt .expectStatusCode )
374+ })
375+ }
376+ }
377+
331378func checkHttpResponse (t * testing.T , ts * httptest.Server , url string , expectStatusCode int , inResult []string , notInResult []string ) {
332379 res , err := ts .Client ().Do (& http.Request {Method : http .MethodGet , URL : testutil .MustNewURL (t , ts .URL + url )})
333380
0 commit comments