nats-io/nats-server · error
Unsafe quorum rescue expired, quorum restored to %d
Error message
Unsafe quorum rescue expired, quorum restored to %d
What it means
The RescueQuorum timer fired (or recalc ended the rescue): the artificially lowered quorum is discarded and the natural quorum (from current cluster size) is restored. Guarded by n.rescue == t so only the live rescue expires; a stale timer is ignored.
Source
Thrown at server/raft.go:1378
n.qn = qn
n.warn("Unsafe quorum rescue applied, quorum lowered %d -> %d for %v", prev, qn, rescueQuorumTimeout)
// Make sure an election can happen soon.
n.resetElect(randCampaignTimeout())
return prev, qn, nil
}
// expireRescueLocked runs when the rescue timeout fires and restores the natural quorum.
// Lock should be held.
func (n *raft) expireRescueLocked(t *time.Timer) {
if n.State() == Closed || n.rescue != t {
return
}
// Must clear the timer first, recalcQuorum keeps the rescued quorum
// while it sees an active rescue.
n.rescue = nil
n.recalcQuorum()
n.warn("Unsafe quorum rescue expired, quorum restored to %d", n.qn)
}
// PauseApply will allow us to pause processing of append entries onto our
// external apply queue. In effect this means that the upper layer will no longer
// receive any new entries from the Raft group.
func (n *raft) PauseApply() error {
if n.State() == Leader {
return errAlreadyLeader
}
n.Lock()
defer n.Unlock()
n.pauseApplyLocked()
return nil
}
func (n *raft) pauseApplyLocked() {
// If we are currently not a follower, make sure we step down.
if n.State() != Follower {View on GitHub (pinned to 3a66a489d2)
Solutions
- Ensure enough peers are back or the cluster may lose quorum again
- Re-run rescue only if still degraded and data-loss risk is accepted
- Investigate why peers remained down for the full rescue window
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at server/raft.go:1378 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/70fc8aeadeee8c93.
Report an issue: GitHub.