What to do when a wrong PDS member is used
Upgrading a software version or applying maintenance fixes often results in new versions of PDS control members or load modules. Because different companies have deployment methodologies, a particular PDS member may be placed into a different library than expected, and a software function could fail because a wrong version of the PDS member was used.
This article will show how to use the SYSVIEW, DISK and PDSMAN products to help identify the duplicate members.
Members can be found in unexpected libraries when methodologies change, resulting in a combination of old-style and new-style files being used together. Another possibility is that a single member is copied to a special testing PDS, or to a commonly-used PDS for special usage, and is forgotten when a new upgrade is made. These and many other circumstances can result in duplicate members being found in multiple libraries in a list of concatenated datasets, causing confusion or errors in processing.
While a job or task is running, you can use SYSVIEW to review different files allocated to that job/task, and you can find a specific module or all duplicate modules.
In SYSVIEW, use these commands once you know which DD statement and job/STC you want to query:
Command | Description/Notes |
DDLIST ddname,asid | Where ddname is the DD to process, and asid is the job/task name. |
WHERE member | Where member is the name of the PDS member you want to find |
DUPLICAT | This will show all members that exist in two or more PDS files allocated to the DD name |
For example, to find any duplicate load modules in the DFHRPL for a CICS region called CICSRGN1:
DDLIST DFHRPL,CICSRGN1;DUPLICAT (the semi-colon allows these two commands to be stacked and executed serially):
-----------------------------------------------------------
Options ALL DUPLICAT UNIQUE
Jobname CICSRGN1 ASID 007B Jobid JOB15244 DDname DFHRPL
Libraries 21 Alloc 21 Open 21
-----------------------------------------------------------
Cmd Member Type DatasetName
____ DBCVTPR myhlq.CICSRGN1.MOD.LOAD
____ . syshlq.DBC150.DEV.CAB1LOAD
____ DBURSPR myhlq.DB15B.CUSLIB
____ . syshlq.DATCM150.DEV.CABDLOAD
____ DBURT101 myhlq.CICSRGN1.MOD.LOAD
____ . syshlq.DB15B.CUSLIB
Here you can see that the DBCVTPR member is in two different loadlibs: myhlq.CICSRGN1.MOD.LOAD and syshlq.DBC150.DEV.CAB1LOAD.
To find out where the DBSIDPR module is found in the CICS region DFHRPL, I would issue
DDLIST DFHRPL,CICSRGN1;WHERE DBSIDPR
------------------------------------------------------------------------------
Options ALL DUPLICAT UNIQUE
Jobname CICSRGN1 ASID 007B Jobid JOB15244 DDname DFHRPL
Libraries 21 Alloc 21 Open 21 Search 21 Found 1 Member DBSIDPR
------------------------------------------------------------------------------
Cmd Dataset-Name Volser APF LinkDate Size
___ CICSSYS.CTS540.SDFHLOAD VOLC08 APF
___ <myhlq>.CICSRGN1.FIX.LOAD VOLI03
___ <myhlq>.CICSRGN1.MOD.LOAD VOLI02
___ <myhlq>.CICSRGN1.COB.LOAD VOLI02
___ <myhlq>.IDLV151.CSM.CUSLIB VOLSP8
___ <myhlq>.IPCV151.CSM.CUSLIB VOLSP8
___ <syshlq>.IDEAL151.DEV.CAILLOAD VOLSPD
___ <syshlq>.IPC151.DEV.CAVQLOAD VOLSPD
___ <myhlq>.CICSLOAD VOLC03
___ CEE.SCEECICS VOLZ5C APF
___ CEE.SCEERUN VOLZ5C APF
___ IGY.SIGYCOMP VOLZ5C
___ <syshlq>.DBC150.DEV.CAB1LOAD VOLSPC
___ <myhlq>.DB15B.CUSLIB VOLSP8 14.03.05 00000800
This shows that the DBSIDPR module is found only in <myhlq>.DB15B.CUSLIB.
If a batch job has failed, and you suspect that a member has come from the wrong PDS, there are two different utilities with samples below that show the duplicates.
Using the same loadlibs as found in the DFHRPL above, here is a JCL example:
//DUPRPT0 EXEC PGM=PDSM27
//PDSMRPT DD SYSOUT=*
//PDSMPDS DD DISP=SHR,DSN=CICSSYS.CTS560.SDFHLOAD
// DD DISP=SHR,DSN=<myhlq>.CICSLOAD
. . .
// DD DISP=SHR,DSN=<myhlq>.BL1100.CAILIB
Running this utility without parms will produce an overall report of duplicate members (left side of the report shown):
PDSMAN r7.70 DUPLICATE MEMBER REPORTING UTILITY...
** PDSM27 ** lpar
Member Update Date/Time Vers. Job Name S Volser Found In Library
DBCVTPR No Control Information Available VOLI01 <myhlq>.CICSRGN1.MOD.LOAD
DBCVTPR No Control Information Available VOLDPC <syshlq>.DBC150.DEV.CAB1LOAD
DBURSPR No Control Information Available VOLDP8 <myhlq>.CICSRGN1.DB151.CUSLIB
DBURSPR No Control Information Available VOLDPD <syshlq>.DATCM151.DEV.CABDLOAD
DBUSRPR No Control Information Available VOLDP6 <applhlq>.TEST.LOADLIB
DBURT002 No Control Information Available VOLI03 <myhlq>.CICSRGN1.FIX.LOAD
DBURT002 No Control Information Available VOLDP8 <myhlq>.CICSRGN1.DB151.CUSLIB
. . .
// JCLLIB ORDER=YOUR.DISK.PROCLIB
//*
//REPORT1 EXEC DMS
//SYSIN DD *
FIND DSN=CICSSYS.CTS560.SDFHLOAD
FIND DSN=<myhlq>.CICSLOAD
. . .
FIND DSN=<myhlq>.BL1100.CAILIB
REPORT PO2REF
/*
This will produce a report like this (left side):
2023.253 SEP 10, 2023 PDS CROSS REFERENCE FOR MEMBERS IN TWO OR MORE DATA SETS ...
SUNDAY 2.47 PM
MEMBER DATA SET NAME VOLUME DATA SET NAME
-------- -------------------------------------------- ------ -----------------------------
DBCVTPR <syshlq>.DBC150.DEV.CAB1LOAD VOLDPC <myhlq>.CICSRGN1.MOD.LOAD ...
DBURSPR <syshlq>.DATCM151.DEV.CABDLOAD VOLDPD <myhlq>.CICSRGN1.DB151.CUSLIB...
<applhlq>.TEST.LOADLIB VOLDP6
DBURT002 <myhlq>.<cicsnm>.DB151.CUSLIB VOLDP8 <myhlq>.CICSRGN1.FIX.LOAD ...
. . .
When a load module could be in the STEPLIB/JOBLIB of a job as well as in the Linklist, this could cause confusion and require a great deal of effort to search all of the Linklist-defined loadlibs. However, using the PDSMAN utility, you can easily add the Linklist into the process without specifying each loadlib separately. In the test system used to produce this sample output, there are 125 Linklist-defined loadlibs, but only one DD statement is needed. Because of the number of files, there could be a much higher likelihood of duplicates, so it is recommended to specify one or more distinct member names to search.
//DUPRPT1 EXEC PGM=PDSM27
//PDSMRPT DD SYSOUT=*
//PDSMPDS DD DISP=SHR,DSN=CICSSYS.CTS560.SDFHLOAD
// DD DISP=SHR,DSN=<myhlq>.CICSLOAD
. . .
// DD DISP=SHR,DSN=<myhlq>.BL1100.CAILIB
//LINKLIST DD DUMMY <-- This statement requests searching all Linklist libs
//PDSMSEL DD *
DB*
DD*
DQ*
/*
Running this step produces:
PDSMAN r7.70 DUPLICATE MEMBER REPORTING UTILITY 10 September 2023.253
** PDSM27 ** CA11
Member Update Date/Time Vers. Job Name S Volser Found In Library Concat
DBESPPR No Control Information Available VOLM11 <MVS>.LINKLIB LINKLIST
DBESPPR No Control Information Available VOLL01 <MVS>.DATACOM.LINKLIST LINKLIST
DBSSIPR No Control Information Available VOLDP6 <applhlq>.TEST.LOADLIB PDSMPDS
DBSSIPR No Control Information Available VOLM11 <MVS>.LINKLIB LINKLIST
DBSSIPR No Control Information Available VOLL01 <MVS>.DATACOM.LINKLIST LINKLIST
. . .
In this excerpt, you can see that member DBESPPR exists in two different Linklist loadlibs, and member DBSSIPR exists in two Linklist loadlibs as well as <applhlq>.TEST.LOADLIB.
The above tools can help you answer the questions about where a particular module or PDS member is found, so that you can more quickly resolve errors due to mixed versions, wrong settings, etc.
Please refer to the PDSMAN® PDS LIBRARY MANAGEMENT 7.7 documentation for the PDSM27 program for Duplicate Member Reporting.
Please refer to the DISK™ BACKUP AND RESTORE 14.0 documentation for the use of the DMS proc and the reporting functions.
Please refer to the SYSVIEW® PERFORMANCE MANAGEMENT 17.0 documentation for tips to Find Multiple Occurrences of a Module.
As always, please contact Broadcom support for the above products if you have further questions.