fix(consensus): count an unservable header as a nack - #4109
Merged
Merged
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #4109 +/- ##
=============================================
- Coverage 86.38% 72.18% -14.21%
+ Complexity 1455 1454 -1
=============================================
Files 1259 1257 -2
Lines 205513 183289 -22224
Branches 170714 148511 -22203
=============================================
- Hits 177542 132301 -45241
- Misses 23541 46631 +23090
+ Partials 4430 4357 -73
🚀 New features to boost your workflow:
|
numinnex
reviewed
Sep 10, 2026
krishvishal
force-pushed
the
consensus-dvc-derived-nack
branch
from
September 11, 2026 12:38
0aa8560 to
f310fd0
Compare
numinnex
approved these changes
Sep 11, 2026
spetz
approved these changes
Sep 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A view change can reach a state where an op is neither recoverable from the
DoViewChangemessages in hand nor provably uncommitted.merge_dvc_quorumanswersAwaitingRepairand waits for every replica to report, so a permanently crashed replica leaves two healthy survivors unable to elect a primary. The view number keeps climbing whilelog_viewstays put, and client requests retry forever.The op was decidable from the quorum already present. A sender that holds the header but cannot serve the body counted as neither a copy nor a nack. A prepare is journaled before it is acked and nothing compacts an op above the commit point, so a missing body proves that sender never acked it, which is what a nack asserts.
tally_opnow derives a nack from that sender. The quorum is unchanged atreplica_count - quorum_replication + 1, so replicas provably outside the ack set still leave fewer than a replication quorum inside it, and a sender that can serve the body is untouched. The derived nack stops at the sender's own commit point, where a missing body means compaction rather than absence.Two unit tests now assert truncation where they asserted a stall, one pins the boundary at a single servable copy, and the undecidable case moves to abstention. A simulator test replays the seed that found this: without the change the cluster reaches view 103 against
log_view3 with both survivors caught up, and one request retries 266 times unanswered.