GDG Management - Batch Window Crisis
Table of Contents
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
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