scsd: OVMX drives honest NL-mode DLM registration to non-coord members (db20-b) - #1032
Draft
baron-3dl wants to merge 4 commits into
Draft
scsd: OVMX drives honest NL-mode DLM registration to non-coord members (db20-b)#1032baron-3dl wants to merge 4 commits into
baron-3dl wants to merge 4 commits into
Conversation
…[wip] scs_member_build_dlm_nl_enq: cat 0x02 op 0x01 ENQ with the lock mode HARD-PINNED to NL (0x00) -- no mode parameter, so a held mode (CR/CW/PR/PW/EX) or an op-07 convert can never be emitted. That construction IS the INV-6 guarantee: OVMX holds no locks, so it registers only NL directory participation in resources the cluster has shown it (never its own held state, of which it has none). Resource name + directory hash come from the discovered record; ungrounded per-message fields zero; value block null. Byte-grounded vs vax3-2to3 (VCC$vSYSDSK1). Unit test asserts NL mode + null VLB + guards. WIP: needs the sender (NL-register each discovered resource on the VAX1 DLM VC, mirroring cm_send_dlm_selfreg) + resource discovery from VAX1's pushed op-0d records, before it is lab-testable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s (db20-b) OVMX originated ZERO cat-02 DLM traffic to the non-coordinator member (VAX1) -- only echoes -- so VAX1's directory rebuild with OVMX never drains, and (grounded correlation) VAX1 never advances to blind-probe OVMX's SCA$TRANSPORT SYSAP, the member-STATUS trigger that flips BRK_NON -> counted MEMBER. This drives the missing rebuild participation, honestly. For each op-0d rebuild record a non-coordinator member pushes (which OVMX already echoes), OVMX now also originates an honest NULL-mode registration for that resource: cat-02 op-01 ENQ, mode HARD-PINNED to NL (scs_member_build_dlm_nl_enq has no mode parameter, so a held mode CR/CW/PR/PW/EX or an op-07 convert is structurally un-emittable). NL asserts directory participation holding NOTHING -- INV-6-safe by construction (vms-199). OVMX holds no locks, so it registers only NL, and only resources the cluster has SHOWN it (name + directory hash taken from the echoed record, deduped once per resource); it invents nothing and never claims its own held state, of which it has none. The reference joiner sends 3152 HELD-mode ENQs because it genuinely holds those locks; OVMX sends only the NL subset (455 in the reference). - scs_member_build_dlm_nl_enq (byte-exact unit test, NL-mode + null-VLB asserted) - cm_send_dlm_nl_register (modelled on cm_send_dlm_selfreg) + dlm_nl_reg dedup - discovery hook in the CM_RSP_DLM echo path; SEND SITE TABLE census updated - all 55 vmsscs unit tests pass; scsd_exe builds+links Re-fire grades: does VAX1 now send OVMX a SCA$TRANSPORT CONNECT-REQ? present = this rebuild is the precedent (the SCA$TRANSPORT responder is next); absent = the NL set is not yet enough (iterate count -- NEVER into held modes). Extent is lab-bounded; the NL-only construction is not. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PhM3QcmFEY3p8YNnHGaYwP
The discovery hook that originates NL-mode DLM registration read the resource name from body[20] of VAX1's echoed op-0d rebuild record. body[20] is SCS_DLM_B_MASTER_CSID -- a u32 CSID whose first byte is never A-Z -- so the A-Z name guard rejected EVERY record and no NL registration ever fired (lab grade: hook precondition met, OVMX echoed VAX1's op-0d 177x, yet DLMNLREG=0). The real resource name is ASCII at SCS_DLM_B_RESNAM (48), corroborated three ways: the DLM field map (scs_dlm.h), scs_member.c's own "RESOURCE in ASCII at body[48:]" handler, and a live dump of VAX1's op-0d records (VCC$vSYSDSK1, F11B$bSYSDSK1, CACHE$cmSYSDSK1, SYS$_$2$DUA0). - Extract the read into a pure dlm_op0d_resname() helper so the offset is unit-testable -- the origin bug was an untested inline offset that failed silently at runtime. test_scsd_wire now pins body[48] and rejects body[20]. - A VMS resource name is 1..31 bytes; widen the per-member dedup buffer 16 -> 32 so full-width names are not truncated. - dir_hash / member_count: their op-0d READ offsets are not yet ground- truthed (the emit-side op-01 uses body[10]/[14]; VAX1's op-0d layout is unconfirmed, cksum sits at body[6:8]). They do NOT gate whether the NL registration fires -- read provisionally, flagged for pcap confirmation. Standalone extractor logic: 4/4 checks. scsd.c -fsyntax-only clean. Tracks vms-7e2 (db20-b). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PhM3QcmFEY3p8YNnHGaYwP
…dir_hash (INV-6) The received VAX1 op-0d is a LOCK record (scs_dlm.h field map: master_lkid@8:12, status@12:16, req_csid@16:20, master_csid@20:24, namelen@24, valblk@32:48, resnam@48:80). It carries NEITHER a member_count NOR a dir_hash field, so the prior provisional reads (qb[14] mid-status, qb[10] mid-master_lkid) were garbage -- and feeding that garbage member_count into the NL ENQ FABRICATED it, an INV-6 violation. - member_count: now sourced from OVMX's OWN true membership state (ovmx_cluster.member_count -- the same fact op-01 PARAMS already emits), never from the peer's record. Our fact, not theirs. - dir_hash: honest ZERO. A SCS$DIRECTORY dir-hash is COMPUTED from the resource name, not echoed from a peer's ENQ; the op-0d record has no such field and OVMX does not compute the VMS hash, so it omits (0) rather than invents (INV-6). Only the resource NAME is sourced from the discovered record; every other field is OVMX's own state or an honest zero. Corrects the now-false "directory hash comes from the discovered record" grounding comment in the builder. Neither field gates whether the registration fires. Grounded from the conductor's live op-0d field-map dump. scsd.c + scs_member.c -fsyntax-only clean. Tracks vms-7e2 (db20-b). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PhM3QcmFEY3p8YNnHGaYwP
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.
What
OVMX originated zero cat-02 DLM traffic to the non-coordinator member (VAX1) — only echoes. So VAX1's directory rebuild with OVMX never drains, and (grounded correlation) VAX1 never advances to blind-probe OVMX's SCA$TRANSPORT SYSAP — the member-STATUS trigger that flips BRK_NON → counted MEMBER. This drives the missing rebuild participation, honestly.
For each op-0d rebuild record a non-coordinator member pushes (which OVMX already echoes), OVMX now also originates a NULL-mode registration: cat-02 op-01 ENQ, mode hard-pinned to NL.
INV-6 (the honesty line)
scs_member_build_dlm_nl_enqhas no mode parameter — a held mode (CR/CW/PR/PW/EX) or an op-07 convert is structurally un-emittable. NL asserts directory participation holding nothing (INV-6-safe by construction, vms-199). OVMX holds no locks, so it registers only NL, and only resources the cluster has shown it (name + directory hash taken from the echoed record, deduped once per resource). It invents nothing and never claims its own held state (it has none). The reference joiner sends 3152 held-mode ENQs because it genuinely holds those locks; OVMX sends only the NL subset (455 in the reference).Changes
scs_member_build_dlm_nl_enq— NL-ENQ builder (byte-exact unit test; asserts NL mode + null value block + guards).cm_send_dlm_nl_register(modelled oncm_send_dlm_selfreg) +dlm_nl_regdedup.CM_RSP_DLMecho path; SEND SITE TABLE census updated.scsd_exebuilds + links.Status: DRAFT — the disambiguating re-fire
Grades: does VAX1 now send OVMX a SCA$TRANSPORT CONNECT-REQ?
Extent is lab-bounded; the NL-only construction is not.
🤖 Generated with Claude Code