Finding duplicate members in multiple PDS or PDSE files
search cancel

Finding duplicate members in multiple PDS or PDSE files

book

Article ID: 223661

calendar_today

Updated On:

Products

Datacom Datacom/AD Datacom/DB PDSMAN Disk Backup and Restore - MVS SYSVIEW Performance Management

Issue/Introduction

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.

Cause

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.

Resolution

Using SYSVIEW when a job or task is currently running (like a CICS region or a database task)

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.

When a batch job has failed and you have the list of files

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.

With the PDSMAN product

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

With the Disk product

//        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 or program object could be in multiple STEPLIB or Linklist files

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.

Additional Information

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.