diff options
| author | Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> | 2023-06-09 21:42:48 +0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-09 09:42:48 -0700 |
| commit | 5ee04d20fac54daf3ceba7469adce824f30dc678 (patch) | |
| tree | 51c646f15ac396f290e21ed2735c853b0ca409c5 /weed/topology/topology.go | |
| parent | 670e2185e4e4a69ce9c55bf0cc843423526a5f40 (diff) | |
| download | seaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.tar.xz seaweedfs-5ee04d20fac54daf3ceba7469adce824f30dc678.zip | |
Healthz check for deadlocks (#4558)
Diffstat (limited to 'weed/topology/topology.go')
| -rw-r--r-- | weed/topology/topology.go | 22 |
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() |
