aboutsummaryrefslogtreecommitdiff
path: root/weed/server/raft_server_handlers.go
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2023-06-09 21:42:48 +0500
committerGitHub <noreply@github.com>2023-06-09 09:42:48 -0700
commit5ee04d20fac54daf3ceba7469adce824f30dc678 (patch)
tree51c646f15ac396f290e21ed2735c853b0ca409c5 /weed/server/raft_server_handlers.go
parent670e2185e4e4a69ce9c55bf0cc843423526a5f40 (diff)
downloadseaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.tar.xz
seaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.zip
Healthz check for deadlocks (#4558)
Diffstat (limited to 'weed/server/raft_server_handlers.go')
-rw-r--r--weed/server/raft_server_handlers.go21
1 files changed, 18 insertions, 3 deletions
diff --git a/weed/server/raft_server_handlers.go b/weed/server/raft_server_handlers.go
index 9ed9a0c90..8f4a347d7 100644
--- a/weed/server/raft_server_handlers.go
+++ b/weed/server/raft_server_handlers.go
@@ -1,9 +1,12 @@
package weed_server
import (
+ "github.com/cenkalti/backoff/v4"
+ "github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/storage/needle"
"net/http"
+ "time"
)
type ClusterStatusResult struct {
@@ -27,12 +30,24 @@ func (s *RaftServer) StatusHandler(w http.ResponseWriter, r *http.Request) {
}
func (s *RaftServer) HealthzHandler(w http.ResponseWriter, r *http.Request) {
- _, err := s.topo.Leader()
+ leader, err := s.topo.Leader()
if err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
- } else {
- w.WriteHeader(http.StatusOK)
+ return
+ }
+ if s.serverAddr == leader {
+ expBackoff := backoff.NewExponentialBackOff()
+ expBackoff.InitialInterval = 20 * time.Millisecond
+ expBackoff.MaxInterval = 1 * time.Second
+ expBackoff.MaxElapsedTime = 5 * time.Second
+ isLocked, err := backoff.RetryWithData(s.topo.IsChildLocked, expBackoff)
+ glog.Errorf("HealthzHandler: %+v", err)
+ if isLocked {
+ w.WriteHeader(http.StatusLocked)
+ return
+ }
}
+ w.WriteHeader(http.StatusOK)
}
func (s *RaftServer) StatsRaftHandler(w http.ResponseWriter, r *http.Request) {