ibmi-brunch-learn

Announcement

Collapse
No announcement yet.

Request from USMANJEE - Monitor of MIMIX data groups

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Request from USMANJEE - Monitor of MIMIX data groups

    Originally posted by usmanjee
    Hi Greg...

    I hope all is good with you...You have a post to monitor the data groups in MIMIX using program......could you please share the code....

    Thanks,
    Usman
    Here is the basis of what I am doing, I pass the datagroup name and then the program returns the source system (so i know which direction it is replicating) the status (*ACTIVE, *INACTIVE, *PARTIAL etc) and the backlog (normally 0)

    I have an automated set of pgms that I use to perform database switching that uses this little utility to check the status of a data group before/after making changes etc. The main program has validation based on the parms returned.

    best of all it is in Jamie's fave language ...

    BTW - Indentation seems to have gotten stripped out of the do loops etc, sorry ...

    Code:
    /* +------------------------------------------------------------------------+ */
    /* |  SWTSTSC10 - Switching Program.    Created 29 Dec 2009 - Greg Craill   | */
    /* +------------------------------------------------------------------------+ */
    /* |  This program is used to check the status of a MIMIX data group. It    | */
    /* |  returns the status of the data group, the source system, and the      | */
    /* |  number of pending transactions.                                       | */
    /* +------------------------------------------------------------------------+ */
    /* |  To Compile ...                                                        | */
    /* |  WRKDG DGDFN(GMISC *ALL *ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DGSTS)    | */
    /* |  WRKDGACT DGDFN(GMISC) OUTPUT(*OUTFILE)                                | */
    /* |    OUTFILE(QTEMP/DGACT) STATUS(*ACTIVE *FAILED)                        | */
    /* +------------------------------------------------------------------------+ */
    PGM        PARM(&DG_Name &DG_Status &DG_Source &DG_Backlog &ErrCode)
    /*      ---  Declare Parameters passed In/Out  -----------------------  */
    DCL        VAR(&DG_Name)    TYPE(*CHAR) LEN(10)     /* In     */
    DCL        VAR(&DG_Status)  TYPE(*CHAR) LEN(10)     /*    Out */
    DCL        VAR(&DG_Source)  TYPE(*CHAR) LEN(8)      /*    Out */
    DCL        VAR(&DG_Backlog) TYPE(*CHAR) LEN(10)     /*    Out */
    DCL        VAR(&ErrCode)    TYPE(*CHAR) LEN(1)      /*    Out */
    /*      ---  Declare Work Variables  ---------------------------------  */
    /*  ---  Object Variables  ----------------  */
    DCL        VAR(&DG_Ob_Cfg)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_Ob_Snd)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_Ob_Apy)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_Ob_Sts)  TYPE(*CHAR) LEN(10)
    /*  ---  Database Variables  --------------  */
    DCL        VAR(&DG_DB_Cfg)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_DB_Snd)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_DB_Apy)  TYPE(*CHAR) LEN(10)
    DCL        VAR(&DG_DB_Sts)  TYPE(*CHAR) LEN(10)
    /*  ---  Other Variables  -----------------  */
    DCL        VAR(&LogTxt)     TYPE(*CHAR) LEN(60)
    DCL        VAR(&DGBACK#)    TYPE(*DEC)  LEN(10 0) VALUE(0)
    DCL        VAR(&CNT1)       TYPE(*DEC)  LEN(10 0) VALUE(1)
    DCL        VAR(&CNT2)       TYPE(*DEC)  LEN(10 0) VALUE(0)
    DCL        VAR(&DGS_RCD#)   TYPE(*DEC)  LEN(10 0) VALUE(0)
    DCL        VAR(&BACKLOG)    TYPE(*CHAR) LEN(10)   VALUE('          ')
    DCL        VAR(&LogMsg)     TYPE(*CHAR) LEN(200)
    /*      ---  Declare Files Used  -------------------------------------  */
    DCLF       FILE(QTEMP/DGSTS) OPNID(DGS) ALWGRAPHIC(*YES)
    DCLF       FILE(QTEMP/DGACT) OPNID(DGA) ALWGRAPHIC(*YES)
    /*      ---  Set error flag to false  --------------------------------  */
    CHGVAR     VAR(&ERRCODE) VALUE('O')
    /*      ---  Get Data Group Status and Source from WRKDG to outfile  -  */
    MIMIX/WRKDG DGDFN(&DG_Name *ALL *ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DGSTS)
    RTVMBRD    FILE(QTEMP/DGSTS) NBRCURRCD(&DGS_RCD#)
    IF         COND(&DGS_RCD# *EQ 0) THEN(DO)
      CHGVAR     VAR(&ERRCODE) VALUE('2')
      GOTO       CMDLBL(ENDPGM)
    ENDDO
    /*      ---  Read in the data group information from the DGSTS file  -  */
    RCVF       OPNID(DGS)
    /*      ---  Get the source system for the data group  ---------------  */
    CHGVAR     VAR(&DG_Source) VALUE(&DGS_DTASRC)
    /*      ---  Get the Object Replication statuses  --------------------  */
    CHGVAR     VAR(&DG_Ob_Cfg) VALUE(&DGS_OBJCFG)
    CHGVAR     VAR(&DG_Ob_Snd) VALUE(&DGS_OBJSNDSTS)
    CHGVAR     VAR(&DG_Ob_Apy) VALUE(&DGS_OBJAPYSTS)
    /*      ---  Get the DataBase Replication statuses  ------------------  */
    CHGVAR     VAR(&DG_DB_Cfg) VALUE(&DGS_DBCFG)
    CHGVAR     VAR(&DG_DB_Snd) VALUE(&DGS_DBSNDSTS)
    CHGVAR     VAR(&DG_DB_Apy) VALUE(&DGS_DBAPYSTS)
    
    /*  +---------------------------------------------------+  */
    /*  |  Initialise Variables for checking status options |  */
    /*  +---------------------------------------------------+  */
    CHGVAR     VAR(&DG_STATUS) VALUE('          ')
    CHGVAR     VAR(&DG_DB_STS) VALUE('          ')
    CHGVAR     VAR(&DG_OB_STS) VALUE('          ')
    CHGVAR     VAR(&ERRCODE)   VALUE('O')
    /*  +---------------------------------------------------+  */
    /*  |  If Object Replication is configured as *NO then  |  */
    /*  |  both the Object Status fields should be empty,   |  */
    /*  |  else there are errors.                           |  */
    /*  +---------------------------------------------------+  */
    If (&DG_Ob_Cfg = '*NO') Do
      If (&DG_Ob_Snd *NE ' ') Do
       Chgvar &DG_Status &DG_Ob_Snd
       Goto ExitChecks
      Enddo
      If (&DG_Ob_Apy *NE ' ') Do
        Chgvar &DG_Status &DG_Ob_Apy
        Goto ExitChecks
      Enddo
      Chgvar &DG_Ob_Sts '*NA       '
    Enddo
    /*  +---------------------------------------------------+  */
    /*  |  If Object Replication is configured as *YES then |  */
    /*  |  both the Object Status fields should be *ACTIVE  |  */
    /*  |  or *INACTIVE. Blanks or other values are errors. |  */
    /*  +---------------------------------------------------+  */
    If (&DG_Ob_Cfg = '*YES') Do
      /*  +-----------------------------------------------+  */
      /*  |  Check the Object Send Status field.          |  */
      /*  +-----------------------------------------------+  */
      Select
      When (&DG_Ob_Snd = ' ') Do
        Chgvar &DG_Ob_Sts '*BLANKS   '
      Enddo
      When (&DG_Ob_Snd = '*ACTIVE') Do
        Chgvar &DG_Ob_Sts &DG_Ob_Snd
      Enddo
      When (&DG_Ob_Snd = '*INACTIVE') Do
        Chgvar &DG_Ob_Sts &DG_Ob_Snd
      Enddo
      Otherwise Do
        Chgvar &DG_Status &DG_Ob_Snd
        Goto ExitChecks
      Enddo
      EndSelect
      /*  +-----------------------------------------------+  */
      /*  |  Check the Object Apply Status field.         |  */
      /*  +-----------------------------------------------+  */
      Select
      When (&DG_Ob_Apy = ' ') Do
        Chgvar &DG_Ob_Sts '*BLANKS   '
      Enddo
      When (&DG_Ob_Apy = '*ACTIVE') Do
        If (&DG_Ob_Sts = '*INACTIVE ') Do
          Chgvar &DG_Ob_Sts '*PARTIAL  '
        Enddo
      Enddo
      When (&DG_Ob_Apy = '*INACTIVE') Do
        If (&DG_Ob_Sts = '*ACTIVE ') Do
          Chgvar &DG_Ob_Sts '*PARTIAL  '
        Enddo
      Enddo
      Otherwise Do
        Chgvar &DG_Status &DG_Ob_Apy
        Goto ExitChecks
      Enddo
      EndSelect
    EndDo
    /*  +---------------------------------------------------+  */
    /*  |  If DataBase Replication is configured as *NO then|  */
    /*  |  both the Database Status fields should be empty, |  */
    /*  |  else there are errors.                           |  */
    /*  +---------------------------------------------------+  */
    If (&DG_DB_Cfg = '*NO') Do
      If (&DG_DB_Snd *NE ' ') Do
        Chgvar &DG_Status &DG_DB_Snd
        Goto ExitChecks
      Enddo
      If (&DG_DB_Apy *NE ' ') Do
        Chgvar &DG_Status &DG_DB_Apy
        Goto ExitChecks
      Enddo
      Chgvar &DG_DB_Sts '*NA       '
    Enddo
    /*  +-----------------------------------------------------+  */
    /*  |  If DataBase Replication is configured as *YES then |  */
    /*  |  both the Object Status fields should be *ACTIVE    |  */
    /*  |  or *INACTIVE. Blanks or other values are errors.   |  */
    /*  +-----------------------------------------------------+  */
    If (&DG_DB_Cfg = '*YES') Do
      /*  +-----------------------------------------------+  */
      /*  |  Check the Database Send Status field.        |  */
      /*  +-----------------------------------------------+  */
      Chgvar &DG_DB_Snd &DG_DB_Apy   /*  <=============  */
      /*  +-----------------------------------------------+  */
      /*  | Send is always up for DB groups so cheat here |  */
      /*  +-----------------------------------------------+  */
      Select
      When (&DG_DB_Snd = ' ') Do
        Chgvar &DG_DB_Sts '*BLANKS   '
      Enddo
      When (&DG_DB_Snd = '*ACTIVE') Do
        Chgvar &DG_DB_Sts &DG_DB_Snd
      Enddo
      When (&DG_DB_Snd = '*INACTIVE') Do
        Chgvar &DG_DB_Sts &DG_DB_Snd
      Enddo
      Otherwise Do
        Chgvar &DG_Status &DG_DB_Snd
        Goto ExitChecks
      Enddo
      EndSelect
      /*  +-----------------------------------------------+  */
      /*  |  Check the DataBase Apply Status field.       |  */
      /*  +-----------------------------------------------+  */
      Select
      When (&DG_DB_Apy = ' ') Do
        Chgvar &DG_DB_Sts '*BLANKS   '
      Enddo
      When (&DG_DB_Apy = '*ACTIVE') Do
        If (&DG_DB_Sts = '*INACTIVE ') Do
          Chgvar &DG_DB_Sts '*PARTIAL  '
        Enddo
      Enddo
      When (&DG_DB_Apy = '*INACTIVE') Do
        If (&DG_DB_Sts = '*ACTIVE ') Do
          Chgvar &DG_DB_Sts '*PARTIAL  '
        Enddo
      Enddo
      Otherwise Do
        Chgvar &DG_Status &DG_DB_Apy
        Goto ExitChecks
      Enddo
      EndSelect
    Enddo
    /*  +-----------------------------------------------------+  */
    /*  |  Once the DataBase and Object checks have been done |  */
    /*  |  average the two statuses together to return the    |  */
    /*  |  combined status.                                   |  */
    /*  +-----------------------------------------------------+  */
    Select
    When (&DG_DB_Sts *EQ &DG_Ob_Sts) Do
      Chgvar &DG_Status &DG_Ob_Sts
    Enddo
    When ((&DG_DB_Sts = '*NA       ') *Or (&DG_DB_Sts = '*BLANKS   ')) Do
      Chgvar &DG_Status &DG_Ob_Sts
    Enddo
    When ((&DG_Ob_Sts = '*NA       ') *Or (&DG_Ob_Sts = '*BLANKS   ')) Do
      Chgvar &DG_Status &DG_DB_Sts
    Enddo
    When ((&DG_DB_Sts = '*ACTIVE   ') *AND (&DG_Ob_Sts = '*INACTIVE ')) Do
      Chgvar &DG_Status '*PARTIAL  '
    Enddo
    When ((&DG_DB_Sts = '*INACTIVE   ') *AND (&DG_Ob_Sts = '*ACTIVE ')) Do
      Chgvar &DG_Status '*PARTIAL  '
    Enddo
    OtherWise Do
      Select
      When ((&DG_Ob_Sts *NE '*ACTIVE   ') *And (&DG_Ob_Sts *NE '*INACTIVE ') *AND +
      (&DG_Ob_Sts *NE '*NA       ') *And (&DG_Ob_Sts *NE '*BLANKS   ')) Do
        Chgvar &DG_Status &DG_Ob_Sts
      EndDo
      When ((&DG_DB_Sts *NE '*ACTIVE   ') *And (&DG_DB_Sts *NE '*INACTIVE ') *And +
      (&DG_DB_Sts *NE '*NA       ') *And (&DG_DB_Sts *NE '*BLANKS   ')) Do
        Chgvar &DG_Status &DG_DB_Sts
      EndDo
      Otherwise Do
        Chgvar &DG_Status &DG_DB_Sts      /* either one */
      EndDo
      EndSelect
    EndDo
    EndSelect
    /*      ---  ---------------------------------------------------------  */
    /*      ---  ---------------------------------------------------------  */
    EXITCHECKS:
    IF         COND((&DG_STATUS *NE '*ACTIVE') *AND +
    (&DG_STATUS *NE '*INACTIVE')) THEN(DO)
      CHGVAR     VAR(&ERRCODE) VALUE('1')
    ENDDO
    /*      ---  Get Data Group Active Entries from WRKDGACT to outfile  -  */
    GETDGACT:   MIMIX/WRKDGACT DGDFN(&DG_Name) OUTPUT(*OUTFILE) +
    OUTFILE(QTEMP/DGACT) STATUS(*ACTIVE *FAILED)
    READ:       RCVF       OPNID(DGA)
    MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(EOF))
    CHGVAR     VAR(&DGBACK#) VALUE(&DGBACK# + &DGA_COUNT)
    GOTO       CMDLBL(READ)
    EOF:
    /*      ---  Format the backlog to get rig of leading zeroes etc  ----  */
    CHGVAR     VAR(&CNT1) VALUE(1)
    CHGVAR     VAR(&BACKLOG) VALUE(&DGBACK#)
    IF         COND(&DGBACK# = 0) THEN(DO)
      CHGVAR     VAR(&DG_Backlog) VALUE('0')
      GOTO       CMDLBL(REPORT)
    ENDDO
    NoZeroes:
    IF         COND(%SST(&BACKLOG &CNT1 1) = '0') THEN(DO)
      CHGVAR     VAR(%SST(&BACKLOG &CNT1 1)) VALUE(' ')
      CHGVAR     VAR(&CNT1) VALUE(&CNT1 + 1)
      GOTO       CMDLBL(NoZeroes)
    ENDDO
    CHGVAR     VAR(&CNT2) VALUE(11 - &CNT1)
    CHGVAR     VAR(&DG_Backlog) VALUE(%SST(&BACKLOG &CNT1 &CNT2))
    Report:
    GOTO       CMDLBL(ENDPGM)
    /*      --------------------------------------------------------------  */
    ERROR:
    /*      ---  Error Processing and Logging section -------------------------------  */
    /*      -------------------------------------------------------------------------  */
    ENDPGM:
    CHGVAR     VAR(&LOGMSG) VALUE('DGrp(' *TCAT &DG_Name *TCAT ')' +
    *BCAT 'DG-Src(' *TCAT &DG_Source *TCAT ')' +
    *BCAT 'DG-Sts(' *TCAT &DG_Status *TCAT ')' +
    *BCAT 'DG-Bak(' *TCAT &DG_Backlog *TCAT ')' )
    SNDPGMMSG  MSG(&LOGMSG)
    RCLRSC     LVL(*CALLER)
    ENDPGM
    Greg Craill: "Life's hard - Get a helmet !!"

  • #2
    Re: Request from USMANJEE - Monitor of MIMIX data groups

    This is based on some assumptions I made on the output from the WRKDG command. Also it works on datagrouos that have database replication, but occasionally it returns a status for data groups that are object only replication that is not *ACTIVE/*INACTIVE (I presume *PARTIAL?) and I haven't yet figured out how to make that side of it 100% reliable. In those situations I refresh, or exit the program and restart and it then returns the correct status for the object data groups.

    This is relevant to maybe just me as my automated switch program will not allow progression to the next task if a data group is reported as being in the wrong state.
    Greg Craill: "Life's hard - Get a helmet !!"

    Comment

    Working...
    X