Skip to content

vms-76d: DLM BLKAST two-node WIRE — a remote holder receives a real blocking-AST over SCS (0.6) - #918

Merged
baron-3dl merged 3 commits into
mainfrom
work/vms-76d
Aug 29, 2026
Merged

vms-76d: DLM BLKAST two-node WIRE — a remote holder receives a real blocking-AST over SCS (0.6)#918
baron-3dl merged 3 commits into
mainfrom
work/vms-76d

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

0.6 cluster-correctness: closes the honest SS$_UNSUPPORTED at vms_lock.c's VMS_DLM_OP_BLKAST — the symmetric mirror of the H5 GRANT-receive (#875). A real master→holder BLKAST over SCS now fires a GENUINE user-mode blocking AST on the holder (drained via DELIVERAST), and the holder releases BECAUSE of it — not the H5 holder-releases-on-its-own shortcut.

  • Executive: vms_lock_dlm_xnode_blkast_recv() queues a real blocking AST (notify_blocking_asts path); no holder record / no blkastadr → honest SS$_UNSUPPORTED (INV-6, never faked). ABI vms_dlm_xnode_args 92→120, mirrored in both kernel/vms_ioctl.h + kernel-netbsd/vms_lock_nb.h with _Static_asserts.
  • Transport: scsd.c wires SCS_DLM_OP_BLKAST master→holder.
  • Proof: NEW init/run_dlm_h6.sh + Dockerfile.dlm-harness-h6 + CI job dlm-harness-h6. DLM HARNESS H6 PASSED on two real /dev/vms nodes — B sent (SCSD-I-DLMBLKSENT), A received (SCSD-I-DLMBLKAST) + fired the AST (astadr 0x404400) + released (DLMDEQ1); H5 flip still holds.
  • Step-0 collision check CLEAR: vms-694/vms-257 markers are in the MSCP connect/rejoin FSM, not the DLM dispatch path — no conflict with the owned cluster-lane rewrite.

Merges to main (0.6 milestone accumulation).

🤖 Generated with Claude Code

baron-3dl and others added 3 commits August 29, 2026 16:20
… blocking-AST over SCS (H6)

The symmetric mirror of the H5 requester-side GRANT receive (vms-6ca). Closes
the honest SS$_UNSUPPORTED at vms_lock_dlm_xnode_dispatch's VMS_DLM_OP_BLKAST
case: a real master->holder BLKAST now fires the holder's blocking AST for real.

Executive (src/kernel-core/vms_lock.c):
- vms_lock_dlm_xnode_blkast_recv(): finds the holder-side ORIGIN record by
  req_lkid and queues a GENUINE user-mode blocking AST to the delivering proc's
  USER AST queue (same path as notify_blocking_asts), drainable via DELIVERAST.
  No holder record / no registered blkastadr => SS$_UNSUPPORTED (INV-6, no fake).
- grant_recv now records the holder's blkastadr/blkastprm when a GRANT establishes
  a holder origin at a granted mode.
- the ENQ path reports blocking_req_lkid (the blocking holder's requester-side
  handle) so the daemon can address the BLKAST to the holder's origin record.

ABI: struct vms_dlm_xnode_args grows blocking_req_lkid + blkastadr/blkastprm +
blkast_delivered (92->120), updated in BOTH src/kernel/vms_ioctl.h and
src/kernel-netbsd/vms_lock_nb.h with matching _Static_asserts. New focused kif
wrapper vms_kif_dlm_xnode_blkast (src/libvmssys).

Transport (src/vmsscs/scsd.c): node B WIREs a real SCS_DLM_OP_BLKAST to the
holder when an ENQ queues behind a cross-node holder (SCSD-I-DLMBLKSENT); node A
establishes its holder origin WITH a blkast routine (SCSD-I-DLMHOLDARM), RECEIVEs
the BLKAST (SCSD-I-DLMBLKAST), dispatches it into its executive, and drains the
fired AST via DELIVERAST (SCSD-I-DLMBLKFIRE), THEN releases the holder in RESPONSE
to the BLKAST (not the H5 holder-releases-on-its-own shortcut).

Proof (Rule 9): test_syssvc_dlm_xnode.c gains the holder-side BLKAST receive +
DELIVERAST drain (runs on x86_64 + Alpha LP64). New 2-node harness
tests/qemu/{init,run}_dlm_h6.sh + Dockerfile.dlm-harness-h6 + CI job dlm-harness-h6:
two real-/dev/vms OVMX nodes, B WIREs a BLKAST, A receives+fires it for real.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SwfchU4UcPzfdkLL2JSV4T
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SwfchU4UcPzfdkLL2JSV4T
…nsus)

The BLKAST-wire kif wrapper is test-only, like vms_kif_dlm_xnode: its product
carrier is scsd, a glibc process that reaches /dev/vms with direct POSIX ioctls
(scsd_dlm_holder_establish / scsd_dlm_blkast_fire), not this freestanding client.
Declare it OVMX-UNWIRED (vms-76d) in src/libvmssys/vms_kif.h so the INV-6
executive-boundary caller census (kif_caller_census) accounts for it honestly --
NOT an allowlist entry: the census still fails if it ever gains a product caller
while keeping the declaration. Local: 'kif_caller_census: PASS'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SwfchU4UcPzfdkLL2JSV4T
@baron-3dl
baron-3dl merged commit 7257e1b into main Aug 29, 2026
113 checks passed
baron-3dl added a commit that referenced this pull request Aug 30, 2026
…der is COMPLETE (H0→H11) (#931)

The cluster-dlm.yaml was last_reviewed 2026-08-28, before H10b/e84/H11 landed — it
still read remaster/LVB/deadlock 'absent' and BLKAST 'deferred', which the merges
(#918 BLKAST H6, #923/#925 LVB H8/H9, #927/#928 remaster H10a/H10b, #929 e84
directory-guard, #930 H11 deadlock — all on main) made false. Update all four
items partial→verified with verified_against pointing at the multi-node /dev/vms
harnesses that prove them, rewrite the summary to the complete ladder + the honest
remaining DEPTH (vms-04f concurrent-initiate proof, vms-b96 directory REDIRECT,
vms-d1f post-1.0 app-acquisition), add REBUILD=5/DLKSRCH=6 to the opcode set, and
render_compat.py (docs/compatibility-surface.md regenerated, drift gate clean).
Closes the vms-7fa epic on the compat surface.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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