Skip to content

scsd: OVMX drives honest NL-mode DLM registration to non-coord members (db20-b) - #1032

Draft
baron-3dl wants to merge 4 commits into
mainfrom
vms-7e2-nl-register
Draft

scsd: OVMX drives honest NL-mode DLM registration to non-coord members (db20-b)#1032
baron-3dl wants to merge 4 commits into
mainfrom
vms-7e2-nl-register

Conversation

@baron-3dl

Copy link
Copy Markdown
Contributor

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_enq has 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 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.

Status: DRAFT — the disambiguating re-fire

Grades: does VAX1 now send OVMX a SCA$TRANSPORT CONNECT-REQ?

  • present → this rebuild is the precedent; the SCA$TRANSPORT responder (vms-5c19, op-06 builder already done) is next → member bit → CN 2→3.
  • absent → the NL set isn't yet enough (iterate count — never into held modes).

Extent is lab-bounded; the NL-only construction is not.

🤖 Generated with Claude Code

baron-3dl and others added 4 commits September 1, 2026 20:49
…[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
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