aboutsummaryrefslogtreecommitdiff
path: root/weed/topology/topology.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/topology/topology.go
parent670e2185e4e4a69ce9c55bf0cc843423526a5f40 (diff)
downloadseaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.tar.xz
seaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.zip
Healthz check for deadlocks (#4558)
Diffstat (limited to 'weed/topology/topology.go')
-rw-r--r--weed/topology/topology.go22
1 files changed, 22 insertions, 0 deletions
diff --git a/weed/topology/topology.go b/weed/topology/topology.go
index fee4d6a03..017208b81 100644
--- a/weed/topology/topology.go
+++ b/weed/topology/topology.go
@@ -76,6 +76,28 @@ func NewTopology(id string, seq sequence.Sequencer, volumeSizeLimit uint64, puls
return t
}
+func (t *Topology) IsChildLocked() (bool, error) {
+ if t.IsLocked() {
+ return true, errors.New("topology is locked")
+ }
+ for _, dcNode := range t.Children() {
+ if dcNode.IsLocked() {
+ return true, fmt.Errorf("topology child %s is locked", dcNode.String())
+ }
+ for _, rackNode := range dcNode.Children() {
+ if rackNode.IsLocked() {
+ return true, fmt.Errorf("dc %s child %s is locked", dcNode.String(), rackNode.String())
+ }
+ for _, dataNode := range rackNode.Children() {
+ if dataNode.IsLocked() {
+ return true, fmt.Errorf("rack %s child %s is locked", rackNode.String(), dataNode.Id())
+ }
+ }
+ }
+ }
+ return false, nil
+}
+
func (t *Topology) IsLeader() bool {
t.RaftServerAccessLock.RLock()
defer t.RaftServerAccessLock.RUnlock()