Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ZTMON2

ZTMON2.m

Go to the documentation of this file.
  1. ZTMON2 ;SEA/RDS-TaskMan: Option, ZTMON, Part 1 (Main Loop) ;2/19/08 13:36
  1. ;;8.0;KERNEL;**446**;Jul 10, 1995;Build 35
  1. ;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. ENV ;Main Entry Point For Taskman Status Monitor
  1. S U="^"
  1. N %,%H,X,Y,Z,ZT,ZT1,ZT2,ZT3,ZT4,ZTC,ZTCO,ZTD,ZTENV,ZTH,ZTR,ZTUCI,ZTX,ZTY
  1. D HOME^%ZIS
  1. X ^%ZOSF("UCI") S ZTUCI=Y W @IOF
  1. ;
  1. RUN ;Evaluate RUN-Node
  1. W @IOF,!,"Checking Taskman."
  1. S ZTH=$H,ZTR=$G(^%ZTSCH("RUN"))
  1. I ZTR>0 S ZTD=$$DIFF^%ZTM(ZTH,ZTR,0)
  1. S ZTY=$S(ZTR="":0,ZTD>15:0,1:1)
  1. W ?20,"Current $H=",ZTH," (",$$HTE^%ZTLOAD7(ZTH),")"
  1. W !,?22,"RUN NODE=",$S(ZTR]"":ZTR,1:"<Undefined>") I ZTR]"" W " (",$$HTE^%ZTLOAD7(ZTR),")"
  1. W !,"Taskman is ",$S(ZTY:"current.",ZTR]"":"late by "_(ZTD-15)_" seconds."_$C(7),$D(^%ZTSCH("STATUS")):"shutting down.",1:"not running."_$C(7))
  1. ;
  1. STATUS ;Evaluate Status List
  1. K ZTC S ZT="",ZTH=$$H3^%ZTM($H)
  1. L +^%ZTSCH("LOAD"):0 E W !,"Did not get a LOCK on ^%ZTSCH(""LOAD"")"
  1. F S ZT=$O(^%ZTSCH("LOADA",ZT)) Q:ZT="" S ZTC=^(ZT),ZTC($P(ZTC,U,4))=ZTC
  1. L -^%ZTSCH("LOAD")
  1. W !,"Checking the Status List:",!," Taskman $J status",?22,"time",?33,"weight node"
  1. S ZT1="" F ZT=0:1 S ZT1=$O(^%ZTSCH("STATUS",ZT1)) Q:ZT1="" S %=^(ZT1) D
  1. . W !?2,ZT1 W ?13,$P(%,U,2),?22,$$STIME($P(%,U)) W:$D(ZTC(ZT1)) ?32," ",$J($P(ZTC(ZT1),U,2),4) W ?39," ",$P(%,U,3)
  1. . Q
  1. I 'ZT W !?5,"The Status List is ",$S(ZTY:"temporarily ",1:""),"empty."
  1. ;
  1. SCHQ ;Evaluate Schedule List
  1. W !!,"Checking the Schedule List:"
  1. S ZT1=$O(^%ZTSCH(0)),ZTH=$$H3^%ZTM($H)
  1. D OVERDUE(ZT1)
  1. S ZT1=0,ZTCO=0,ZTC=0
  1. F ZT=0:0 S ZT1=$O(^%ZTSCH(ZT1)) Q:'ZT1 D
  1. . L +^%ZTSCH(ZT1):0 W:'$T !,?5,"^%ZTSCH(",ZT1,") is locked" L -^%ZTSCH(ZT1)
  1. . F ZT2=0:0 S ZT2=$O(^%ZTSCH(ZT1,ZT2)) Q:ZT2="" S ZTC=ZTC+1 I $$DIFF^%ZTM(ZTH,ZT1,1)>0 S ZTCO=ZTCO+1
  1. W !?5,"Taskman has ",$S('ZTC:"no",1:ZTC)," task",$S(ZTC'=1:"s",1:"")," scheduled."
  1. I ZTC=1 W !?5,"It is ",$S('ZTCO:"not ",1:""),"overdue."
  1. I ZTC>1 W !?5,$S('ZTCO:"None",ZTCO=ZTC&(ZTCO=2):"Both",ZTCO=ZTC:"All",1:ZTCO)," of them ",$S(ZTCO=1:"is",1:"are")," overdue." W:ZTCO>10 *7
  1. ;
  1. CONT ;Continued
  1. D JOB,SUB
  1. G DONE
  1. ;
  1. OVERDUE(X1) ;Write how overdue the oldest task is
  1. N ZTH S ZTH=$$H3^%ZTM($H)
  1. I X1>0,X1<ZTH S ZTH=ZTH-X1 W:ZTH>10 " Overdue by ",ZTH
  1. Q
  1. ;
  1. JOB ;Evaluate Job List
  1. W !!,"Checking the Job List:"
  1. S ZT1=$O(^%ZTSCH("JOB",0)) D OVERDUE(ZT1)
  1. L +^%ZTSCH("JOBQ"):0 I '$T D
  1. . W !," Did not get the 'JOBQ' lock."
  1. . Q
  1. S ZTC=0,ZT1="" F ZT=0:0 S ZT1=$O(^%ZTSCH("JOB",ZT1)),ZT2=0 Q:ZT1="" F ZT=0:0 S ZT2=$O(^%ZTSCH("JOB",ZT1,ZT2)) Q:'ZT2 S ZTC=ZTC+1
  1. W !?5,"There ",$S(ZTC=0:"are no tasks",ZTC=1:"is 1 task",1:"are "_ZTC_" tasks")," waiting for ",$S(ZTC'=1:"partitions.",1:"a partition.") W:ZTC>20 $C(7)
  1. L -^%ZTSCH("JOBQ")
  1. ;
  1. C ;Evaluate Cross CPU list
  1. S ZT1=""
  1. F S ZT1=$O(^%ZTSCH("C",ZT1)) Q:ZT1="" S ZTC=+$G(^(ZT1)) D
  1. . S ZTCO=0,ZT2=""
  1. . F S ZT2=$O(^%ZTSCH("C",ZT1,ZT2)),ZT3=0 Q:ZT2="" F S ZT3=$O(^%ZTSCH("C",ZT1,ZT2,ZT3)) Q:ZT3="" S ZTCO=ZTCO+1
  1. . W !?5,"For ",ZT1," there ",$S(ZTCO=1:"is ",1:"are "),ZTCO," tasks. "
  1. . W $S(ZTC>8:"Not responding",$$OOS^%ZTM(ZT1):"Out Of Service",'$D(^%ZIS(14.7,"B",ZT1)):"Not defined",1:"")
  1. . Q
  1. TASK ;Evaluate Task List
  1. W !!,"Checking the Task List:"
  1. S ZTC=0 F ZT1=0:0 S ZT1=$O(^%ZTSCH("TASK",ZT1)) Q:'ZT1 S ZTC=ZTC+1
  1. W !?5,"There ",$S(ZTC=0:"are no tasks",ZTC=1:"is 1 task",1:"are "_ZTC_" tasks")," currently running."
  1. Q
  1. ;
  1. SUB ;Look for idle submanagers
  1. N %,%N,ZT1,ZT2,ZT3,ZT4,ZT5
  1. W !!,"Sub-manager wait detail:"
  1. S %N="",ZT3=$$H3($H)
  1. F S %N=$O(^%ZTSCH("SUB",%N)) Q:%N="" D
  1. . W !,"Node: ",%N
  1. . L +^%ZTSCH("SUB",%N):3 W:'$T !,"Did not get the ^%ZTSCH(""SUB"",",%N,") lock."
  1. . S %=0,ZT1=0,ZT4=$G(^%ZTSCH("LOADA",%N))
  1. . ;W " Weight: ",$P(ZT4,U,2)
  1. . F S ZT1=$O(^%ZTSCH("SUB",%N,ZT1)) Q:ZT1'>0 D
  1. . . W !,?5,"Job: ",ZT1
  1. . . L +^%ZTSCH("SUBLK",%N,ZT1):1 I $T D Q
  1. . . . L -^%ZTSCH("SUBLK",%N,ZT1) Q:'$D(^%ZTSCH("SUB",%N,ZT1))
  1. . . . K ^%ZTSCH("SUB",%N,ZT1)
  1. . . . W " Didn't hold the lock, Removed from table."
  1. . . . Q
  1. . . S ZT5=$G(^(ZT1)),ZT2=$$H3($P(ZT5,U)),ZT3=$$H3($H),ZT5=$P(ZT5,U,2,4)
  1. . . I (ZT2+30)<ZT3 W " Last timestamp >30 sec old, Removed." K ^%ZTSCH("SUB",%N,ZT1) Q
  1. . . S %=%+1 W " ",ZT2-ZT3," ",$S($L(ZT5):" Status: "_ZT5,1:" Looks good.")
  1. . S ^%ZTSCH("SUB",%N)=%
  1. . W !?5,"On node ",%N," there ",$S('%:"are no",%=1:"is 1",1:"are "_$J(%,2))," free Sub-Manager(s)."
  1. . W " ",$S(+ZT4:"Wait",1:"Run")
  1. . I $G(^%ZTSCH("SUB",%N,0))>5 W !?10,"SUB-MANAGERS ARE NOT STARTING."
  1. . L -^%ZTSCH("SUB",%N)
  1. . Q
  1. Q
  1. ;
  1. DONE ;Prompt to Quit Or Continue
  1. W !!,"Enter monitor action: UPDATE// "
  1. R ZTR:$S($D(DTIME)#2:DTIME,1:60) S:ZTR="" ZTR="U"
  1. I "Ee"[$E(ZTR) Q:$$CALL("LIST^XUTMKE") G DONE
  1. I "Ss"[$E(ZTR) W @IOF X ^%ZOSF("SS") G DONE
  1. I "Pp"[$E(ZTR) W @IOF D PARAMS^ZTMCHK G DONE
  1. I "Ll"[$E(ZTR) W !! D LIST G DONE
  1. I "Dd"[$E(ZTR) K ^%ZTSCH("UPDATE"),^%ZTSCH("STATUS") W !!,"OK" H 2
  1. I ZTR="^"!(ZTR="@") Q
  1. I ZTR'["?" G RUN^ZTMON2
  1. I ZTR="??" Q:$$CALL("SELECT^XUTMONH") G RUN^ZTMON2
  1. W !!?5,"Enter <RETURN> to update the monitor screen."
  1. W !?5,"Enter ^ to exit the monitor."
  1. W !?5,"Enter E to inspect the TaskMan Error file."
  1. W !?5,"Enter L to see task's in JOB pending status"
  1. W !?5,"Enter P to see Taskman parameters"
  1. W !?5,"Enter S to see a system status listing."
  1. W !?5,"Enter D to cause Taskman to ReRead it parameters."
  1. W !?5,"Enter ? to see this message."
  1. W !?5,"Enter ?? to inspect the tasks in the monitor's lists."
  1. G DONE
  1. ;
  1. H3(%) ;Convert $H to seconds.
  1. Q 86400*%+$P(%,",",2)
  1. ;
  1. CALL(RTN) ;Check for called routine
  1. N DUOUT
  1. I $D(^DIC(19,0))[0 W !,"In the wrong account." Q 0
  1. D @RTN Q $D(DUOUT)
  1. ;
  1. LIST ;Check for tasks in stat 3.
  1. N ZT1,ZT2
  1. S ZT1=0
  1. F S ZT1=$O(^%ZTSK(ZT1)) Q:'ZT1 I 3=+$G(^%ZTSK(ZT1,.1),0) D
  1. . D EN^XUTMTP(ZT1)
  1. W "Done",!
  1. Q
  1. ;
  1. STIME(%H) ;Status time
  1. I +$H=+%H Q "T@"_$P($$HTE^%ZTLOAD7(%H),"@",2)
  1. Q "T-"_($H-%H)_"@"_$P($$HTE^%ZTLOAD7(%H),"@",2)