Page 1 of 1

how to decompress DB2 SMF records in assembler program

PostPosted: Fri Feb 19, 2021 9:53 am
by chaat
Perhaps a bit of background is in order, I'm a mainframe COBOL programmer with some limited knowledge of assembler. I'm doing a performance assessment for a company which does not have an SMF extract / reporting process. So I'm attemping to modify an assembler program to process the SMF 101 record. I'm using as a starting point this assembler program https://ndtdb2.blogspot.com/2017/10/assembler-to-select-only-101-records.html?m=1&fbclid=IwAR0niwHPfYPfS31ilC9yDicMV97NLnKJV0_wYJg3rcF75Xwu8gt0E1hNbeQ

The question I have is that if the DB2 SMF records have been written in a compressed format, is there a way to decompress them in an assembler program by perhaps calling a service module to decompress the record ?

having to run a stand alone utility to read in a file of compressed SMF 101 records and write out the uncompressed records would double the amount of time / resources needed to do the analysis

any help would be greatly appreciated.

Chuck Haatvedt

Re: how to decompress DB2 SMF records in assembler program

PostPosted: Sat Feb 20, 2021 11:22 pm
by steve-myers
Are you certain the records are "compressed?" Many fields in SMF data are either packed decimal dates (X'0121dddF' ddd is day of year) or binary time of day and not word aligned in 1/100th second interval.

Re: how to decompress DB2 SMF records in assembler program

PostPosted: Sat Feb 20, 2021 11:59 pm
by chaat
Thanks for the reply Steve, what I'm concerned about is the following from the SMF type 101 record. Note the the following reference
THIS RECORD IS COMPRESSED BY CSRCESRV


the following is a code snippet from the record layout for the type 101 records.

FLD: QWAS     LEN(4) TYPE(BIN) DISP(0)
* SMF COMMON HEADER MAPPING MACRO FOR ACCOUNTING  (SMF 101)
FLD: SM101LEN LEN(2) DISP(0)      /*SM101 TOTAL LENGTH*/
FLD: SM101SGD LEN(2) DISP(2)      /*ZZ BYTES*/
FLD: SM101FLG LEN(1) DISP(4)      /*SYSTEM INDICATOR*/
FLD: SM101RTY LEN(1) TYPE(BU) DISP(5)             /*RECORD TYPE X'65'*/
  NOACC
FLD: SM101TME LEN(4) TYPE(B-SECS) DISP(6) DEC(2)
                                  /*TIME SMF MOVED RECORD*/
FLD: SM101DTE TYPE(P-CYYDDD) DISP(10)         /*DATE SMF MOVED RECORD*/
FLD: SM101SID LEN(4) DISP(14)     /*SYSTEM ID (SID)*/
FLD: SM101SSI LEN(4) DISP(18)     /*SUBSYSTEM ID*/
FLD: SM101STF LEN(2) DISP(22)     /*SMF RECORD SUBTYPE*/
FLD: SM101SQ  LEN(4) DISP(24)
COMP: SM101CMP = X'80'        /*THIS RECORD IS COMPRESSED BY CSRCESRV*/
FLD: SM101BUF LEN(4) TYPE(BIN) DISP(24)
                             /*UNCOMPRESSED DATA LENGTH. THIS WILL BE*/
*                              0 FOR UNCOMPRESSED RECORDS.
FLD: SM101END LEN(1) DISP(28)    /*START OF THE SELF DEFINING SECTION*/
**********************************************************************


If SM101BUF > 0, that would seem to indicated that the record was compressed by CSRCESRV.

then the question is how would I go about uncompressing it ?

Chuck Haatvedt

Re: how to decompress DB2 SMF records in assembler program

PostPosted: Sun Feb 21, 2021 4:26 pm
by willy jensen
I found the description of the CSRCESRV services in the z/OS MVS Programming: Assembler Services Reference ABE-HSP manual.
They look pretty straightforward to me. I don't have access to a system with DB2 running, so cannot test reading a type 101 - compressed or not.