++PTF(ASP0878) REWORK(2001288) /*------------------------------------- ASP0878 001211 ASEB200 V201 PM ASZ3191 Validate decompressed record lengths and improve diagnostics COPYRIGHT AUSTRALIAN SYSTEMS ENGINEERING PTY. LTD. 2001 APAR Fixes: ASZ3191 001204 61VNAB WM ASEB200 P875 ABS0C4 ASEDAMBM ...... O__-PMD Abend S0C4 in DCMP routine when decompressing a file. NOTES: This PTF enhances the validation of decompressed data and prevents S0C4 abends occuring when a bad record is returned by the compression engine. The following message will now be issued when a bad record is found: DAIO31E BLOCK DB# NNN BLK# NNNNNNNN BAD RECORD IN UNCOMPRESSED DATA NNN A new utility program, OMCSARCD has been created to produce diagnostic data about the bad record and repair it. NEW MESSAGES: DAIO27I BLOCK UPDATED Compressed data that has been patched by OMCSARCD will be written back to disk. See the proceeding DAIO29I message for details of the block changed. DAIO28E BAD RECORD : recordtext An error has occurred during decompression of a record. The bad record is displayed. Run OMCSARCD to obtain diagnostics for the error and contact ASE. DAIO29I BLOCK DB# NNN BLK# NNNNNNNN PATCHED AT OFFSET NNNNNN The specified block has been modified by OMCSARCD at the specified offset. DAIO30E BLOCK DB# NNN BLK# NNNNNNNN PATCH OLDDATA MISMATCH AT OFFSET NNNNNN The OLDDATA specified in the PATCH control card does not match the compressed data in the block. The data will not be patched. DAIO31E BLOCK DB# NNN BLK# NNNNNNNN BAD RECORD IN UNCOMPRESSED DATA NNN An error has occurred during decompression of a record. Run OMCSARCD to obtain diagnostics for the error and contact ASE. OMCSARCD: OMCSARCD should be run whenever a JOB ends with an U3931 abend and message DAIO31E is issued. Use the following JCL to run OMCSARCD replacing filename filetype with the name of the file in the DAIO64I message that is issued at the time of the abend. //STEP1 EXEC PGM=ECPX,REGION=6M, // PARM='OMCSARCD filename filetype' //SYSPRINT DD SYSOUT=* //ECPLIB DD DSN=YOUR.ASEECPS //DBASECPX DD DSN=YOUR.DATABASE //ARCDIAG DD SYSOUT=*,RECFM=VB,LRECL=121,BLKSIZE=3630 Sample JCL can be found in member OMCSARCD of your ASESAMP library. Diagnostic data will be written to the ARCDIAG DD statement. The data has the following format: Diagnostics for block 000 00000003 Dictionary 1 Dump: E=0000 L= 1.+0000 00 * * E=0001 L= 1.+0000 01 * * E=0002 L= 1.+0000 02 * * E=0003 L= 1.+0000 03 * * E=0004 L= 1.+0000 04 * * E=0005 L= 1.+0000 05 * * E=0006 L= 1.+0000 06 * * E=0007 L= 1.+0000 07 * * E=0008 L= 1.+0000 08 * * E=0009 L= 1.+0000 09 * * E=000A L= 1.+0000 0A * * E=000B L= 1.+0000 0B * * E=000C L= 1.+0000 0C * * E=000D L= 1.+0000 0D * * E=000E L= 1.+0000 0E * * E=000F L= 1.+0000 0F * * E=0010 L= 1.+0000 10 * * E=0011 L= 1.+0000 11 * * ..... E=1FBD L= 4.+0000 F8F1F5F5 *8155 * E=1FBE L= 9.+0000 F5404040 F0F8F260 F4 *5 082-4 * E=1FBF L= 3.+0000 F4F9F1 *491 * E=1FC0 L= 8.+0000 F1404040 F0F240F7 *1 02 7 * E=1FC1 L= 4.+0000 F7F6F960 *769- * E=1FC2 L= 4.+0000 60F2F7F6 *-276 * O=002E39 B=2.+0000 7D91E473 2B32B7BE DC0E5A66 7F468E3F *'jU ! .+0010 B732EABB 525DF1B1 77A3EA22 8BE71F62 * )1 t .+0020 4B43B090 9E457283 5C9DD0FC 8C03D1D5 *. c* } .+0030 118AB4ED 399D78C1 3BAA9E7C 9058AE5B * A .+0040 8929E9E0 0E50B8F0 B98B348C 378F399E *i Z\ & 0 .+0050 27414E45 EBC48AC5 8670B2FC 01CA171E * + D Ef .+0060 32B6EBFA 8CB65528 DCFF5DA8 E40A612F * – ) .+0070 6343F557 8DBD766E BD3945D0 A25D43C6 * 5 – >– .+0080 50AEC24E EB4965F1 C48AA1ED 5915113C *& B+ 1D ~ .+0090 6BD5BF64 9BAC3555 F218B5A1 2EFB78E2 *,N 2 .+00A0 98508D3B 61E1E566 ADBD0074 B70CDE69 *q& / V – .+00B0 1E30CB86 C5E7AD7B 437391A4 BFD75EC9 * fEX # j .+00C0 3759AA23 A30B289A 207D5FAC EC225D36 * t 'ª .+00D0 08F6A80F 401D2CD5 141C2927 8F244E65 * 6y N .+00E0 E497F93F CBC2CFD9 CDB46FBF E8EA88A5 *Up9 B R ? .+00F0 6AF6DC5A 968EE863 CF7CB1A5 A4E4773B *³6 !o Y @ O=002E39 B=2.+0000 7D91E473 *'jU * C=1EC8 L= 30.+0000 F9404040 40404040 40404040 40404040 *9 .+0010 4040F2F0 F04BF0F0 0000007F 40F2 * 200.00 O=002E3A B=7.+0000 91E4732B *jU * C=1E47 L= 21.+0000 F0F0F0F1 F0F2F5F0 F9F3F0F0 F3F0F9F3 *00010250930 .+0010 F0F0F0F0 F0 *00000 * O=002E3C B=4.+0000 732B32B7 * * C=0656 L= 9.+0000 F7F3F9F8 F2F0F0F0 F0 *739820000 * O=002E3E B=1.+0000 32B7BEDC * * C=0CAD L= 3.+0000 F2F4F9 *249 * O=002E3F B=6.+0000 B7BEDC0E * * C=1DF6 L= 6.+0000 F44040F3 F3F4 *4 334 * O=002E41 B=3.+0000 DC0E5A66 * ! * C=1C0E L= 3.+0000 F2F5F2 *252 * .... U=01CC64 .+0000 0000007F 40F1F9F6 F5F1F0F2 F5F0F9F3 * " 196510 .+0010 F0F0F0F0 F0F0F0F0 F3F0F9F7 F3F9F8F2 *00000000309 .+0020 F0F4F0F0 F0F0F0F0 4040F3F3 F4F2F5F2 *04000000 3 .+0030 40404040 40F0F0F0 F0F0F0F0 F0F0F0F0 * 000000 .+0040 40404040 40F0F0F0 F0F0F0F8 F5F74040 * 000000 .+0050 40F0F8F5 60F5F9F9 404040F4 F640F9F9 * 085-599 The lines beginning E= are a dump of the decompression dictionary. E= is the entry number and L= is the length of the entry. This is followed by a dump of the entry. The lines beginning O= are a dump of the compressed data. O= is the offset into the hardware compression output. B= is the bit number at which the next code starts. The lines beginning C= are a dump of the compression codes. C= is the next code and L= is the length of the string that it represents. This is followed by a dump of the string that the code represents. The lines beginning U= are a dump of the uncompressed string. C= is the offset of the string in the uncompressed output. A listing of records in the area of the bad record will also be printed to the SYSPRINT DD: READING IDMEPD9L #0014699 BAD RECORD DUMP START RECORD NUMBER 920 ------------------------------- 19651025093003093003009378204002467 630540 00000000000 0000007 19651025093003093003009378204002475 630541 00000000000 0000051 19651025093003093003009378204002476 630542 00000000000 0000051 19651025093003093003009378204002496 630619 00000000000 0000065 19651025093003093003009378204002469 630628 00000000000 0000033 19651025093003093003009378204002416 630761 00000000000 0000011 19651025093003093003009378204002411 630838 00000000000 0000015 19651025093003093003009378204002413 630859 00000000000 0000000 19651025093003093003009378204002415 630865 00000000000 0000024 19651025093003093003009378204002497 630885 00000000000 0000000 19651025093003093003009378204002448 630912 00000000000 0000001 19651025093003093003009378204002402 630927 00000000000 0000026 19651025093003093003009378204002472 630030 00000000000 0000081 19651025093003093003009378204002428 630083 00000000000 0000708 THE FOLLOWING RECORD IS BAD: 19651025093003093003009378204002494 630252 00000000000 0000008 3009378204002417 334522 00000000000 000000301 124-001 01 04 19651025093003093003009378204002412 630533 00000000000 0000200 19651025093003093003009378204002409 630541 00000000000 0000005 19651025093003093003009378204002490 630589 00000000000 0000000 19651025093003093003009378204002470 630619 00000000000 0005502 19651025093003093003009378204002586 630847 00000000000 0000001 19651025093003093003009378204002575 630860 00000000000 0000053 19651025093003093003009378204002567 630948 00000000000 0000027 19651025093003093003009378204002566 630981 00000000000 0004021 19651025093003093003009378204002549 630986 00000000000 0000000 19651025093003093003009378204002538 630994 00000000000 0002774 19651025093003093003009378204002553 630001 00000000000 0000000 19651025093003093003009378204002581 630013 00000000000 0000009 19651025093003093003009378204002568 630041 00000000000 0000000 19651025093003093003009378204002569 630048 00000000000 0000018 19651025093003093003009378204002535 630115 00000000000 0000124 BAD RECORD DUMP END RECORD NUMBER 950 --------------------------------- Both reports should be emailed to ASE for analysis. PATCH CONTROL CARDS: ASE will identified the incorrect compression code and supply a PATCH control card to repair the file. The PATCH control cards are read from the ARCPATCH DD statement. This card will have the following format: ----+----1----+----2----+----3----+----4----+----5----+------ FilenameFiletype db# blocknum offset olddata- replace- UPDATE FilenameFiletype starts in column 1 and is the name of the file to be patched db# starts in column 18 and is a 3 digit database number of the block containing the bad code. blocknum starts in column 22 and is an 8 digit block number of the block containing the bad code. offset starts in column 21 and is a 6 digit offset into the hardware compressed data of the code to be replaced. olddata- starts in column 38 and is an 8 digit hexidecimal representation of the data at the specified offset. This is verified against the actual data in the block prior to it being updated. replace- starts in column 47 and is an 8 digit hexidecimal representation of the data to the placed at the specified offset if the verify string matches the data in the block. UPDATE starts in column 56 and is an optional keyword. If specified the replaced data in the block will be written back to disk and the file will be permanently changed. The following is an example: IDMEPD9L#0014699 000 00000003 002E51 77A3EA22 77A3AA22 */. ++VER(Z038) FMID(ASEB200) SUP(ASZ3191,ASP0707,ASZ3184,ASP0875,ASP0700, ASP0705) PRE(ASP0911,ASP0830,ASP0625). ++JCLIN. ++MOD(ASEDAMBM). ++MOD(ASEDAMFM). ++MOD(OMCSARC2). ++MOD(OMCSARCD) DISTLIB(AASELOAD) LEPARM(RENT,REUS). ++SRC(OMCSARCD) DISTLIB(AASEECPS) SYSLIB(ASEECPS) DISTMOD(AASELOAD). ++SAMP(RUNARCD) DISTLIB(AASESAMP) SYSLIB(ASESAMP).