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

ZTM6.m

Go to the documentation of this file.
  1. %ZTM6 ;SEA/RDS-TaskMan: Manager, Part 8 (Load Balancing) ;07/01/08 15:46
  1. ;;8.0;KERNEL;**23,118,127,136,355,446**;JUL 10, 1995;Build 35
  1. ;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. BALANCE ;CHECK^%ZTM--determine whether cpu should wait for balance
  1. ;Return ZTOVERLD =1 if need to wait, 0 to run
  1. ;The TM with the largest value sets ^%ZTSCH("LOAD")=who^value^when p446
  1. ;If your value is greater or equal then you run.
  1. ;If your value is less you wait unless you set LOAD then you run.
  1. ;Tell sub-managers by setting ^%ZTSCH("LOADA",%ZTPAIR)=run^value^time^$J
  1. ;Use %ZTLKTM for lock timeout
  1. S ZTOVERLD=0 ;p446 Default
  1. TSTART
  1. L +^%ZTSCH("LOAD"):(%ZTLKTM+1) E TROLLBACK Q ;p446 Keep working if can't get lock
  1. N X,ZTIME,ZTLEFT,ZTPREV
  1. N $ES,$ET S $ET="Q:$ES>0 D ERR^%ZTM6"
  1. S ZTOVERLD=0,ZTPREV=+$P($G(^%ZTSCH("LOAD")),"^",2),ZTIME=$$H3($H)
  1. S @("ZTLEFT="_%ZTPFLG("BAL"))
  1. S ZTIME=$$H3($H),ZTOVERLD=$$COMPARE(%ZTPAIR,ZTLEFT,ZTPREV)
  1. ;If we are RUNNING have other submanagers wait
  1. I 'ZTOVERLD D
  1. . S X="" F S X=$O(^%ZTSCH("LOADA",X)) Q:X="" S $P(^(X),"^")=1 ;Have others wait
  1. . S ^%ZTSCH("LOAD")=%ZTPAIR_"^"_ZTLEFT_"^"_ZTIME
  1. ;Now set a value that is used by our %ZTMS to run/wait also
  1. S ^%ZTSCH("LOADA",%ZTPAIR)=ZTOVERLD_"^"_ZTLEFT_"^"_ZTIME_"^"_$J
  1. L -^%ZTSCH("LOAD")
  1. TCOMMIT
  1. Q
  1. ;
  1. STOPWT() ;See if we should stop Balance wait, Called from %ZTM.
  1. L +^%ZTSCH("LOAD"):%ZTLKTM Q:'$T 1 ;Run if can't get lock
  1. N I,J S I="",J=1
  1. F S I=$O(^%ZTSCH("LOADA",I)) Q:I="" I '^(I) S J=0
  1. L -^%ZTSCH("LOAD")
  1. Q J ;Return: 1 stop waiting, 0 keep waiting. (Someone is in run state)
  1. ;
  1. CHECK ;Called when job limit reached.
  1. ;If not doing balancing, remove node and quit
  1. N I,J,K
  1. I %ZTPFLG("BAL")="" K ^%ZTSCH("LOADA",%ZTPAIR) Q
  1. L +^%ZTSCH("LOAD"):%ZTLKTM Q:'$T ;Get it next time
  1. ;If at job limit see if sub-managers should run
  1. S I=$P($G(^%ZTSCH("LOAD")),"^",2),J=$P($G(^%ZTSCH("LOADA",%ZTPAIR)),"^",2)
  1. S K=(J<I),$P(^%ZTSCH("LOADA",%ZTPAIR),"^",1)=K
  1. L -^%ZTSCH("LOAD")
  1. Q
  1. ;
  1. COMPARE(ID,ZTLEFT,ZTPREV) ;
  1. ;BALANCE--compare our cpu capacity left to that of previous checker
  1. ;input: cpu name, cpu capacity left, cpu capacity of previous checker
  1. ;output: whether current cpu should wait, 0=run, 1=wait
  1. N X
  1. I ZTLEFT'<ZTPREV Q 0
  1. S X=^%ZTSCH("LOAD")
  1. I $P(X,"^",3)+(%ZTPFLG("BI")+5)<ZTIME Q 0
  1. Q $P(X,"^")'[ID
  1. ;
  1. ERR ;Clean up if error
  1. S %ZTPFLG("EBAL")=1+$G(%ZTPFLG("EBAL")),ZTOVERLD=0
  1. I $G(%ZTPFLG("EBAL"))>10 D ^%ZTER S %ZTPFLG("BAL")="" ;Only stop after 10 errors ;p446
  1. S $EC=""
  1. ;TROLLBACK
  1. L -^%ZTSCH("LOAD")
  1. Q
  1. ;
  1. H3(%) ;Convert $H to seconds
  1. Q 86400*%+$P(%,",",2)
  1. ;
  1. VXD(BIAS) ;--algorithm for VAX DSM
  1. ;Capacity Left=Available Jobs + BIAS
  1. Q $$AVJ^%ZOSV()+$G(BIAS)
  1. ;
  1. MSM4() ;Use MSMv4 LAT calcuation
  1. N MAXJOB,CURJOB
  1. X "S MAXJOB=$V($V(3,-5),-3,0),CURJOB=$V(168,-4,2)"
  1. Q MAXJOB-CURJOB*255\MAXJOB
  1. ;
  1. CACHE1(BIAS) ;Use available jobs
  1. N CUR,MAX
  1. Q $$AVJ^%ZOSV()+$G(BIAS)
  1. ;
  1. CACHE2(%COM,%LOG) ;Cache, Pull metric data
  1. N TMP,$ET
  1. S $ETRAP="S $ECODE="""" Q ZTPREV"
  1. S %LOG=$G(%LOG,"VISTA$METRIC")
  1. I $L($G(%COM)) S TMP=$ZF(-1,%COM)
  1. Q $ZF("TRNLNM",%LOG)
  1. ;
  1. RNDRBN() ;Round Robin
  1. ;value^node^time
  1. N R,R2
  1. L +^%ZTSCH("RNDRBN"):$G(%ZTLKTM,1)
  1. S R=$G(^%ZTSCH("RNDRBN"))
  1. I $P(R,U,2)=%ZTPAIR S R2=+R G RX
  1. I ZTIME<$P(R,U,3) S R2=R-1 G RX
  1. S R2=R+2#512,^%ZTSCH("RNDRBN")=R2_U_%ZTPAIR_U_(ZTIME+%ZTPFLG("BI"))
  1. RX L -^%ZTSCH("RNDRBN")
  1. Q R2