Follow-up to #79 (PR #86), which made the identity windows mutually exclusive.
Three of them are far longer than the rest:
| Window |
Contents |
Order of magnitude |
| RETR/STOR |
fopen — dynalloc ENQ + VTOC I/O |
milliseconds |
| STOR (new) |
__dsalcf/__dsfree — two SVC 99 |
milliseconds |
| LIST (PDS) |
__listpd — BPAM OPEN + directory read |
milliseconds |
| MKD |
alloc_new_dataset |
milliseconds |
| JES submit |
jesiropn() |
milliseconds |
| DELE / RMD / RNTO |
idcams() — load and run a program |
seconds |
Now that the windows serialize, an IDCAMS window blocks every other session's
data set access for its whole duration. Before #86 that was a correctness
problem (a seconds-wide window in which siblings authorized as the wrong
user); now it is a throughput one.
Direction
Replace idcams() with the direct services:
- DELE / RMD — SCRATCH (SVC 29 via CAMLST) plus the catalog delete
- RNTO — RENAME (SVC 30 via CAMLST) plus the catalog re-entry
That drops the window to a couple of SVCs, and removes a program load from
under a switched identity. The PDS-member case in DELE (DELETE 'dsn(mbr)')
needs a different route than SCRATCH — probably a STOW disconnect — so it is
the part to design first.
Worth knowing before starting
- All three already pre-check ALTER via
check_dataset_access(), so the
authorization story does not change; only the mechanism does.
- IDCAMS reports failures as text ftpd currently discards; the direct services
return codes, which would make the 550 replies more specific than
"could not be deleted".
- This is a rewrite of three commands against a live catalog. It wants its own
test pass on the target, not a "looks right" merge — the failure mode is a
half-deleted or orphaned catalog entry.
Not urgent: it costs throughput on the least frequent commands, and only while
another session is doing data set work at the same moment.
Follow-up to #79 (PR #86), which made the identity windows mutually exclusive.
Three of them are far longer than the rest:
fopen— dynalloc ENQ + VTOC I/O__dsalcf/__dsfree— two SVC 99__listpd— BPAM OPEN + directory readalloc_new_datasetjesiropn()idcams()— load and run a programNow that the windows serialize, an IDCAMS window blocks every other session's
data set access for its whole duration. Before #86 that was a correctness
problem (a seconds-wide window in which siblings authorized as the wrong
user); now it is a throughput one.
Direction
Replace
idcams()with the direct services:That drops the window to a couple of SVCs, and removes a program load from
under a switched identity. The PDS-member case in DELE (
DELETE 'dsn(mbr)')needs a different route than SCRATCH — probably a STOW disconnect — so it is
the part to design first.
Worth knowing before starting
check_dataset_access(), so theauthorization story does not change; only the mechanism does.
return codes, which would make the 550 replies more specific than
"could not be deleted".
test pass on the target, not a "looks right" merge — the failure mode is a
half-deleted or orphaned catalog entry.
Not urgent: it costs throughput on the least frequent commands, and only while
another session is doing data set work at the same moment.