zVSAM V2 Catalog
z390 does not keep a live catalog of the host file system. A zVSAM catalog is a
VSAM Catalog Definition Table (VCDT): a data-only load module assembled from
DEFINE statements. At OPEN, the runtime loads that module and uses the tables
in storage as the metadata for the cluster, AIX, or path named on the ACB.
Dynamic catalogs stored as zVSAM datasets are planned for a later release, once V2 KSDS support is complete enough to host them. Until then the assembled VCDT is the catalog.
The assembler DSECT that maps a V2 VCDT is generated by VCDTD2. That DSECT is
the canonical layout. Catalog source is collected by DEFINE2 and emitted by
ZDEFINE2. The umbrella DEFINE / VCDTD macros select the V1 or V2
implementation from &SYSZVSAM.
A worked example of a V2 catalog is vsam2/mlc/Z390CAT2.MLC.
For V1 catalog source syntax see
zVSAM V1 Catalog User Guide.
That guide already describes several V2-only operands; the authoritative V2
operand list is this chapter and DEFINE2.
Role of the catalog
The VCDT holds the static definition of every component in one or more spheres. It holds information on zVSAM clusters only. Sequential datasets cannot be catalogued in a zVSAM catalog.
| Information | Where it lives |
|---|---|
| Catalog name and version | VCDT header (IHAVCDT) |
| Base clusters (ESDS, KSDS, RRDS, LDS) | Cluster table (IHAVCLR) |
| Alternate indexes | AIX table (IHAVAIX) |
| Paths (alias to a cluster or AIX) | Path table (IHAVPTH) |
| Upgrade set for a cluster | Per-cluster address list in VCLRAIXS |
| Optional DTA/IDX dsname overrides | Null-terminated strings in VCLRDSNS / VAIXDSNS |
It does not hold runtime state (high-used XLRA, record counts, spacemaps). That lives in the prefix and counters areas of each physical file. Those areas are expected to move into a catalog dataset in a future release; see File Structure.
How a catalog is built
Catalog source is ordinary assembler. ZVSAM(2) must be in effect so DEFINE
expands DEFINE2.
Typical structure:
DEFINE CATALOG,NAME=Z390CAT2
DEFINE CLUSTER,NAME=MYFILE03,INDEX=INDEXED,KEYS=(3,0),...
DEFINE AIX,NAME=MYAIX31,RELATE=MYFILE03,KEYS=(3,6),...
DEFINE PATH,NAME=AIX31PH,ENTRY=MYAIX31,UPDATE=NO
DEFINE END
END
Processing:
DEFINE CATALOGrecords the catalog name and version. It must appear first.- Each
DEFINE CLUSTER,DEFINE AIX/DEFINE ALTERNATEINDEX, andDEFINE PATHappends an entry to in-memory global arrays (ZDEFINE2.CPY). Capacity is 100 clusters, 100 AIXs, and 100 paths. DEFINE ENDcross-checks relations, then expandsZDEFINE2(the loadable tables) andVCDTD2(the DSECTs).
ZDEFINE2 emits these CSECTs, which the linker combines into one .390:
| CSECT | Content |
|---|---|
VCDT |
Header: id, name, counts, addresses of the three tables |
VCLR |
One IHAVCLR entry per cluster, labelled by cluster name |
VCLRAIXS |
Per-cluster lists of upgrade-AIX addresses |
VCLRDSNS |
Null-terminated DTA/IDX override strings for clusters |
VAIX |
One IHAVAIX entry per AIX, labelled by AIX name |
VAIXDSNS |
Null-terminated DTA/IDX override strings for AIXs |
VPTH |
One IHAVPTH entry per path, labelled by path name |
Unlike V1, V2 does not embed a model DCB in the catalog (VCDTDCBA is gone).
What a catalog contains
The catalog will hold at least: - cluster name - pointer to index file - pointers to all related AIX clusters - LRECL - record type (F, V, FS, VS) - type of component (ESDS, KSDS, RRDS, LDS, AIX) - freeblocks (during load, between blocks) - freespace (during load, within blocks) - Physical Block size (aka CI-size, 512 bytes to 16MB)
This design includes all those values, and a few more.
The design explicitly excludes metadata for sequential files.
Locating the catalog at OPEN
The ACB DDNAME names a host environment variable. That variable holds the
path of the catalog load module, with the catalog entry name in place of the
.390 suffix:
SET MYACB=drive:\path\Z390CAT2.MYFILE03
If the value has no period, the ACB label is used as the entry name. OPEN loads
the .390 from that directory, then searches the cluster table and, if needed,
the path table for the entry. AIX names are not searched on OPEN; an AIX is
opened via a path, or as the AIX itself when MACRF=AIX is used on a path
(see Interfaces and
ACB Processes).
A CATALOG environment variable, if present, is documentation only; zVSAM does
not read it.
Default physical file names, when DTADSN / IDXDSN are omitted, are derived
at OPEN from the catalog directory plus the component name:
| Component | Data file | Index file |
|---|---|---|
| Cluster or AIX | {path}{name}.DTA |
{path}{name}.IDX |
V1 used {name}.VES, {name}.VX0, and {name}.VXN and stored those defaults
in the VCDT. V2 stores a single X'00' when no override is given; OPEN must
synthesize .DTA / .IDX.
[!NOTE] V2 behavior is simple. Maybe too simple. I suggest we look into copying V1 behaviour, using the proper extensions we assign to zVSAM V2 physical files.
DEFINE CATALOG
Must be first. Operands:
| Operand | Required | Default | Meaning |
|---|---|---|---|
NAME= |
yes | — | Catalog name, 1–8 characters. Becomes VCDTNAME and the CSECT/module name. |
VERSION= |
no | 2 |
Single character. Concatenated with C'VCD' to form VCDTID. Default id is C'VCD2' |
V1 catalogs always use id C'VCDT' and have no VERSION= operand. The fourth
byte of VCDTID is the discriminator for a runtime that must accept both
layouts (T = V1, 2 = V2).
DEFINE CLUSTER
Defines a base cluster. NAME= is required (1–8 characters) and becomes the
label of the VCLR entry.
Cluster type — INDEX=
INDEX= |
VCLRTYPE |
Flag | Notes |
|---|---|---|---|
INDEXED |
KSDS |
VCLRKSDS |
Default when DEFINE is used via the umbrella macro. KEYS= required. |
NONINDEXED |
ESDS |
VCLRESDS |
|
NUMBERED |
RRDS |
VCLRRRDS |
|
LINEAR |
LDS |
VCLRLDS |
Required catalog type. The LDS physical file format is described in File Structure document |
DEFINE2 itself has no default for INDEX=; the umbrella DEFINE supplies
INDEX=INDEXED.
Record format — RECORDSIZE= and SPANNED=
| Source | Result |
|---|---|
RECORDSIZE=n |
Fixed. VCLRLMAX = n. VCLRVREC off. |
RECORDSIZE=(avg,max) |
Variable. VCLRVREC on, VCLRLAVG / VCLRLMAX set. |
SPANNED=YES |
VCLRSPAN on. Default NO. |
The four-byte record length field is not included in RECORDSIZE.
Combinations map to the File Structure record types F, FS, V, VS.
LDS does not use RECORDSIZE, SPANNED, or KEYS.
Keys — KEYS=(length,offset)
KSDS only. Length must be non-zero. offset + length must not exceed
VCLRLMAX. Stored in VCLRKLEN / VCLRKOFF.
The umbrella default is KEYS=(64,0). A KSDS defined through DEFINE2
directly with omitted keys is rejected.
Block size and load-time space
Block sizes may be given in bytes or as nK. The permitted range is
512 bytes through 16MB. DEFINE2 currently enforces
only the 512-byte minimum; the 16MB maximum is a catalog rule and must be
enforced.
| Operand | Default | Stored as | Rules |
|---|---|---|---|
DATABLOCKSIZE= |
4K |
VCLRDBS (bytes) |
Bytes or nK. Range 512–16MB. |
INDEXBLOCKSIZE= |
4K |
VCLRIBS (bytes) |
Same. |
DATAADJUST=YES/NO |
NO |
VCLRDADJ |
Reduce data block size to an optimal fit. Forbidden for variable records and for SPANNED=YES. Intended for fixed non-spanned data. |
INDEXADJUST=YES/NO |
NO |
VCLRIADJ |
Reduce index block size to an optimal fit. Allowed on variable KSDS. |
DATAFREESPACE=nn |
0 |
VCLRDFS |
0–99. Percent of space left free in a data block at load and after a split. |
INDEXFREESPACE=nn |
0 |
VCLRIFS |
0–99. Same for index blocks. |
DATAFREEBLOCKS=(x,y) |
(0,0) |
VCLRDNB, VCLRDFB |
After every y data blocks, insert x empty ones. (x,0) inserts x empty blocks before the first. x and y ≤ 65535. Cluster: KSDS only. |
INDEXFREEBLOCKS=(x,y) |
(0,0) |
VCLRINB, VCLRIFB |
Same for index blocks. Cluster: KSDS only. |
Freespace and freeblocks are load-time reservation attributes. They are not
restricted to fixed non-spanned KSDS. DEFINE2 applies these additional
edits:
- Fixed spanned KSDS cannot have freespace (severity 12).
- Fixed spanned KSDS with
RECORDSIZEless than data block size is a warning (severity 4). - Fixed ESDS cannot have freespace.
- ESDS cannot have freeblocks.
- Fixed RRDS cannot have freespace.
Variable KSDS may specify freespace. An AIX may specify freespace and freeblocks (an AIX is indexed). Those cases are valid catalog options; the stricter wording in File Structure should be relaxed to match this chapter.
[!NOTE] We should not impose unnecessary restrictions. on FREESPACE usage, except when in compatability mode. Under noallow, we should mimic VSAM rules.
Other cluster operands
| Operand | Default | Meaning |
|---|---|---|
REUSE=YES/NO |
NO |
Reset high-used at OPEN (VCLRRUSE in VCLRFLG2). |
DTADSN= |
omitted | Full host path of the data file. C string addressed by VCLRDTAA. |
IDXDSN= |
omitted | Full host path of the index file, addressed by VCLRIDXA. Must not equal DTADSN. |
LDS skips RECORDSIZE, SPANNED, KEYS, and REUSE in DEFINE2 and goes
straight to the DSN overrides.
DEFINE AIX / DEFINE ALTERNATEINDEX
An AIX is catalogued as its own KSDS-like cluster (data + index files) related
to a base cluster in the same VCDT. AIX and ALTERNATEINDEX are synonyms.
AIX record format is not a user operand. It is derived from UNIQUEKEY=:
UNIQUEKEY= |
AIX record type | Flags set |
|---|---|---|
YES |
F | VAIXUKEY on; VAIXVREC and VAIXSPAN off |
NO |
VS | VAIXUKEY off; VAIXVREC and VAIXSPAN on |
SPANNED= is not a DEFINE operand for AIX. Unique AIX data hold one base
pointer per alternate key (fixed). Non-unique AIX data hold a variable-length,
possibly spanned list of base pointers.
| Operand | Default | Meaning |
|---|---|---|
NAME= |
required | 1–8 characters. Label of the VAIX entry. |
RELATE= |
required | Name of the base cluster. Resolved at DEFINE END. |
KEYS=(length,offset) |
required | Alternate key in the base record. Must fit in the related cluster’s VCLRLMAX. |
UNIQUEKEY=YES/NO |
YES |
Unique vs non-unique alternate keys. Also selects F vs VS. |
MAXELEMENTS= |
0 |
Only with UNIQUEKEY=NO. Max number of base pointers per AIX record (VAIXMAXE). Bytes or nK, max 2,147,483,647. Used to size AIX data blocks. |
UPGRADE=YES/NO |
YES |
Include this AIX in the related cluster’s upgrade list (VAIXUAIX). |
REUSE=YES/NO/NOREUSE |
NO |
NOREUSE is accepted as IBM’s synonym for NO. Stored as VAIXRUSE in VAIXFLG2. |
DATABLOCKSIZE= / INDEXBLOCKSIZE= |
4K |
Same range as cluster: 512–16MB. |
DATAADJUST=YES/NO |
NO |
Rejected when UNIQUEKEY=NO (VS data cannot be adjusted). |
INDEXADJUST=YES/NO |
NO |
Same meaning as on a cluster. |
DATAFREESPACE= / INDEXFREESPACE= |
0 |
0–99. Valid on AIX. |
DATAFREEBLOCKS= / INDEXFREEBLOCKS= |
(0,0) |
Valid on AIX (it is indexed). |
DTADSN= / IDXDSN= |
omitted | Overrides for the AIX .DTA / .IDX files. |
DEFINE END requires every RELATE= to name a cluster in this catalog. An AIX
may relate to KSDS or ESDS. Relating an AIX to RRDS or LDS is not a defined
use; DEFINE2 currently does not reject it.
[!NOTE] 1. In noallow mode, an index can also be created on an RRDS. 2. Does REUSE belong in the catalog? I thought it was an ACB attribute. When in the catalog, no data can ever be accessed that was stored before. To be investigated.
DEFINE PATH
A path is a catalog alias. It has no files of its own.
| Operand | Default | Meaning |
|---|---|---|
NAME= |
required | 1–8 characters. |
ENTRY= |
required | Name of an AIX or a base cluster in this catalog. |
UPDATE=YES/NO |
YES |
When the path is used for output, upgrade associated AIXs (VPTHAIXU) |
At DEFINE END:
- If
ENTRY=names an AIX,VPTHAIXPis set andVPTHENTApoints at thatVAIX. The related cluster is reached viaVAIXRELA. - If
ENTRY=names a cluster,VPTHAIXPis off andVPTHENTApoints at thatVCLR(alias path).
Search order at OPEN is clusters first, then paths. Duplicate names across types are not diagnosed; the cluster would win.
DEFINE END
- Every AIX
RELATE=must match a cluster name; the AIX key must lie within that cluster’s maximum record length. - Every path
ENTRY=must match an AIX or cluster name;VPTHAIXPis set for AIX entries. - For each cluster,
ZDEFINE2builds the upgrade list: addresses of related AIXs that haveUPGRADE=YES.VCLRAIXNis the count,VCLRAIXApoints at the list. - Tables and DSECTs are generated.
In-memory layout
VCDTD2 is the canonical map. ZDEFINE2 must emit bytes that match these
DSECTs. Where the current generator still follows V1 bit packing, that is a
defect; see Implementation issues.
Header — IHAVCDT
| Offset | Field | Type | Content |
|---|---|---|---|
| 0 | VCDTID |
CL4 | C'VCD' + version character (C'VCD2' default) |
| 4 | VCDTNAME |
CL8 | Catalog name |
| 12 | VCDTCLRT |
F | Number of cluster entries |
| 16 | VCDTCLRA |
A | Address of VCLR |
| 20 | VCDTAIXT |
F | Number of AIX entries |
| 24 | VCDTAIXA |
A | Address of VAIX |
| 28 | VCDTPTHT |
F | Number of path entries |
| 32 | VCDTPTHA |
A | Address of VPTH |
Length 36. V1 continues with VCDTDCBA at offset 36 (model DCB); V2 does not.
Cluster entry — IHAVCLR
Length is VCLRLEN (68 bytes after 0F alignment). Each entry is labelled
with the cluster name so AIX and path pointers can use A(name).
| Offset | Field | Type | Content |
|---|---|---|---|
| 0 | VCLRID |
CL4 | C'VCLR' |
| 4 | VCLRNAME |
CL8 | Cluster name |
| 12 | VCLRTYPE |
CL4 | ESDS / KSDS / RRDS / LDS |
| 16 | VCLRFLG1 |
X | See flag table |
| 17 | VCLRFLG2 |
X | See flag table |
| 18–19 | VCLRFLG3/4 |
XL2 | Reserved (zero) |
| 20 | VCLRLAVG |
F | Average length if variable |
| 24 | VCLRLMAX |
F | Max or fixed length |
| 28 | VCLRKLEN |
F | Primary key length (KSDS) |
| 32 | VCLRKOFF |
F | Primary key offset (KSDS) |
| 36 | VCLRDTAA |
A | Override DTA dsname, or X'00' |
| 40 | VCLRIDXA |
A | Override IDX dsname, or X'00' |
| 44 | VCLRDBS |
F | Data block size in bytes |
| 48 | VCLRIBS |
F | Index block size in bytes |
| 52 | VCLRDFS |
X | Data freespace % |
| 53 | VCLRIFS |
X | Index freespace % |
| 54 | VCLRDNB |
XL2 | Data free-block count x |
| 56 | VCLRDFB |
XL2 | Data free-block interval y |
| 58 | VCLRINB |
XL2 | Index free-block count x |
| 60 | VCLRIFB |
XL2 | Index free-block interval y |
| 62 | VCLRAIXN |
AL1 | Number of upgrade AIXs |
| 63 | VCLRAIXA |
AL4 | Address of upgrade address list |
| 67 | Pad to fullword (VCLRLEN = 68) |
VCLRFLG1:
| Bit | Equate | Meaning |
|---|---|---|
| X'80' | VCLRVREC |
Variable records |
| X'10' | VCLRSPAN |
Spanned |
| X'08' | VCLRKSDS |
KSDS |
| X'04' | VCLRRRDS |
RRDS |
| X'02' | VCLRESDS |
ESDS |
| X'01' | VCLRLDS |
LDS |
VCLRFLG2:
| Bit | Equate | Meaning |
|---|---|---|
| X'80' | VCLRDADJ |
DATAADJUST=YES |
| X'40' | VCLRIADJ |
INDEXADJUST=YES |
| X'20' | VCLRRUSE |
REUSE=YES |
REUSE belongs in VCLRFLG2 X'20', not in the V1 VCLRFLG1 X'40' position.
AIX entry — IHAVAIX
| Offset | Field | Type | Content |
|---|---|---|---|
| 0 | VAIXID |
CL4 | C'VAIX' |
| 4 | VAIXNAME |
CL8 | AIX name |
| 12 | VAIXRELN |
CL8 | Related cluster name |
| 20 | VAIXFLG1 |
X | See flag table |
| 21 | VAIXFLG2 |
X | See flag table |
| 22–23 | XL2 | Reserved | |
| 24 | VAIXKLEN |
F | Alternate key length |
| 28 | VAIXKOFF |
F | Alternate key offset |
| 32 | VAIXDTAA |
A | Override DTA dsname |
| 36 | VAIXIDXA |
A | Override IDX dsname |
| 40 | VAIXRELA |
A | Address of related VCLR |
| 44 | VAIXDBS |
F | AIX data block size |
| 48 | VAIXIBS |
F | AIX index block size |
| 52 | VAIXDFS |
X | Data freespace % |
| 53 | VAIXIFS |
X | Index freespace % |
| 54 | VAIXDNB |
XL2 | Data free-block count x |
| 56 | VAIXDFB |
XL2 | Data free-block interval y |
| 58 | VAIXINB |
XL2 | Index free-block count x |
| 60 | VAIXIFB |
XL2 | Index free-block interval y |
| 64 | VAIXMAXE |
F | MAXELEMENTS (fullword-aligned) |
VAIXMAXE is a DS F after VAIXIFB at offset 60, so the assembler inserts
two pad bytes. VAIXLEN is 68.
VAIXFLG1:
| Bit | Equate | Meaning |
|---|---|---|
| X'80' | VAIXVREC |
Variable AIX records. On when UNIQUEKEY=NO (VS). |
| X'40' | VAIXUKEY |
Unique keys. On when UNIQUEKEY=YES (F). |
| X'20' | VAIXUAIX |
Upgrade this AIX |
| X'10' | VAIXSPAN |
Spanned AIX records. On when UNIQUEKEY=NO (VS). |
VAIXFLG2:
| Bit | Equate | Meaning |
|---|---|---|
| X'80' | VAIXDADJ |
DATAADJUST=YES |
| X'40' | VAIXIADJ |
INDEXADJUST=YES |
| X'20' | VAIXRUSE |
REUSE=YES |
REUSE belongs in VAIXFLG2 X'20'. VAIXFLG1 X'80' is VAIXVREC, not the
V1 VAIXRUSE bit.
Path entry — IHAVPTH
| Offset | Field | Type | Content |
|---|---|---|---|
| 0 | VPTHID |
CL4 | C'PATH' (RPI 865). The DSECT comment C'VPTH' is stale. |
| 4 | VPTHNAME |
CL8 | Path name |
| 12 | VPTHENTN |
CL8 | AIX or cluster name |
| 20 | VPTHFLG1 |
X | VPTHAIXP X'80' = entry is an AIX; VPTHAIXU X'40' = update upgrades |
| 21–23 | XL3 | Reserved | |
| 24 | VPTHENTA |
A | Address of the VAIX or VCLR |
Length 28.
UPDATE=YES sets VPTHAIXU. DEFINE2 must assign the same global that
ZDEFINE2 emits (&PTH_AIXU).
Relations in a sphere
VCDT
├─ VCLR cluster
│ ├─ VCLRAIXA → [ VAIX, VAIX, ... ] upgrade set only
│ ├─ VCLRDTAA → "…\name.DTA" or X'00'
│ └─ VCLRIDXA → "…\name.IDX" or X'00'
├─ VAIX aix
│ ├─ VAIXRELA → VCLR
│ ├─ VAIXDTAA / VAIXIDXA
│ └─ RELATE= must match VCLRNAME
└─ VPTH path
└─ VPTHENTA → VAIX or VCLR
OPEN of a path with VPTHAIXP on uses the AIX to locate base records, unless
MACRF=AIX treats the AIX as a KSDS. Upgrade OPEN of related AIXs is driven
by the cluster upgrade list and by VPTHAIXU; see ACB Processes.
Runtime consumption
V1 OPEN (vz390) loads the VCDT as a module and walks it with V1 offsets,
including VCDTDCBA and 56-byte VCLR entries. That path is not valid
for a V2 VCDT.
V2 OPEN is intended to:
- Load the catalog module (same DDNAME /
catalog.entryconvention). - Inspect
VCDTIDand instantiate Java catalog objects from either a V1 or a V2 layout. - Resolve the named cluster or path.
- Derive DTA/IDX paths (override or
{dir}{name}.DTA/.IDX). - Open those files and validate the prefix against the catalog (type, LRECL, block size, key offset/length) as described in ACB Processes.
zCatVCLR and zCatVAIX exist as stubs: they read the eyecatcher (and, for
zCatVCLR, name and type) and leave remaining fields at defaults. zACB.Open()
is likewise a stub. Completing those constructors to match VCDTD2 is the
Java side of this chapter. There is not yet a header object for IHAVCDT or a
path object for IHAVPTH.
[!NOTE] Catalog load logic needs to be revamped to: - extend the zControlBlock to define the physical layout of data in z390 memory - derive the zVSAM V2 objects (if catalog is V1, use what we have, default all else) - since catalogs are frozen, only getter and iterator methods will be needed
SHOWCAT is not supported in V2.
[!NOTE] Let's see if we can change that. SHOWCAT seems to me to be a useful tool.
V1 vs V2 catalog
| Topic | V1 (DEFINE1 / VCDTD1) |
V2 (DEFINE2 / VCDTD2) |
|---|---|---|
| Id | C'VCDT' |
C'VCD' + VERSION (default C'VCD2') |
| Model DCB | VCDTDCBA |
omitted |
| Data/index files | .VES / .VX0 / AIX .VXN; defaults stored in the VCDT |
.DTA / .IDX; overrides only, else null |
| Block size | CONTROLINTERVALSIZE= on cluster (VCLRCI) |
DATABLOCKSIZE= / INDEXBLOCKSIZE= on cluster and AIX; 512–16MB |
| Freespace | not in VCDT | percent + freeblocks on cluster and AIX |
| Adjust | not in VCDT | DATAADJUST / INDEXADJUST |
| Spanned | not in VCDT | VCLRSPAN on cluster; AIX spanned implied by UNIQUEKEY=NO |
| Max record length | VCLRLREC |
VCLRLMAX |
VCLRAIXN |
F | AL1 |
VCLR length |
56 | 68 |
VAIX length |
40 | 68 (with VAIXMAXE and block/space fields) |
AIX MAXELEMENTS |
none | VAIXMAXE |
| AIX record format | not distinguished in the VCDT | Unique = F; non-unique = VS (VAIXUKEY / VAIXVREC / VAIXSPAN) |
REUSE on AIX |
NOREUSE accepted |
YES / NO / NOREUSE; bit is VAIXFLG2 VAIXRUSE |
V1 and V2 catalog source cannot be mixed in one assembly (ZVSAM(1) vs
ZVSAM(2)). Linked modules of both kinds are intended to run in one z390
process; that requires the Java loader to understand both VCDT layouts.
Future: catalog dataset
Once V2 KSDS is complete enough, the assembled VCDT can be replaced by a catalog cluster. Planned consequences:
DEFINE/DELETEbecome runtime operations against that cluster, not an assembly step.- Prefix counters that today sit in the first 4096 bytes of each file can move into catalog records.
- A
SYSCAT(or similar) host variable can name the catalog; the ACB DDNAME can then name the cluster directly.
The in-memory objects (zCatVCLR, zCatVAIX, and a future path/header type)
should be independent of whether the bytes came from a load module or from a
catalog dataset.
Implementation issues
VCDTD2 is the layout this chapter specifies. The items below are defects or
incomplete work in the current macros and Java; they should be closed against
this chapter rather than documented as if they were finished behaviour.
- Cluster
REUSEbit.ZDEFINE2still placesREUSEinVCLRFLG1X'40' (V1 position) and never setsVCLRFLG2VCLRRUSEX'20'. The generator must matchVCDTD2. - AIX flag byte.
ZDEFINE2still packsREUSEatVAIXFLG1X'80'. That bit isVAIXVREC.REUSEbelongs inVAIXFLG2VAIXRUSE. ForUNIQUEKEY=NOthe generator must setVAIXVRECandVAIXSPAN; forUNIQUEKEY=YESit must setVAIXUKEYonly.SPANNED=is not an AIX operand;DEFINE2should stop advertising it on AIX. - AIX
INDEXADJUST=NO. Both YES and NO fall through toSETB 1, so the index-adjust bit is always on if that path is taken. NO must leave the bit off. - AIX
DATABLOCKSIZEminimum. The skipAIF ('&MAXELEMENTS' NE '')is true for the default0, so the 512-byte check never runs. Enforce 512–16MB unlessMAXELEMENTSis a non-zero value that is meant to drive sizing. - 16MB maximum.
DEFINE2does not yet reject a cluster or AIX block size above 16,777,216 bytes. - Path
UPDATE.DEFINE2sets&PTH_UPDATE, butZDEFINE2emits&PTH_AIXU.UPDATE=YEStherefore does not setVPTHAIXU. Use one global (&PTH_AIXU). The same mismatch exists in V1. VPTHIDDSECT comment. Generated value isC'PATH'. Update theVCDTD2comment that still saysC'VPTH'.- Java objects.
zCatVCLRandzCatVAIXdo not yet parse block size, freespace, freeblocks, keys, flags, or DSN pointers. Remaining field names still talk about CA/CI percents. Constructors must followVCDTD2, includingVCLRRUSE/VAIXRUSEin flag byte 2 and AIX F vs VS fromUNIQUEKEY. There is noIHAVCDTorIHAVPTHJava type yet. - AIX
RELATE=to RRDS or LDS. Not a defined use;DEFINE2should reject it once that edit is agreed. - No name-uniqueness check among clusters, AIXs, and paths. OPEN searches clusters first, so a colliding path name is silently hidden.
- File Structure freespace wording. That chapter currently says only a fixed non-spanned KSDS can specify free space. This catalog chapter is authoritative: variable KSDS and AIX may specify freespace; freeblocks are KSDS (cluster) or AIX. File Structure should be updated to match.
- And various NOTE sections trhoughout this document.