diff --git a/e2e/ctl_v3_alarm_test.go b/e2e/ctl_v3_alarm_test.go index a8555400da7..78dfeaddcdd 100644 --- a/e2e/ctl_v3_alarm_test.go +++ b/e2e/ctl_v3_alarm_test.go @@ -52,6 +52,11 @@ func alarmTest(cx ctlCtx) { cx.t.Fatal(err) } + // '/health' handler should return 'false' + if err := cURLGet(cx.epc, cURLReq{endpoint: "/health", expected: `{"health": "false"}`}); err != nil { + cx.t.Fatalf("failed get with curl (%v)", err) + } + // check that Put is rejected when alarm is on if err := ctlV3Put(cx, "3rd_test", smallbuf, ""); err != nil { if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { diff --git a/etcdserver/api/etcdhttp/base.go b/etcdserver/api/etcdhttp/base.go index 283b32dbf95..98891da242a 100644 --- a/etcdserver/api/etcdhttp/base.go +++ b/etcdserver/api/etcdhttp/base.go @@ -67,6 +67,10 @@ func healthHandler(server *etcdserver.EtcdServer) http.HandlerFunc { http.Error(w, `{"health": "false"}`, http.StatusServiceUnavailable) return } + if len(server.Alarms()) > 0 { + w.Write([]byte(`{"health": "false"}`)) + return + } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() if _, err := server.Do(ctx, etcdserverpb.Request{Method: "QGET"}); err != nil { diff --git a/etcdserver/server.go b/etcdserver/server.go index 151138953d2..fa38f8e08a6 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -1667,3 +1667,7 @@ func (s *EtcdServer) goAttach(f func()) { f() }() } + +func (s *EtcdServer) Alarms() []*pb.AlarmMember { + return s.alarmStore.Get(pb.AlarmType_NONE) +}