| 1 | %ZTM ;SEA/RDS-TaskMan: Manager, Part 1 (Main Loop) ;1/9/2006
|
---|
| 2 | ;;8.0;KERNEL;**24,36,64,67,118,127,136,275,355**;JUL 10, 1995;Build 9
|
---|
| 3 | ;
|
---|
| 4 | ;%ZTCHK is set to 1 @ top of SCHQ, set to 0 if send a task to SM
|
---|
| 5 | LOOP ;Taskman's Main Loop
|
---|
| 6 | F %ZTLOOP=0:1 S %ZTLOOP=%ZTLOOP#16 D CHECK,SCHQ,IDLE:%ZTCHK
|
---|
| 7 | S %ZTFALL="" G LOOP
|
---|
| 8 | ;
|
---|
| 9 | CHECK ;LOOP--Check Status And Update Loop Data
|
---|
| 10 | ;Do CHECK if sent a new job or %ZTLOOP=0.
|
---|
| 11 | Q:%ZTLOOP&$G(%ZTCHK)
|
---|
| 12 | I $D(^%ZTSCH("STOP","MGR",%ZTPAIR)) G HALT^%ZTM0
|
---|
| 13 | S ^%ZTSCH("RUN")=$H,ZTPAIR="",%ZTIME=$$H3($H)
|
---|
| 14 | I $D(^%ZTSCH("WAIT","MGR"))#2 D STATUS("WAIT","Taskman Waiting") H 5 G CHECK
|
---|
| 15 | ;
|
---|
| 16 | I $D(^%ZTSCH("UPDATE",$J))[0 D UPDATE^%ZTM5
|
---|
| 17 | I %ZTVLI D STATUS("PAUSE","Logons Inhibited") H 60 G CHECK ;Set in %ZTM5
|
---|
| 18 | I @%ZTNLG D INHIBIT^%ZTM5(1),STATUS("PAUSE","No Signons Allowed") H 60 G CHECK
|
---|
| 19 | I $G(^%ZIS(14.5,"LOGON",%ZTVOL)) D INHIBIT^%ZTM5(0) ;Check field
|
---|
| 20 | I $D(ZTREQUIR)#2 D STATUS("PAUSE","Required link to "_ZTREQUIR_" is down.") H 60 D REQUIR^%ZTM5 G CHECK
|
---|
| 21 | ;
|
---|
| 22 | I $D(^%ZTSCH("LINK"))#2,$$DIFF($H,^("LINK"))>900 D LINK^%ZTM3
|
---|
| 23 | ;
|
---|
| 24 | S %ZTRUN=%ZTVMJ>$$ACTJ^%ZOSV ;Check for job limit
|
---|
| 25 | ;
|
---|
| 26 | I %ZTPFLG("BAL")]"" D I ZTOVERLD G CHECK
|
---|
| 27 | . S ZTOVERLD=0
|
---|
| 28 | . Q:%ZTPFLG("LBT")>%ZTIME S %ZTPFLG("LBT")=%ZTIME+%ZTPFLG("BI")
|
---|
| 29 | . D BALANCE^%ZTM6 Q:'ZTOVERLD
|
---|
| 30 | . D STATUS("BALANCE","Waiting to balance the load.")
|
---|
| 31 | . ;Start submanagers for C list work
|
---|
| 32 | . I $D(^%ZTSCH("C",%ZTPAIR))>9,%ZTRUN D NEWJOB(%ZTUCI,%ZTVOL,"")
|
---|
| 33 | . N T F T=1:1:%ZTPFLG("BI") H 1 Q:$$STOPWT^%ZTM6()
|
---|
| 34 | . Q
|
---|
| 35 | ;
|
---|
| 36 | I %ZTRUN D STATUS("RUN","Main Loop")
|
---|
| 37 | I '%ZTRUN D STATUS("RUN","Taskman Job Limit Reached"),CHECK^%ZTM6
|
---|
| 38 | Q
|
---|
| 39 | ;
|
---|
| 40 | STATUS(ST,MSG) ;Record TM status
|
---|
| 41 | S ^%ZTSCH("STATUS",$J)=$H_"^"_ST_"^"_$G(%ZTPAIR)_"^"_MSG
|
---|
| 42 | Q
|
---|
| 43 | ;
|
---|
| 44 | TLOCK(M,T) ;Lock a time node
|
---|
| 45 | I M>0 L +^%ZTSCH(ZTDTH):0 Q $T
|
---|
| 46 | L -^%ZTSCH(ZTDTH) Q
|
---|
| 47 | ;
|
---|
| 48 | SCHQ ;LOOP--Check Schedule List
|
---|
| 49 | S %ZTIME=$$H3($H),ZTDTH=0,%ZTCHK=1,IO=""
|
---|
| 50 | S1 S ZTDTH=$O(^%ZTSCH(ZTDTH)),ZTSK=0 Q:(ZTDTH>%ZTIME) Q:('ZTDTH)!(ZTDTH'?1.N) I +ZTDTH<0 K ^%ZTSCH(ZTDTH) G S1
|
---|
| 51 | I '$$TLOCK(1,ZTDTH) G S1
|
---|
| 52 | S2 S ZTSK=$O(^%ZTSCH(ZTDTH,ZTSK)) I ZTSK="" D TLOCK(-1,ZTDTH) G S1
|
---|
| 53 | S ZTST=$G(^%ZTSCH(ZTDTH,ZTSK))
|
---|
| 54 | ;Get task lock then release time lock
|
---|
| 55 | L +^%ZTSK(ZTSK):0 G S2:'$T
|
---|
| 56 | K ^%ZTSCH(ZTDTH,ZTSK) D TLOCK(-1,ZTDTH)
|
---|
| 57 | ;Count tasks
|
---|
| 58 | S %ZTMON(%ZTMON)=$G(%ZTMON(%ZTMON))+1
|
---|
| 59 | I $D(^%ZTSK(ZTSK,0))[0 D TSKSTAT("I") L -^%ZTSK(ZTSK) G S2
|
---|
| 60 | I $L($P($G(^%ZTSK(ZTSK,.1)),U,10)) D TSKSTAT("D","Stopped") L -^%ZTSK(ZTSK) G S2
|
---|
| 61 | D ^%ZTM1
|
---|
| 62 | I %ZTREJCT L -^%ZTSK(ZTSK) G S2
|
---|
| 63 | ;
|
---|
| 64 | SEND ;Send Task To Submanager
|
---|
| 65 | S %ZTCHK=0,ZTPAIR=""
|
---|
| 66 | I ZTDVOL'=%ZTVOL D XLINK^%ZTM2 G:'ZTJOBIT SCHX
|
---|
| 67 | ;Clear before job cmd
|
---|
| 68 | I (ZTYPE'="C")&(%ZTNODE[ZTNODE) D
|
---|
| 69 | . D TSKSTAT(3,"Placed on JOB List")
|
---|
| 70 | . S ^%ZTSCH("JOB",ZTDTH,ZTSK)=IO ;No other lock on JOB
|
---|
| 71 | E D
|
---|
| 72 | . D TSKSTAT("M","Placed on C List")
|
---|
| 73 | . S ZTPAIR=ZTDVOL_$S($L(ZTNODE):":"_ZTNODE,1:"")
|
---|
| 74 | . S ^%ZTSCH("C",ZTPAIR,ZTDTH,ZTSK)=IO
|
---|
| 75 | ;
|
---|
| 76 | L -^%ZTSK(ZTSK)
|
---|
| 77 | ;
|
---|
| 78 | ;I '$D(^%ZTSCH("STOP","SUB",%ZTPAIR)),'$$OOS(ZTPAIR) D NEWJOB(ZTUCI,ZTDVOL,ZTNODE,ZTYPE,ZTPAIR)
|
---|
| 79 | ;I '$D(^%ZTSCH("STOP","SUB",%ZTPAIR)),(ZTYPE="C"!(%ZTRUN&$$NEWSUB)),'$$OOS(ZTPAIR) D
|
---|
| 80 | ;. I 1 X %ZTJOB H %ZTSLO I '$T X %ZTJOB H %ZTSLO
|
---|
| 81 | ;. Q
|
---|
| 82 | I (ZTYPE="C"!(%ZTRUN&$$NEWSUB)),'$$OOS(ZTPAIR) D NEWJOB(ZTUCI,ZTDVOL,ZTNODE)
|
---|
| 83 | SCHX L K ZTREP Q
|
---|
| 84 | ;
|
---|
| 85 | IDLE ;LOOP--DEV Node Maintenance; Backup JOB Commands
|
---|
| 86 | S (ZTREC,ZTCVOL)="" H 1 ;This is the main hang
|
---|
| 87 | I %ZTMON("NEXT")'>%ZTIME D MON ;See if time to update %ZTMON
|
---|
| 88 | Q:'%ZTRUN ;Only do IDLE work if not at job limit
|
---|
| 89 | I $D(^%ZTSCH("STOP","MGR",%ZTPAIR)) Q
|
---|
| 90 | ;job off a new submanager if MIN count < # SUBs
|
---|
| 91 | I $$NEWSUB D NEWJOB(%ZTUCI,%ZTVOL,"")
|
---|
| 92 | L +^%ZTSCH("IDLE",%ZTPAIR):0 Q:'$T D IDLE1 L -^%ZTSCH("IDLE",%ZTPAIR)
|
---|
| 93 | Q
|
---|
| 94 | IDLE1 ;only proceed with idle work if 60 seconds since last check
|
---|
| 95 | I $$DIFF(%ZTIME,^%ZTSCH("IDLE"),1)<60 Q
|
---|
| 96 | I %ZTPFLG("XUSCNT") D TOUCH^XUSCNT
|
---|
| 97 | D I1,I2,I5,I6
|
---|
| 98 | S ^%ZTSCH("IDLE")=%ZTIME
|
---|
| 99 | Q
|
---|
| 100 | ;
|
---|
| 101 | I1 ;clear out old DEV nodes
|
---|
| 102 | N X,%ZTIO S %ZTIO=""
|
---|
| 103 | F S %ZTIO=$O(^%ZTSCH("DEV",%ZTIO)) Q:%ZTIO="" L ^%ZTSCH("DEV",%ZTIO):0 I $T D L -^%ZTSCH("DEV",%ZTIO)
|
---|
| 104 | . S X=$G(^%ZTSCH("DEV",%ZTIO)) Q:'$L(X)
|
---|
| 105 | . I $$DIFF(%ZTIME,X,1)>120 K ^%ZTSCH("DEV",%ZTIO)
|
---|
| 106 | . Q
|
---|
| 107 | Q
|
---|
| 108 | ;
|
---|
| 109 | I2 ;job new submanagers cross-volume for each unfinished C list
|
---|
| 110 | I $D(^%ZTSCH("C")) D
|
---|
| 111 | . N Y,ZTUCI,ZTVOL,ZTNODE,$ETRAP,$ESTACK S $ET="S $EC="""" D ERCL^%ZTM2"
|
---|
| 112 | . S ZTVOL="" F S ZTVOL=$O(^%ZTSCH("C",ZTVOL)) Q:ZTVOL="" D
|
---|
| 113 | .. I $O(^%ZTSCH("C",ZTVOL,0))="" Q
|
---|
| 114 | .. S ZTNODE="",ZTDVOL=ZTVOL S:ZTDVOL[":" ZTNODE=$P(ZTDVOL,":",2),ZTDVOL=$P(ZTDVOL,":")
|
---|
| 115 | .. S X=$G(^%ZTSCH("C",ZTVOL))
|
---|
| 116 | .. I $D(^%ZTSCH("LINK",ZTDVOL))!(X>9)!$$OOS(ZTVOL) Q
|
---|
| 117 | .. S ^%ZTSCH("C",ZTVOL)=X+1
|
---|
| 118 | .. S ZTUCI=$O(^%ZIS(14.6,"AV",ZTDVOL,""))
|
---|
| 119 | .. D NEWJOB(ZTUCI,ZTDVOL,ZTNODE)
|
---|
| 120 | .. Q
|
---|
| 121 | . Q
|
---|
| 122 | Q
|
---|
| 123 | ;
|
---|
| 124 | I4 ;job off a new submanager if the Job List still has tasks
|
---|
| 125 | I $D(^%ZTSCH("JOB"))>9 D NEWJOB(%ZTUCI,%ZTVOL,"")
|
---|
| 126 | Q
|
---|
| 127 | ;
|
---|
| 128 | I5 ;Clean up %ZTSCH
|
---|
| 129 | S ZTDTH="0,0" F S ZTDTH=$O(^%ZTSCH(ZTDTH)) Q:ZTDTH'["," D
|
---|
| 130 | . N ZTSK,X L +^%ZTSCH(ZTDTH):0 Q:'$T
|
---|
| 131 | . S ZTSK=$O(^%ZTSCH(ZTDTH,0)) I ZTSK>0 S X=^(ZTSK),^%ZTSCH($$H3(ZTDTH),ZTSK)=X K ^%ZTSCH(ZTDTH,ZTSK)
|
---|
| 132 | . L -^%ZTSCH(ZTDTH)
|
---|
| 133 | . Q
|
---|
| 134 | Q
|
---|
| 135 | ;
|
---|
| 136 | I6 ;Check on persistent jobs.
|
---|
| 137 | S ZTSK=0 F S ZTSK=$O(^%ZTSCH("TASK",ZTSK)) Q:ZTSK'>0 D:$D(^%ZTSCH("TASK",ZTSK,"P"))
|
---|
| 138 | . L +^%ZTSCH("TASK",ZTSK):0 E Q ;Still running
|
---|
| 139 | . L -^%ZTSCH("TASK",ZTSK)
|
---|
| 140 | . D REQP^%ZTLOAD3(ZTSK) ;START NEW TASK.
|
---|
| 141 | K %ZTVS Q
|
---|
| 142 | ;
|
---|
| 143 | MON ;Set Next %ZTMON each Hour
|
---|
| 144 | S %ZTMON=$P($H,",",2)\3600,%ZTMON(%ZTMON)=0
|
---|
| 145 | S %ZTMON("NEXT")=($H*86400)+(%ZTMON+1*3600)
|
---|
| 146 | D HOUR^%ZTM5
|
---|
| 147 | I %ZTMON("DAY")<+$H D DAY^%ZTM5
|
---|
| 148 | Q
|
---|
| 149 | ;
|
---|
| 150 | NEWJOB(ZTUCI,ZTDVOL,ZTNODE) ;Start a new Job
|
---|
| 151 | S ZTUCI=$G(ZTUCI),ZTDVOL=$G(ZTDVOL),ZTNODE=$G(ZTNODE)
|
---|
| 152 | X %ZTJOB H %ZTSLO ;If job doesn't work, will catch next time.
|
---|
| 153 | Q
|
---|
| 154 | ;
|
---|
| 155 | DIFF(N,O,T) ;Diff in sec.
|
---|
| 156 | Q:$G(T) N-O ;For new seconds times
|
---|
| 157 | Q N-O*86400-$P(O,",",2)+$P(N,",",2)
|
---|
| 158 | ;
|
---|
| 159 | OOS(BV) ;Check if Box-Volume is Out Of Service, Return 1 if OOS.
|
---|
| 160 | Q:BV="" 0 N %
|
---|
| 161 | S %=$O(^%ZIS(14.7,"B",BV,0)),%=$G(^%ZIS(14.7,+%,0))
|
---|
| 162 | Q:%="" 1 Q $P(%,U,11)=1
|
---|
| 163 | ;
|
---|
| 164 | H3(%) ;Convert $H to seconds.
|
---|
| 165 | Q 86400*%+$P(%,",",2)
|
---|
| 166 | H0(%) ;Covert from seconds to $H
|
---|
| 167 | Q (%\86400)_","_(%#86400)
|
---|
| 168 | SUBOK() ;Check if sub's are starting, return 1 if OK
|
---|
| 169 | S ^%ZTSCH("SUB",%ZTPAIR,0)=($G(^%ZTSCH("SUB",%ZTPAIR,0))+1)_"^"_$H
|
---|
| 170 | Q ^%ZTSCH("SUB",%ZTPAIR,0)<10
|
---|
| 171 | ;
|
---|
| 172 | NEWSUB() ;See if we need a new submanager
|
---|
| 173 | N SUBS
|
---|
| 174 | L +^%ZTSCH("SUB",%ZTPAIR):0 S SUBS=^%ZTSCH("SUB",%ZTPAIR)
|
---|
| 175 | L -^%ZTSCH("SUB",%ZTPAIR)
|
---|
| 176 | I SUBS<%ZTPFLG("MINSUB") Q 1
|
---|
| 177 | Q 0
|
---|
| 178 | ;
|
---|
| 179 | TSKSTAT(CODE,MSG) ; Update task's status
|
---|
| 180 | S $P(^%ZTSK(ZTSK,.1),U,1,3)=$G(CODE)_U_$H_U_$G(MSG)
|
---|
| 181 | Q
|
---|