Skip to main content
Modernization Hub

GDG Management - Batch Window Crisis

Interview Question

"Your daily sales extract job creates GDG dataset DAILY.SALES.EXTRACT with LIMIT(30):

Monday Crisis:

  • Today's job (creating +1) ABENDed at Step 3 of 8
  • Partially created G0031V00 exists (incomplete data)
  • Steps 4-8 need to read yesterday's file (G0030V00) but job logic reads (-1)
  • Downstream jobs expect today's complete file
  • You have 2 hours before business reporting starts

Questions:

1. What does (-1) resolve to now?

2. How do you restart the job correctly?

3. How do you prevent partial GDG generations?

4. Redesign for better error handling."

What This Tests

  • GDG mechanics and relative generation numbers
  • Production incident management
  • Batch job restart strategies
  • Defensive programming for GDG

Good Answer Should Include

1. Current State Analysis:

  • G0030V00: Yesterday's complete file (what we want)
  • G0031V00: Today's partial file (corrupted)
  • (-1) now resolves to: G0031V00 (the partial file!) ← Problem!
  • (-2) would resolve to: G0030V00 (yesterday's complete file)

2. Immediate Fix (Next 30 minutes):

Option A: Delete partial generation

//STEP1   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DELETE DAILY.SALES.EXTRACT.G0031V00
  SET MAXCC=0
/*

//STEP2   EXEC PGM=IEFBR14
//DD1     DD DSN=DAILY.SALES.EXTRACT(+1),
//           DISP=(NEW,CATLG,DELETE),
//           ... (create new +1)

Option B: Restart with absolute generation

//STEP4   EXEC PGM=PROCESS
//INPUT   DD DSN=DAILY.SALES.EXTRACT.G0030V00,  ← Absolute reference
//           DISP=SHR
//OUTPUT  DD DSN=DAILY.SALES.EXTRACT(+1),
//           DISP=(NEW,CATLG,DELETE),
//           ...

3. Root Cause Prevention:

Original (Bad) Design:

//STEP1   EXEC PGM=EXTRACT
//OUTPUT  DD DSN=DAILY.SALES.EXTRACT(+1),
//           DISP=(NEW,CATLG,DELETE),    ← Problem: CATLG on abnormal
//           ...

//STEP4   EXEC PGM=PROCESS
//INPUT   DD DSN=DAILY.SALES.EXTRACT(-1),  ← Reads wrong file after ABEND!
//           DISP=SHR

Improved Design:

* Step 1: Create in temporary dataset
//STEP1   EXEC PGM=EXTRACT
//OUTPUT  DD DSN=&&TEMP,
//           DISP=(NEW,PASS,DELETE),
//           UNIT=SYSDA,
//           SPACE=(CYL,(100,10)),
//           DCB=(RECFM=FB,LRECL=500,BLKSIZE=27500)

* Step 2: Validate data
//STEP2   EXEC PGM=VALIDATE
//INPUT   DD DSN=&&TEMP,DISP=SHR
//REPORT  DD SYSOUT=*

* Step 3: Copy to GDG only if validation passes
//STEP3   EXEC PGM=IEBGENER,COND=(0,NE,STEP2)
//SYSUT1  DD DSN=&&TEMP,DISP=SHR
//SYSUT2  DD DSN=DAILY.SALES.EXTRACT(+1),
//           DISP=(NEW,CATLG,DELETE),
//           ... 

* Step 4+: Process from GDG (safe now)
//STEP4   EXEC PGM=PROCESS
//INPUT   DD DSN=DAILY.SALES.EXTRACT(0),  ← Current generation (just created)
//           DISP=SHR

4. Advanced GDG Patterns:

Pattern A: Safe input reference

* Define symbolic for yesterday's file in JOB card
//JOBLIB   DD DSN=USER.PROCLIB,DISP=SHR
// SET YSTDY='DAILY.SALES.EXTRACT.G0030V00'

//STEP4   EXEC PGM=PROCESS  
//INPUT   DD DSN=&YSTDY,DISP=SHR  ← Immune to GDG state changes

Pattern B: Idempotent processing

* Delete +1 if exists, then create
//STEP0A  EXEC PGM=IDCAMS
//SYSIN   DD *
  DELETE DAILY.SALES.EXTRACT(+1)
  SET MAXCC=0
/*

//STEP0B  EXEC PGM=IEFBR14
//OUT1    DD DSN=DAILY.SALES.EXTRACT(+1),
//           DISP=(NEW,CATLG,DELETE)

5. GDG Restart Logic:

* In COBOL program, check if +1 already exists
EXEC SQL
    SELECT COUNT(*) INTO :WS-COUNT
    FROM SYSIBM.SYSDATASETS
    WHERE NAME = 'DAILY.SALES.EXTRACT.G0031V00'
END-EXEC.

IF WS-COUNT > 0
    DISPLAY 'GDG +1 already exists. Delete before restart.'
    MOVE 12 TO RETURN-CODE
    STOP RUN
END-IF.

Red Flags

  • ❌ Doesn't understand relative generation number changes after creation
  • ❌ Immediately reruns job without deleting partial generation
  • ❌ Uses DISP=(NEW,CATLG,CATLG) on GDG creation step
  • ❌ No validation before cataloging GDG
  • ❌ Can't explain absolute vs relative generation references

Follow-Up Questions

  • "What if LIMIT is 30 but you already have 30 generations?"
  • "How do you reference 'day before yesterday's file?"
  • "What's the difference between G0031V00 and (+1)?"
  • "How do you prevent GDG rollovers in the middle of batch cycle?"

Difficulty Level

Mid to Senior

Relevant Roles

Batch Developer, Production Support, Job Scheduler