From 61a736a0682546b4889aa2a262a832db3f92b068 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 17 Jul 2017 15:29:44 -0700 Subject: [PATCH 1/2] etcdserver: check alarms in health handler Signed-off-by: Gyu-Ho Lee --- etcdserver/api/etcdhttp/base.go | 4 ++++ etcdserver/server.go | 4 ++++ 2 files changed, 8 insertions(+) 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) +} From 91470a8a544ae2d5158c32fbb91d72a8248e2724 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 17 Jul 2017 15:30:04 -0700 Subject: [PATCH 2/2] e2e: test '/health' when alarm is raised --- e2e/ctl_v3_alarm_test.go | 5 +++++ 1 file changed, 5 insertions(+) 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") {