mirror of
https://github.com/cozystack/cozystack.git
synced 2026-11-06 12:03:39 +09:00
[Backport release-1.3] fix(linstor): plunger demotes idle-Primary DRBD resources (#2580)
# Description Backport of #2539 to `release-1.3`.
This commit is contained in:
1 file changed
+31
@@ -20,6 +20,34 @@ drbd_status_json() {
|
||||
drbdsetup status --json 2>/dev/null || true
|
||||
}
|
||||
|
||||
# Detect DRBD resources stuck in Primary on this node with no consumer.
|
||||
# Auto-promote can promote a resource to Primary (e.g. during mkfs.ext4
|
||||
# at provisioning time), but auto-demote sometimes fails to fire on
|
||||
# close. The resource then stays Primary on a node that has no
|
||||
# consumer and blocks NodePublishVolume on the actual target node with
|
||||
# "failed to set source device readwrite". Upstream tracker:
|
||||
# https://github.com/piraeusdatastore/piraeus-operator/issues/942
|
||||
#
|
||||
# `open == false` on every device of the resource guarantees nobody is
|
||||
# using it, so `drbdadm secondary` is safe — at worst it's a no-op
|
||||
# that auto-promote will redo when a real consumer arrives.
|
||||
drbd_fix_idle_primary() {
|
||||
local json
|
||||
json="$(drbd_status_json)"
|
||||
[ -n "$json" ] || return 0
|
||||
|
||||
printf '%s' "$json" | jq -r '
|
||||
.[]?
|
||||
| select(.role == "Primary")
|
||||
| select(all(.devices[]?; .open == false))
|
||||
| .name
|
||||
' | while IFS= read -r res; do
|
||||
[ -n "$res" ] || continue
|
||||
log "Idle Primary detected: res=$res open:no -> drbdadm secondary"
|
||||
drbdadm secondary "$res" || log "WARN: secondary failed for $res"
|
||||
done
|
||||
}
|
||||
|
||||
# Detect DRBD resources where resync is stuck:
|
||||
# - at least one local device is Inconsistent
|
||||
# - there is an active SyncTarget peer
|
||||
@@ -154,6 +182,9 @@ while true; do
|
||||
drbdadm up "${secondary}" || echo "Command failed"
|
||||
); done
|
||||
|
||||
# Detect and demote idle Primary resources stuck after auto-promote
|
||||
drbd_fix_idle_primary || true
|
||||
|
||||
# Detect and fix stalled DRBD resync by switching SyncTarget peer
|
||||
drbd_fix_stalled_sync || true
|
||||
|
||||
|
||||
Reference in new issue
Block a user