Skip to content

vms-0db + vms-1b68: holder records carry waiting/converting locks; a standby's queued $ENQ survives its master's departure and is granted by the next master - #1961

Merged
baron-3dl merged 5 commits into
mainfrom
work/vms-1b68-standby-takeover
Nov 2, 2026

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

Grounded on the vms-0db VAX-only capture (#1956, tests/lab/captures/vms-0db-waiting-records-20261102): a real holder sends one record per LKB it owns -- granted, converting and waiting -- with body[30]=requested, body[31]=granted (0 if never granted), body[110] queue state (01/00/ff), body[108]=04 on non-granted, flags at [28]; answer 0xfa [28]=0x10|rec[108].

  • vms-0db: one encoder/decoder (vms_dlm_rb_rec_modes) for op-0x12 and op-0x08, every cell read off the LKB; records emitted granted, converting, waiting.
  • vms-1b68: a waiting/converting proxy the departed master acknowledged survives the departure (was SS$_UNSUPPORTED), is re-sent as an op-0x08 record, and is granted by the next master (OVMX on 0xf9, only at rebuild window close; a VAX on 0xfa via its later grant). A never-acknowledged or unsent request still ends SS$_UNSUPPORTED.
  • Tests: test_dlm_rebuild / test_dlm_requester cases, peer-receive fuzz of the new cells (fuzz_codec_dlm), 7 negative controls (dlm-0db-, dlm-1b68-).

NOT to be queued until the lab fire (lab/vms-1b68, own pod) passes.

🤖 Generated with Claude Code

baron-3dl and others added 3 commits November 2, 2026 16:19
…sted at [30], granted at [31]

The op-0x12 and op-0x08 holder records are encoded and decoded in ONE
function, vms_dlm_rb_rec_modes (tests/lab/captures/vms-0db-waiting-records-
20261102, PR #1956):
  body[30] requested mode, body[31] granted mode (0 on a waiting lock);
  body[110] the queue: 01 granted, 00 converting, ff waiting -- the only
  separator; anything else is refused (E_RANGE) on receive;
  body[108] 0x04 and body[28] the lock's VALBLK/CONVERT/SYSTEM flags on a
  non-granted record. A granted record OVMX builds keeps its existing bytes
  (OVMX's granted locks carry equal modes; [108]/[28] stay 0).
The 82/01 answer's body[28] is 0x10 | the record's body[108] (5,694/5,694)
and a queued record's answer echoes its body[30:32].

fuzz_codec_dlm: a peer-receive fuzz of the new cells through both parsers,
the answer builder and the builder round trip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vives, is re-sent, and is granted by the next master

Survivor side: a 0xfb records the master and its handle on the waiting proxy
(vms_lock_dlm_proxy_queued_recv). A waiter the master acknowledged survives
its departure (engine sweep and requester FSM alike, vms_lock_dlm_proxy_
survives); the hand-over and the rebuild describe every LKB, granted then
converting then waiting (rd vms-0db), and a 0xfa re-homes the proxy and the
requester block (dlm_req_fsm_rehomed) so the new master's grant completes the
$ENQ. A request the master never acknowledged ends SS$_UNSUPPORTED as before;
a survivor whose tree's rebuild stops, finds nothing sendable, or cannot run
is ended SS$_UNSUPPORTED by vms_lock_dlm_rebuild_fail_unsent (no eternal
wait).

New-master side: a converting/waiting record is installed on the waiting
queue, ungranted; this node's own waiters promoted by a 0xf9 are not granted
either. Both are decided once when the rebuild window closes
(vms_lock_dlm_rebuild_settle), with cross-node grants reported.

Tests: test_dlm_rebuild (queue cells, survivor re-sent and granted, never-
acknowledged, stopped, unbound, this node masters the waiter, inbound
waiting record), test_dlm_requester (survivor keeps its block), and seven
host negative controls with measured red sets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… LKB -- [30] requested, [31] granted, [108] 04 and [110] 00/ff on converting/waiting records

frame_conformance.py gains an st:<key>=<hex> selector: a row applies to a
frame whose emitting test recorded that executive fact. dlm_rm_08, dlm_rm_12
and dlm_rm_08_ans rows now follow the vms-0db verdict (body[30] REQUESTED,
body[31] GRANTED, body[108] 04 and body[110] 00/ff on non-granted records,
the 0xfa answer's body[28] 0x14 echoing body[30:32]). test_dlm_rebuild dumps
the waiting and converting records with their state read off the LKB, and
run_gate.sh refuses a waiting record whose modes are swapped or whose queue
reads GRANTED. A converting lock the rebuild adopts carries LCK_M_CONVERT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@baron-3dl
baron-3dl force-pushed the work/vms-1b68-standby-takeover branch from 7eb3598 to c1a47be Compare November 2, 2026 16:27
baron-3dl and others added 2 commits November 2, 2026 16:31
…MX_FIRE_VOTES)

ovmx_fire_node.sh typed VOTES 1 at SYSBOOT> whatever the plan needed; the
2026-11-02 standby-takeover fire lost quorum at VAX1's halt because of it.
OVMX_FIRE_VOTES now reaches the SYSGEN VOTES prompt. Hermetic ctest
lab_fire_node_votes with a hard-coded-VOTES negative control.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… real VAX master's departure rebuild and are granted by the new master (P1-P4 PASS, no bugcheck)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@baron-3dl
baron-3dl added this pull request to the merge queue Nov 2, 2026
Merged via the queue into main with commit 9c6af94 Nov 2, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant