/$ HSCLOAD010.A+P HSCLOAD010.ABACKUP/NOASSIST/NODISMOUNT/COMMENT=VAX/VMS SPKITBLD Procedure/INTER/LOG/VERIFY $1$DIA2:[HSC.A]*.*; $1$DIA2:[HSC]HSCLOAD010.A/LABEL=(HSCLOAD)/SAVE/BLOCK=9000/GROUP=25VAX/VMS SPKITBLD Procedure BUCKLEY @#4<^V6.1 _DEWEY::  _$1$DIA2: V6.1 $I*[HSC.A]BUILD_DISK_CABLE.COM;33+, .(/ 4n((-Z0123KPWO)5"6H7LR3<^89GHJ  $!SET NOVERI$!REQUIRED PROGRAMS@$!DCLHSC SENDS A COMMAND TO THE HSC AND RETURNS THE HSC RESPONSEO$!PREFER SETS AND FORCES THE PREFERRED HSC PATH (ADDED TO DCLTABLES AT INSTALL)"$DCLHSC :== $SYS$SYSTEM:DCLHSC.EXE$SAY :== "WRITE SYS$OUTPUT"$SAYF :== "WRITE FILE"$SAYD :== "WRITE DIFF"$!>$!CHECK IF THE FYDRIVER IS LOADED AND DIAGNOSE PRIV IS ENABLED$!I$IF ((F$GETDVI("FYA0:","EXISTS")) .AND. (F$PRIVILEGE("DIAGNOSE"))) THEN - GOTO FYDRIVER_OK>$SAY "THIS PROCEDURE REQUIRES THAT THE FYDRIVER IS LOADED AND"E$SAY "THE ACCOUNT RUNNING THE PROCEDURE MUST HAVE DIAGNOSE PRIVILEGE"2$SAY "THE SYSGEN COMMAND TO LOAD THE FYDRIVER IS:".$SAY "SYSGEN>CONNECT FYA0 /NOADAPTOR=FYDRIVER"$EXIT 2 $FYDRIVER_OK:$NODE = F$GETSYI("NODENAME")/$!CREATE FILE CONTAINING OUTPUT OF "SHOW DEV D""$SHOW DEVICE/OUTPUT=DISKLIST.TMP D$OPEN DISKLIST DISKLIST.TMP$OPEN/WRITE ORG HSCLOAD_ORG.COM$OPEN/WRITE ALT HSCLOAD_ALT.COM#$OPEN/WRITE CLEAR HSCLOAD_CLEAR.COM&$OPEN/WRITE ORGF HSCLOAD_ORG_FORCE.COM&$OPEN/WRITE ALTF HSCLOAD_ALT_FORCE.COM$!1$!LINES TO RECORD OUTPUT FROM THE SYSMAN COMMANDS$!'$WRITE ORG "$ASSIGN ORG.LOG SYS$OUTPUT"$WRITE ORG "$SET VERIFY"3$WRITE ORG "$@SYS$MANAGER:HSC_LOADING_LOGICALS.COM"'$WRITE ALT "$ASSIGN ALT.LOG SYS$OUTPUT"$WRITE ALT "$SET VERIFY"3$WRITE ALT "$@SYS$MANAGER:HSC_LOADING_LOGICALS.COM")$WRITE ORGF "$ASSIGN ORGF.LOG SYS$OUTPUT"$WRITE ORGF "$SET VERIFY"4$WRITE ORGF "$@SYS$MANAGER:HSC_LOADING_LOGICALS.COM")$WRITE ALTF "$ASSIGN ALTF.LOG SYS$OUTPUT"$WRITE ALTF "$SET VERIFY"4$WRITE ALTF "$@SYS$MANAGER:HSC_LOADING_LOGICALS.COM"+$WRITE CLEAR "$ASSIGN CLEAR.LOG SYS$OUTPUT"$WRITE CLEAR "$SET VERIFY"5$WRITE CLEAR "$@SYS$MANAGER:HSC_LOADING_LOGICALS.COM"$!8$!END OF LINES TO RECORD OUTPUT FROM THE SYSMAN COMMANDS$!-$WRITE CLEAR "$NODE = F$GETSYI(""NODENAME"")" $HSCLST = ""$CNT = 0$!SKIP 3 HEADER LINES3$READ/END=DONE_DISKLIST/ERROR=EROR DISKLIST DISKREC3$READ/END=DONE_DISKLIST/ERROR=EROR DISKLIST DISKREC3$READ/END=DONE_DISKLIST/ERROR=EROR DISKLIST DISKREC $READREC:!$!READ FILE TO EXTRACT DISK NAMES($READ/END=DONE_DISKLIST DISKLIST DISKREC"$VOLUME = F$EXTRACT(48,15,DISKREC)L$DEVICE = F$EDIT("''F$EXTRACT(0,F$LOCATE(" ",DISKREC),DISKREC)'","COMPRESS")$!SH SYM DEVICE($IF (DEVICE .EQS. " ") THEN GOTO READREC'$IF (DEVICE .EQS. "") THEN GOTO READREC;$IF(.NOT. F$GETDVI("''DEVICE'","EXISTS")) THEN GOTO READREC,$AHT = F$GETDVI("''DEVICE'","ALT_HOST_TYPE")-$AHA = F$GETDVI("''DEVICE'","ALT_HOST_AVAIL"),$AHN = F$GETDVI("''DEVICE'","ALT_HOST_NAME")($HT = F$GETDVI("''DEVICE'","HOST_TYPE"))$HA = F$GETDVI("''DEVICE'","HOST_AVAIL")($HN = F$GETDVI("''DEVICE'","HOST_NAME")8$!SAY "''DEVICE' ''AHA' ''AHN' ''AHT' ''HA' ''HN' ''HT'" $AHSC = "" $HSC = "".$IF ((.NOT. HA) .OR. (HT .EQS. "VAX")) .AND. -8 ((.NOT. AHA) .OR. (AHT .EQS. "VAX")) THEN GOTO READREC$CNT = CNT + 1:$DEVICE'CNT' = F$EXTRACT(0,15,"''DEVICE' "))$AHN'CNT' = F$EXTRACT(0,6,"''AHN' ")'$HN'CNT' = F$EXTRACT(0,6,"''HN' ")9$IF ((.NOT. AHA) .OR. (AHT .EQS. "VAX")) THEN GOTO NOAHSC'$IF ("''AHN'" .EQS "") THEN GOTO NOAHSC $AHSC = AHN$AHSC'CNT' = AHSC$HSCLEN = F$LENGTH(HSCLST)N$IF (F$LOCATE("''AHSC'",HSCLST) .EQ. HSCLEN) THEN HSCLST = "''HSCLST'''AHSC',"7$IF(.NOT. F$GETDVI("''DEVICE'","MNT")) THEN GOTO NOAHSC+$WRITE ALT "$PREFER ''DEVICE'/HOST=''AHSC'"2$WRITE ALTF "$PREFER ''DEVICE'/HOST=''AHSC'/FORCE"$NOAHSC:6$IF ((.NOT. HA) .OR. (HT .EQS. "VAX")) THEN GOTO NOHSC%$IF ("''HN'" .EQS "") THEN GOTO NOHSC $HSC = HN$HSC'CNT' = HSC$HSCLEN = F$LENGTH(HSCLST)L$IF (F$LOCATE("''HSC'",HSCLST) .EQ. HSCLEN) THEN HSCLST = "''HSCLST'''HSC',"6$IF(.NOT. F$GETDVI("''DEVICE'","MNT")) THEN GOTO NOHSC*$WRITE ORG "$PREFER ''DEVICE'/HOST=''HSC'"1$WRITE ORGF "$PREFER ''DEVICE'/HOST=''HSC'/FORCE"$NOHSC:'$IF(F$GETDVI("''DEVICE'","MNT")) THEN -, WRITE CLEAR "$PREFER ''DEVICE'/HOST='NODE'" $goto readrec$DONE_DISKLIST:$CLOSE DISKLIST$DELEX DISKLIST.TMP;*$!+$!TURN OFF SYSMAN VERIFY IF WE TURNED IT ON$!$WRITE ORG "$SET NOVERIFY"$WRITE ALT "$SET NOVERIFY"$WRITE ORGF "$SET NOVERIFY"$WRITE ALTF "$SET NOVERIFY"$WRITE CLEAR "$SET NOVERIFY"$!$!END OF SYSMAN VERIFY COMMANDS$! $CLOSE ORG $CLOSE ALT $CLOSE CLEAR $CLOSE ORGF $CLOSE ALTF$!$!STATEMENT FOR TESTING$!GOTO MAKE_FILE$!B$!GO OUT TO THE HSC AND GET THE CURRENT DISK REQUESTOR INFORMATION$!,$IF ("''HSCLST'" .EQS. "") THEN GOTO NO_HSCS $HSCCNT = 0 $HSCLOOP:,$HSCNAME = F$ELEMENT(HSCCNT,",","''HSCLST'")$SH SYM HSCNAME*$IF (HSCNAME .EQS. ",") THEN GOTO HSC_DONE*$IF (HSCNAME .EQS. " ") THEN GOTO HSC_DONE)$IF (HSCNAME .EQS. "") THEN GOTO HSC_DONE3$ASSIGN/USER 'HSCNAME'_CURRENT_DISKS.TXT SYS$OUTPUT$DCLHSC 'HSCNAME' SHOW DISK#$!TYPE 'HSCNAME'_CURRENT_DISKS.TXT$HSCCNT = HSCCNT + 1 $GOTO HSCLOOP $HSC_DONE:$!'$!PUT THE DISKS OVER TO THE OTHER PATH N$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!N$!THIS MAY HANG WORKSTATIONS ON A MI CLUSTER WITH DISKS SHOWING MEDIA OFF LINE$!N$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)$!USE SYSMAN TO SET THE PATH ON ALL NODES $MC SYSMANSET ENVIRONMENT/CLUSTERDO @HSCLOAD_ALT.COMEXIT;$!WAIT THIRTY SECONDS TO BE SURE THE PATH IS SET EVERYWHERE$WAIT 00:00:30$!FORCE THE PATH TO CHANGE$@HSCLOAD_ALT_FORCE.COM$WAIT 00:00:05$@HSCLOAD_ALT_FORCE.COM;$!WAIT 10 SECONDS TO BE SURE THE PATH IS CHANGED EVERYWHERE$WAIT 00:00:10$!K$!GO OUT TO THE HSC AND GET THE DISK REQUESTOR INFORMATION AFTER THE SWITCH$! $HSCCNT = 0 $HSCLOOP2:,$HSCNAME = F$ELEMENT(HSCCNT,",","''HSCLST'")$!SH SYM HSCNAME+$IF (HSCNAME .EQS. ",") THEN GOTO HSC_DONE2+$IF (HSCNAME .EQS. " ") THEN GOTO HSC_DONE2*$IF (HSCNAME .EQS. "") THEN GOTO HSC_DONE2/$ASSIGN/USER 'HSCNAME'_ALT_DISKS.TXT SYS$OUTPUT$DCLHSC 'HSCNAME' SHOW DISK$!TYPE 'HSCNAME'_ALT_DISKS.TXT$HSCCNT = HSCCNT + 1$GOTO HSCLOOP2 $HSC_DONE2:$!*$!PUT THE DISKS BACK TO THE ORIGINAL PATH $!)$!USE SYSMAN TO SET THE PATH ON ALL NODES $MC SYSMANSET ENVIRONMENT/CLUSTERDO @HSCLOAD_ORG.COMEXIT;$!WAIT THIRTY SECONDS TO BE SURE THE PATH IS SET EVERYWHERE$WAIT 00:00:30$!FORCE THE PATH TO CHANGE BACK$@HSCLOAD_ORG_FORCE.COM$WAIT 00:00:05$@HSCLOAD_ORG_FORCE.COM$!N$!CLEAR OUT THE PREFERRED PATH INFO TO CLEAR WORKSTATION DISKS IN A MI CLUSTER$!)$!USE SYSMAN TO SET THE PATH ON ALL NODES $MC SYSMANSET ENVIRONMENT/CLUSTERDO @HSCLOAD_CLEAR.COMEXIT$!K$!GO OUT TO THE HSC AND GET THE DISK REQUESTOR INFORMATION AFTER THE SWITCHL$!IN CASE OUT SWITCH TO ALTERNATE WAS NOT A CHANGE BUT THE SWITCH TO ORG WAS$! $HSCCNT = 0 $HSCLOOP3:,$HSCNAME = F$ELEMENT(HSCCNT,",","''HSCLST'")$!SH SYM HSCNAME+$IF (HSCNAME .EQS. ",") THEN GOTO HSC_DONE3+$IF (HSCNAME .EQS. " ") THEN GOTO HSC_DONE3*$IF (HSCNAME .EQS. "") THEN GOTO HSC_DONE32$ASSIGN/USER 'HSCNAME'_SWITCH_DISKS.TXT SYS$OUTPUT$DCLHSC 'HSCNAME' SHOW DISK"$!TYPE 'HSCNAME'_SWITCH_DISKS.TXT$HSCCNT = HSCCNT + 1$GOTO HSCLOOP3 $HSC_DONE3:$!I$!NOW PULL TOGETHER ALL OF THE INFO TO CREATE THE DISK_HSC_CABLE.DAT FILE$! $MAKE_FILE: $HSCCNT = 0 $DCNT = 0 $HSCLOOP4:,$HSCNAME = F$ELEMENT(HSCCNT,",","''HSCLST'")$!SH SYM HSCNAME+$IF (HSCNAME .EQS. ",") THEN GOTO HSC_DONE4+$IF (HSCNAME .EQS. " ") THEN GOTO HSC_DONE4*$IF (HSCNAME .EQS. "") THEN GOTO HSC_DONE43$OPEN/ERROR=NO_CUR CUR 'HSCNAME'_CURRENT_DISKS.TXT $READ/END=DONE_CUR CUR CURREC $CUR_LOOP:$READ/END=DONE_CUR CUR CURREC($CURREC = F$EDIT("''CURREC'","COMPRESS")$CURLEN = F$LENGTH(CURREC))$IF (CURREC .EQS. " ") THEN GOTO DONE_CUR<$IF (F$LOCATE("Disk",CURREC) .NE. CURLEN) THEN GOTO DONE_CUR$D = "''HSCNAME'"0$U = F$EDIT("''F$ELEMENT(1," ",CURREC)'","TRIM")0$R = F$EDIT("''F$ELEMENT(2," ",CURREC)'","TRIM")0$P = F$EDIT("''F$ELEMENT(3," ",CURREC)'","TRIM")($!MAKE SURE ITS NOT A DUPLICATE HSC/UNIT $TCNT = 0 $TEMPLOOP1:$TCNT = TCNT + 1-$IF (TCNT .GT. DCNT) THEN GOTO DONE_TEMPLOOP1K$IF ((D .EQS. DISKHSC'TCNT') .AND. (U .EQS. UNIT'TCNT')) THEN GOTO CUR_LOOP$GOTO TEMPLOOP1$DONE_TEMPLOOP1:fH$ HSCLOAD010.A Z[HSC.A]BUILD_DISK_CABLE.COM;33n(m"$DCNT = DCNT + 1$DISKHSC'DCNT' = D$UNIT'DCNT' = U$REQ'DCNT' = R$PORT'DCNT' = P#$!SAY "D ''D' U ''U' R ''R' P ''P'"$GOTO CUR_LOOP $DONE_CUR: $CLOSE CUR $SET NOON*$PURGE/KEEP=3 'HSCNAME'_CURRENT_DISKS.TXT $SET ON$NO_CUR:.$OPEN/ERROR=NO_ALT ALT 'HSCNAME'_ALT_DISKS.TXT$READ/END=DONE_ALT ALT ALTREC $ALT_LOOP:$READ/END=DONE_ALT ALT ALTREC($ALTREC = F$EDIT("''ALTREC'","COMPRESS")$ALTLEN = F$LENGTH(ALTREC))$IF (ALTREC .EQS. " ") THEN GOTO DONE_ALT<$IF (F$LOCATE("Disk",ALTREC) .NE. ALTLEN) THEN GOTO DONE_ALT$D = "''HSCNAME'"0$U = F$EDIT("''F$ELEMENT(1," ",ALTREC)'","TRIM")0$R = F$EDIT("''F$ELEMENT(2," ",ALTREC)'","TRIM")0$P = F$EDIT("''F$ELEMENT(3," ",ALTREC)'","TRIM")($!MAKE SURE ITS NOT A DUPLICATE HSC/UNIT $TCNT = 0 $TEMPLOOP2:$TCNT = TCNT + 1-$IF (TCNT .GT. DCNT) THEN GOTO DONE_TEMPLOOP2K$IF ((D .EQS. DISKHSC'TCNT') .AND. (U .EQS. UNIT'TCNT')) THEN GOTO ALT_LOOP$GOTO TEMPLOOP2$DONE_TEMPLOOP2:$DCNT = DCNT + 1$DISKHSC'DCNT' = D$UNIT'DCNT' = U$REQ'DCNT' = R$PORT'DCNT' = P#$!SAY "D ''D' U ''U' R ''R' P ''P'"$GOTO ALT_LOOP $DONE_ALT: $CLOSE ALT $SET NOON&$PURGE/KEEP=3 'HSCNAME'_ALT_DISKS.TXT $SET ON$NO_ALT:7$OPEN/ERROR=NO_SWITCH SWITCH 'HSCNAME'_SWITCH_DISKS.TXT&$READ/END=DONE_SWITCH SWITCH SWITCHREC $SWITCH_LOOP:&$READ/END=DONE_SWITCH SWITCH SWITCHREC.$SWITCHREC = F$EDIT("''SWITCHREC'","COMPRESS") $SWITCHLEN = F$LENGTH(SWITCHREC)/$IF (SWITCHREC .EQS. " ") THEN GOTO DONE_SWITCHE$IF (F$LOCATE("Disk",SWITCHREC) .NE. SWITCHLEN) THEN GOTO DONE_SWITCH$D = "''HSCNAME'"3$U = F$EDIT("''F$ELEMENT(1," ",SWITCHREC)'","TRIM")3$R = F$EDIT("''F$ELEMENT(2," ",SWITCHREC)'","TRIM")3$P = F$EDIT("''F$ELEMENT(3," ",SWITCHREC)'","TRIM")($!MAKE SURE ITS NOT A DUPLICATE HSC/UNIT $TCNT = 0 $TEMPLOOP3:$TCNT = TCNT + 1-$IF (TCNT .GT. DCNT) THEN GOTO DONE_TEMPLOOP3N$IF ((D .EQS. DISKHSC'TCNT') .AND. (U .EQS. UNIT'TCNT')) THEN GOTO SWITCH_LOOP$GOTO TEMPLOOP3$DONE_TEMPLOOP3:$DCNT = DCNT + 1$DISKHSC'DCNT' = D$UNIT'DCNT' = U$REQ'DCNT' = R$PORT'DCNT' = P#$!SAY "D ''D' U ''U' R ''R' P ''P'"$GOTO SWITCH_LOOP $DONE_SWITCH: $CLOSE SWITCH $SET NOON)$PURGE/KEEP=3 'HSCNAME'_SWITCH_DISKS.TXT $SET ON $NO_SWITCH:$HSCCNT = HSCCNT + 1$GOTO HSCLOOP4 $HSC_DONE4:?$OPEN/ERROR=OUT_ERROR/WRITE FILE HSC$LOADING:DISK_CABLE_HSC.NEW$M = 0$SHADOW = " "$DISK_INFO_LOOP: $M = M + 1($IF (DEVICE'M' .EQS. "") THEN GOTO NEXTM$DEVICE = DEVICE'M'$HN = " "$$IF (HN'M' .NES. "") THEN HN = HN'M'$AHN = " "'$IF (AHN'M' .NES. "") THEN AHN = AHN'M' $FOUND = 0!$!DETERMINE UNIT NUMBER OF DEVICE$COLON = F$LOCATE(":",DEVICE) $LCNT = 0$LLOOP:-$STRING = F$EXTRACT(LCNT,COLON - LCNT,DEVICE)$TYPE = F$TYPE(STRING)/$IF (TYPE .EQS. "INTEGER") THEN GOTO DONE_LLOOP$LCNT = LCNT + 1%$IF (LCNT .LE. COLON) THEN GOTO LLOOP $DONE_LLOOP:$DEVICEU = STRING&$!IF (DEVICEU .EQ. 36) THEN SET VERIFY($!IF (DEVICEU .NE. 36) THEN SET NOVERIFY$N = 0 $HSCMATCH = 0$NOTHSCMATCH = 0$HSC_INFO_LOOP: $N = N + 1M$!CHECK IF DEVICEU = UNIT'N' AND STORE VALUES FOR HSC MATCH AND NOT HSC MATCH/$IF (UNIT'N' .EQ. DEVICEU) THEN GOTO UNIT_MATCH)$IF (N .LT. DCNT) THEN GOTO HSC_INFO_LOOP$GOTO DONE_THIS_DISK $UNIT_MATCH:7$IF ((DISKHSC'N' .EQS. HN) .OR. (DISKHSC'N' .EQS. AHN))$THEN$HSCMATCH = HSCMATCH + 1 $MATCHHSC'HSCMATCH' = DISKHSC'N'$MATCHREQ'HSCMATCH' = REQ'N'$ELSE$NOTHSCMATCH = NOTHSCMATCH + 1&$NOTMATCHHSC'NOTHSCMATCH' = DISKHSC'N'"$NOTMATCHREQ'NOTHSCMATCH' = REQ'N'$ENDIF)$IF (N .LT. DCNT) THEN GOTO HSC_INFO_LOOP$DONE_THIS_DISK:/$!FOUND THE DISK ON THE THE TWO EXPECTED HSC'S A$!PRINT WARNING IF ON OTHER HSC'S (DIFFERENT ALLOCATION CLASS??).$IF (HSCMATCH .EQ. 2)$THEN+$HSC1 = F$EXTRACT(0,6,"''MATCHHSC1' ")+$HSC2 = F$EXTRACT(0,6,"''MATCHHSC2' ")$REQ1 = "0" + "''MATCHREQ1'"$REQ2 = "0" + "''MATCHREQ2'"=$SAYF " ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" )$IF (NOTHSCMATCH .EQ. 0) THEN GOTO IFDONE/$FHSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")/$FHSC3 = F$EXTRACT(0,6,"''NOTMATCHHSC2' ")/$FHSC4 = F$EXTRACT(0,6,"''NOTMATCHHSC3' ")/$FHSC5 = F$EXTRACT(0,6,"''NOTMATCHHSC4' ")/$FHSC6 = F$EXTRACT(0,6,"''NOTMATCHHSC5' ")/$FHSC7 = F$EXTRACT(0,6,"''NOTMATCHHSC6' ")n$SAY "WARNING - UNIT NUMBER ALSO FOUND ON HSCS ''FHSC1' ''FHSC2' ''FHSC3' ''FHSC4' ''FHSC5' ''FHSC6' ''FHSC7'"L$SAY "FOR DEFINED DISK ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" $GOTO IFDONE$ENDIFB$!FOUND THE DISK ON ONE EXPECTED HSC AND CAN'T FIND THE OTHER PATH$!PRINT SINGLE PATH WARNING2$IF ((HSCMATCH .EQ. 1) .AND. (NOTHSCMATCH .EQ. 0))$THEN+$HSC1 = F$EXTRACT(0,6,"''MATCHHSC1' ")$HSC2 = " "$REQ1 = "0" + "''MATCHREQ1'" $REQ2 = "00"=$SAYF " ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" P$SAY "WARNING- DISK ''DEVICE' IS SINGLE PORTED TO HSC ''HSC1' REQUESTOR ''REQ1'" $GOTO IFDONE$ENDIF6$!FOUND THE DISK ON ONE EXPECTED HSC AND ONE OTHER HSCG$!ASSUME THE DISK HAD NEVER MOUNTED ON THE ALT HSC AND EVERYTHING IS OK2$IF ((HSCMATCH .EQ. 1) .AND. (NOTHSCMATCH .EQ. 1))$THEN+$HSC1 = F$EXTRACT(0,6,"''MATCHHSC1' ").$HSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")$REQ1 = "0" + "''MATCHREQ1'"$REQ2 = "0" + "''NOTMATCHREQ1'"=$SAYF " ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" $GOTO IFDONE$ENDIFJ$!FOUND THE DISK ON ONE EXPECTED HSC AND ON MORE THEN 1 OTHER HSC (HELP!!)&$!PRINT UNEXPECTED CONFIGURATION ERROR2$IF ((HSCMATCH .EQ. 1) .AND. (NOTHSCMATCH .GT. 1))$THENI$SAY "FATAL- DISK FOUND ON MORE THEN 2 HSCS AND ONLY ON ONE EXPECTED HSC",$FHSC1 = F$EXTRACT(0,6,"''MATCHHSC1' ")/$FHSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")/$FHSC3 = F$EXTRACT(0,6,"''NOTMATCHHSC2' ")/$FHSC4 = F$EXTRACT(0,6,"''NOTMATCHHSC3' ")/$FHSC5 = F$EXTRACT(0,6,"''NOTMATCHHSC4' ")/$FHSC6 = F$EXTRACT(0,6,"''NOTMATCHHSC5' ")/$FHSC7 = F$EXTRACT(0,6,"''NOTMATCHHSC6' ");$SAY "EXPECTED HSCS FOR DEVICE ''DEVICE' ARE: ''HN' ''ANH'"P$SAY "FOUND HSCS ''FHSC1' ''FHSC2' ''FHSC3' ''FHSC4' ''FHSC5' ''FHSC6' ''FHSC7'" $GOTO IFDONE$ENDIFH$!DID NOT FIND THE DISK ON EXPECTED HSC'S, BUT FOUND IT ON 2 OTHER HSC'S$!ASSUME ITS OK2$IF ((HSCMATCH .EQ. 0) .AND. (NOTHSCMATCH .EQ. 2))$THEN.$HSC1 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ").$HSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC2' ")$REQ1 = "0" + "''NOTMATCHREQ1'"$REQ2 = "0" + "''NOTMATCHREQ2'"=$SAYF " ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" /$FHSC1 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")/$FHSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC2' ")E$SAY "WARNING - EXPECTED HSCS FOR DEVICE ''DEVICE' ARE: ''HN' ''ANH'"#$SAY "FOUND HSCS ''FHSC1' ''FHSC2'" $GOTO IFDONE$ENDIFF$!DID NOT FIND THE DISK ON EXPECTED HSC'S, BUT FOUND IT ON 1 OTHER HSC$!PRINT SINGLE PATH WARNING2$IF ((HSCMATCH .EQ. 0) .AND. (NOTHSCMATCH .EQ. 1))$THEN.$HSC1 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")$HSC2 = " "$REQ1 = "0" + "''NOTMATCHREQ1'" $REQ2 = "00"=$SAYF " ''DEVICE' ''HSC1' ''REQ1' ''HSC2' ''REQ2' ''SHADOW'" P$SAY "WARNING- DISK ''DEVICE' IS SINGLE PORTED TO HSC ''HSC1' REQUESTOR ''REQ1'";$SAY "EXPECTED HSCS FOR DEVICE ''DEVICE' ARE: ''HN' ''ANH'" $GOTO IFDONE$ENDIFP$!DID NOT FIND THE DISK ON EXPECTED HSC'S,BUT FOUND IT ON MORE THEN 2 OTHER HSCS&$!PRINT UNEXPECTED CONFIGURATION ERROR2$IF ((HSCMATCH .EQ. 0) .AND. (NOTHSCMATCH .GT. 2))$THENK$SAY "FATAL- DISK FOUND ON MORE THEN 2 HSCS AND NOT ON EITHER EXPECTED HSC"/$FHSC2 = F$EXTRACT(0,6,"''NOTMATCHHSC1' ")/$FHSC3 = F$EXTRACT(0,6,"''NOTMATCHHSC2' ")/$FHSC4 = F$EXTRACT(0,6,"''NOTMATCHHSC3' ")/$FHSC5 = F$EXTRACT(0,6,"''NOTMATCHHSC4' ")/$FHSC6 = F$EXTRACT(0,6,"''NOTMATCHHSC5' ")/$FHSC7 = F$EXTRACT(0,6,"''NOTMATCHHSC6' ")!$SAY "EXPECTED HSCS ''HN' ''ANH'"G$SAY "FOUND HSCS ''FHSC2' ''FHSC3' ''FHSC4' ''FHSC5' ''FHSC6' ''FHSC7'" $GOTO IFDONE$ENDIF$$!DID NOT FIND THE DISK ON ANY HSC'S$!PRINT NOT FOUND WARNING2$IF ((HSCMATCH .EQ. 0) .AND. (NOTHSCMATCH .EQ. 0))$THEN8$SAY "WARNING- DISK ''DEVICE' WAS NOT FOUND ON ANY HSCS" $GOTO IFDONE$ENDIF$IFDONE:$NEXTM:)$IF (M .LT. CNT) THEN GOTO DISK_INFO_LOOPE $CLOSE FILE *$!COMPARE OLD AND NEW DISK_CABLE_HSC FILES$COMPARE_OLD_NEW:DI$SORT/KEY=(POSITION:1,SIZE:15,CHARACTER) HSC$LOADING:DISK_CABLE_HSC.DAT -R HSC$LOADING:DISK_CABLE_HSC.DATEI$SORT/KEY=(POSITION:1,SIZE:15,CHARACTER) HSC$LOADING:DISK_CABLE_HSC.NEW -I HSC$LOADING:DISK_CABLE_HSC.NEW(5$OPEN/ERROR=NO_NEW NEW HSC$LOADING:DISK_CABLE_HSC.NEWE5$OPEN/ERROR=NO_OLD OLD HSC$LOADING:DISK_CABLE_HSC.DATRA$OPEN/WRITE/ERROR=DIKTV$ HSCLOAD010.A Z[HSC.A]BUILD_DISK_CABLE.COM;33n(1"FF_ERROR DIFF HSC$LOADING:DISK_CABLE_HSC.DIFF $DIFF_CHANGE = 0 $NEW_DONE = 0P $OLD_DONE = 0Y$GOSUB READ_NEWA$GOSUB READ_OLDD $DIFF_COMP:S$!SH SYM NEW_DEVICEA$!SH SYM OLD_DEVICE"C$IF ((NEW_DONE .EQ. 1) .AND. (OLD_DONE .EQ. 1)) THEN GOTO DIFF_DONEL)$IF (OLD_DONE .EQ. 1) THEN GOTO DIFF_LESS ,$IF (NEW_DONE .EQ. 1) THEN GOTO DIFF_GREATER6$IF (NEW_DEVICE .EQS. OLD_DEVICE) THEN GOTO DIFF_EQUAL8$IF (NEW_DEVICE .GTS. OLD_DEVICE) THEN GOTO DIFF_GREATER $DIFF_LESS:R$DIFF_CHANGE = 1@$SAYD "DEVICE FOUND IN NEW DISK_CABLE_HSC FILE BUT NOT IN OLD ="$SAYD "''NEWREC'"O$GOSUB READ_NEWA$GOTO DIFF_COMPO$DIFF_GREATER:$DIFF_CHANGE = 1@$SAYD "DEVICE FOUND IN OLD DISK_CABLE_HSC FILE BUT NOT IN NEW ="$SAYD "''OLDREC'"E$DIFF_CHANGE = 1$GOSUB READ_OLD$GOTO DIFF_COMPV $DIFF_EQUAL:F$IF ((NEW_HSC1 .EQS. OLD_HSC1) .AND. (NEW_REQ1 .EQS. OLD_REQ1) .AND. -; (NEW_HSC2 .EQS. OLD_HSC2) .AND. (NEW_REQ2 .EQS. OLD_REQ2))$$THENN$GOSUB READ_NEWL$GOSUB READ_OLDI$GOTO DIFF_COMPA$ENDIFF$IF ((NEW_HSC1 .EQS. OLD_HSC2) .AND. (NEW_REQ1 .EQS. OLD_REQ2) .AND. -; (NEW_HSC2 .EQS. OLD_HSC1) .AND. (NEW_REQ2 .EQS. OLD_REQ1))U$THEN$GOSUB READ_NEWT$GOSUB READ_OLDC$GOTO DIFF_COMPE$ENDIF$DIFF_CHANGE = 17$SAYD " CHANGE IN CONFIGURATION FOR DISK ''NEW_DEVICE'"OM$SAYD " OLD= HSC ''OLD_HSC1' REQ ''OLD_REQ1' HSC ''OLD_HSC2' REQ ''OLD_REQ2'"=M$SAYD " NEW= HSC ''NEW_HSC1' REQ ''NEW_REQ1' HSC ''NEW_HSC2' REQ ''NEW_REQ2'"$GOSUB READ_NEWD$GOSUB READ_OLDR$GOTO DIFF_COMP $DIFF_DONE:O $CLOSE OLD $CLOSE NEW $CLOSE DIFFE $!IF (DIFF_CHANGE .EQ. 1) THEN -O$!MAIL/SUBJECT="HSC_LOAD DISK CHANGES" MAILLIST HSC$LOADING:DISK_CABLE_HSC.DIFF8O$SAY "THE FOLLOWING DIFFERENCES WERE FOUND BETWEEN OLD AND NEW VERSIONS OF THE"O'$SAY "FILE HSC$LOADING:DISK_CABLE_HSC:"E%$TYPE HSC$LOADING:DISK_CABLE_HSC.DIFF $EXIT" $READ_NEW:$READ/END=DONE_NEW NEW NEWREC'$!SAY "NEW =''NEWREC'"$$NEW_DEVICE = F$EXTRACT(1,15,NEWREC)"$NEW_HSC1 = F$EXTRACT(17,6,NEWREC)"$NEW_REQ1 = F$EXTRACT(24,2,NEWREC)"$NEW_HSC2 = F$EXTRACT(27,6,NEWREC)"$NEW_REQ2 = F$EXTRACT(34,2,NEWREC) $NEWSS = F$EXTRACT(37,15,NEWREC)$RETURN, $DONE_NEW: $NEW_DONE = 1T$RETURNV $READ_OLD:$READ/END=DONE_OLD OLD OLDREC $!SAY "OLD =''OLDREC'"$$OLD_DEVICE = F$EXTRACT(1,15,OLDREC)"$OLD_HSC1 = F$EXTRACT(17,6,OLDREC)"$OLD_REQ1 = F$EXTRACT(24,2,OLDREC)"$OLD_HSC2 = F$EXTRACT(27,6,OLDREC)"$OLD_REQ2 = F$EXTRACT(34,2,OLDREC) $OLDSS = F$EXTRACT(37,15,OLDREC)$RETURN $DONE_OLD: $OLD_DONE = 1 $RETURN'$NO_NEW:P$SAY "UNABLE TO OPEN FILE JUST CREATED; HSC$LOADING:DISK_CABLE_HSC.NEW -EXITING"$EXIT 2 $NO_OLD:/$SAY "HSC$LOADING:DISK_CABLE_HSC.DAT NOT FOUND"NG$SAY "RENAMING THE FILE JUST CREATED TO HSC$LOADING:DISK_CABLE_HSC.DAT"E@$SAY "CHECK THIS FILE FOR ACCURACY PRIOR TO RUNNING HSC_LOADING"N$SAY "MAKE SURE THAT THE FIRST HSC/REQUESTOR PAIR IS THE 'A' PORT OF THE DISK"?$SAY "AND ADD CONTROLLER BASED SHADOWING INFORMATION AS NEEDED"E$RENAME HSC$LOADING:DISK_CABLE_HSC.NEW HSC$LOADING:DISK_CABLE_HSC.DATQ$EXITH $OUT_ERROR:M$SAY "UNABLE TO OPEN FILE HSC$LOADING:DISK_CABLE_HSC.NEW FOR WRITE - EXITING"C$EXIT 2) $DIFF_ERROR:N$SAY "UNABLE TO OPEN FILE HSC$LOADING:DISK_CABLE_HSC.DIFF FOR WRITE - EXITING"$EXIT 2 $NO_HSCS:"$SAY -O"NO HSC DEVICES WERE FOUND, MAKE SURE YOU ARE LOGGED IN TO A CI NODE - EXITING"C$EXIT 2$TDVI("''DEVICE'","MNT")) THEN -, WRITE CLEAR "$PREFER ''DEVICE'/HOST='NODE'" $goto readrec$DONE_DISKLIST:$CLOSE DISKLIST$DELEX DISKLIST.TMP;*$!+$!TURN OFF SYSMAN VERIFY IF WE TURNED IT ON$!$WRITE ORG "$SET*[HSC.A]BUILD_DISK_CABLE.FOR;27+,./ 4I-Z0123KPWO567s_yK7@`3<^89GHJCCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CHC THIS PROGRAM CREATES A FILE CONTAINING PHYSICAL DISK NUMBERS AND THEIRC HSC/REQUESTOR FOR EACH PORT.CC PROGRAM INPUTS:/C HSC$LOADING:DISK_CABLE_HSC.DAT IF IT EXISTS. IC IF DISK UNIT NUMBERS ARE CHANGED, DISK_CABLE_HSC.DAT MUST BE UPDATED TOAC REFLECT THE NEW CABLING OR THE ACCURACY OF HSC_LOADING WILL BE FC UNPREDICTABLE. THE FORMAT OF EACH DISK RECORD IN DISK_CABLE_HSC.DAT (C IS AS FOLLOWS (REQ NUMBER CANNOT BE 0)C$CPHYSICAL PORT A PORT B SHADOW(CDEVICE HSC REQ HSC Req SETC-C$2$DUA88: HSC006 06 HSC007 07 $1$DUS9999:-C$2$DUA91: HSC006 06 HSC007 05 $1$DUS9999:!C$2$DUA96: HSC006 04 HSC007 06!C$2$DUA103: HSC006 05 HSC007 04!C$2$DUA128: HSC006 07 HSC007 06!C$2$DUA129: HSC006 07 HSC007 06!C$2$DUA130: HSC006 07 HSC007 06!C$2$DUA131: HSC006 07 HSC007 08C*C DISK - 12 CHARACTER PHYSICAL DEVICE NAME'C HSC A/B - 6 CHARACTER HSC DEVICE NAMEAC REQ A/B - TWO CHARACTER NUMBER BETWEEN 1 AND 20 (HSC>SHOW DISK)FC SHADOW SET - 15 CHARACTER CONTROLLER BASED (PHASE 1) SHADOW SET NAME,C THERE ARE SINGLE SPACES BETWEEN EACH FIELDCC PROGRAM OUTPUTS:"C HSC$LOADING:DISK_CABLE_HSC.DAT.  PROGRAM BUILD_DISK_CABLE IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)' INCLUDE '($SYSSRVNAM)'( CHARACTER*15 DEVICE,SHADOW,INPUT_SHADOW CHARACTER*6 HSCA_NAM CHARACTER*6 HSCB_NAM CHARACTER*2 REQA CHARACTER*2 REQB CHARACTER*6 INPUT_HSCA_NAM CHARACTER*6 INPUT_HSCB_NAM CHARACTER*32 DEV INTEGER*2 CHAN INTEGER*4 STATUS INTEGER*4 MAX_DISKS INTEGER*4 MAX_INDEX INTEGER*4 IREQA INTEGER*4 IREQB INTEGER*4 INPUT_REQA INTEGER*4 INPUT_REQB(C DISK_ARRAY SET UP FOR UP TO 1000 DISKS STRUCTURE /DISKS/ CHARACTER*15 DEVICE CHARACTER*6 HSCA_NAM INTEGER*4 REQA CHARACTER*6 HSCB_NAM INTEGER*4 REQB CHARACTER*15 SHADOW END STRUCTURE RECORD /DISKS/ D_A(1000)*C SET UP THE ITEMLIST FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(2) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLSTC BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 4& ITMLST.ITEM(1).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(1).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(1).ADDRLEN = 0 ITMLST.ITEM(2).BUFLEN = 4' ITMLST.ITEM(2).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(2).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(2).ADDRLEN = 0 END_OF_LIST = 0   C OPEN DISK_CABLE_HSC FILE3 OPEN(UNIT=1,FILE='HSC$LOADING:DISK_CABLE_HSC.DAT',6 1 STATUS='UNKNOWN',RECL=52,ORGANIZATION='SEQUENTIAL') MAX_DISK = 0:C DEFINED "DISKS" LOOP (CHECK BEFORE ADDING TO DISK_ARRAY) 10 CONTINUE HSCA_NAM = ' ' HSCB_NAM = ' ' SHADOW = ' '; READ(1,11,END=19)DEVICE,HSCA_NAM,REQA,HSCB_NAM,REQB,SHADOW111 FORMAT(' ',A15,1X,A6,1X,A2,1X,A6,1X,A2,1X,A15)BC IF BOTH PORTS ARE EMPTY, IGNORE THE DISK (HOW CAN YOU LOAD IT??)E IF ((HSCA_NAM .EQ. ' ') .AND. (HSCB_NAM .EQ. ' ')) GOTO 10!C ASSIGN A CHANNEL TO THE DEVICE $C STATUS = SYS$ASSIGN(DEVICE,CHAN,,)C IF (.NOT. STATUS) THEN-C TYPE *,'ERROR - Current Device is ',DEVICE!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 10C END IFC:C GET THE DEVICE INFORMATION INCLUDING PRIMARY PATH [HOST]C/C STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)C IF (.NOT. STATUS) THEN!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 10C END IFC%C DEASSIGN THE CHANNEL TO THE DEVICE C!C STATUS = SYS$DASSGN(%VAL(CHAN))C IF (.NOT. STATUS) THEN!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 10C END IFCC IS IT A DISKC"C IF (DEVCLASS .NE. DC$_DISK) THEN&C CALL LIB$SIGNAL(%VAL(SS$_IVDEVNAM)) C GOTO 10C END IFCC DEVICE IS A DISKCBC CONVERT THE ASCII TEXT FROM THE FILE TO INTEGERS THAT WE CAN USE IREQA = 0 IREQB = 0! IF (HSCA_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQA),%REF(IREQA))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF! IF (HSCB_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQB),%REF(IREQB))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF MAX_DISKS = MAX_DISKS + 1  $ HSCLOAD010.AZ[HSC.A]BUILD_DISK_CABLE.FOR;27I D_A(MAX_DISKS).DEVICE = DEVICE# D_A(MAX_DISKS).HSCA_NAM = HSCA_NAM D_A(MAX_DISKS).REQA = IREQA# D_A(MAX_DISKS).HSCB_NAM = HSCB_NAM D_A(MAX_DISKS).REQB = IREQB D_A(MAX_DISKS).SHADOW = SHADOW C NEXT DISK GOTO 10 C END OF FILE 19 CONTINUE CLOSE(UNIT=1)FC ASK FOR ADDITIONAL DISKS (IF IT ALREADY EXISTS, MODIFY WITH EXISTINGC DATA AS DEFALTS 100 CONTINUE@101 FORMAT(' PHYSICAL DEVICE NAME OF THE DISK ( TO EXIT)?')111 FORMAT(A15)120 WRITE(*,101) READ(*,111,END=200) DEVICE IF (DEVICE .EQ. ' ') GOTO 200!C ASSIGN A CHANNEL TO THE DEVICE $C STATUS = SYS$ASSIGN(DEVICE,CHAN,,)C IF (.NOT. STATUS) THEN1C TYPE *,' ERROR ASSIGNING A CHANNEL TO ',DEVICE!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 120C END IFC:C GET THE DEVICE INFORMATION INCLUDING PRIMARY PATH [HOST]C/C STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)C IF (.NOT. STATUS) THEN;C TYPE *,' ERROR GETTING DEVICE INFORMATION ABOUT ',DEVICE!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 120C END IFC%C DEASSIGN THE CHANNEL TO THE DEVICE C!C STATUS = SYS$DASSGN(%VAL(CHAN))C IF (.NOT. STATUS) THEN!C CALL LIB$SIGNAL (%VAL(STATUS)) C GOTO 120C END IFCC IS IT A DISKC"C IF (DEVCLASS .NE. DC$_DISK) THENAC TYPE *,' DEVICE ',DEVICE,' IS NOT A DISK KNOWN TO THIS SYSTEM'&C CALL LIB$SIGNAL(%VAL(SS$_IVDEVNAM)) C GOTO 120C END IFCC SEARCH ARRAY FOR THE DEVICE I = 1 140 CONTINUE$ IF (DEVICE .EQ. D_A(I).DEVICE) THEN HSCA_NAM = D_A(I).HSCA_NAM  IREQA = D_A(I).REQA HSCB_NAM = D_A(I).HSCB_NAM IREQB = D_A(I).REQB SHADOW = D_A(I).SHADOW GOTO 150 END IF IF (I .LT. MAX_DISKS) THEN I = I + 1 GOTO 140 ELSE MAX_DISKS = MAX_DISKS + 1 I = MAX_DISKS HSCA_NAM = ' ' IREQA = 0 HSCB_NAM = ' ' IREQB = 0 SHADOW = ' ' END IF 150 CONTINUE(102 FORMAT(' PORT A HSC NAME [',A6,']?')8103 FORMAT(' PORT A REQUESTOR NUMBER (1-8) [',I2.2,']?')(104 FORMAT(' PORT B HSC NAME [',A6,']?')8105 FORMAT(' PORT B REQUESTOR NUMBER (1-8) [',I2.2,']?')5106 FORMAT(' CONTROLLER BASED SHADOW SET [',A15,']?')112 FORMAT(A6)113 FORMAT(I2) WRITE(*,102)HSCA_NAM" READ(*,112,END=160)INPUT_HSCA_NAM7 IF (INPUT_HSCA_NAM .NE. ' ') HSCA_NAM = INPUT_HSCA_NAM WRITE(*,103)IREQA READ(*,113,END=160)INPUT_REQA* IF (INPUT_REQA .NE. 0) IREQA = INPUT_REQA 160 CONTINUE WRITE(*,104)HSCB_NAM" READ(*,112,END=170)INPUT_HSCB_NAM7 IF (INPUT_HSCB_NAM .NE. ' ') HSCB_NAM = INPUT_HSCB_NAM WRITE(*,105)IREQB  READ(*,113,END=170)INPUT_REQB* IF (INPUT_REQB .NE. 0) IREQB = INPUT_REQB 170 CONTINUE WRITE(*,106)SHADOW READ(*,111)INPUT_SHADOW? IF (INPUT_SHADOW .NE. ' ') SHADO W= INPUT_SHADOW D_A(I).DEVICE = DEVICE D_A(I).HSCA_NAM = HSCA_NAM D_A(I).REQA = IREQA D_A(I).HSCB_NAM = HSCB_NAM D_A(I).REQB = IREQB D_A(I).SHADOW = SHADOW GOTO 100 200 CONTINUE6201 FORMAT(' ',A15,1X,A6,1X,I2.2,1X,A6,1X,I2.2,1X,A15)!C WRITE OUT THE ARRAY TO THE FILE3 OPEN(UNIT=2,FILE='HSC$LOADING:DISK_CABLE_HSC.DAT',2 1 STATUS='NEW',RECL=52,ORGANIZATION='SEQUENTIAL') DO 300 K = 1, MAX_DISKS7 WRITE(2,201)D_A(K).DEVICE,D_A(K).HSCA_NAM,D_A(K).REQA,, 1 D_A(K).HSCB_NAM,D_A(K).REQB,D_A(K).SHADOW 300 CONTINUE CLOSE(UNIT=2) 999 CONTINUE END*[HSC.A]BUILD_DISK_CABLE.OBJ;1+,q. / 4 -Z0123KPWO 5H6@RbyK70i3<^89GHJ;BUILD_DISK_CABLE0116-Jan-1992 10:4716-Jan-1992 10:47VAX FORTRAN V5.5-98BUILD_DISK_CABLEYPHSC$LOADING:DISK_CABLE_HSC.DATP P2 PHYSICAL DEVICE NAME OF THE DISK ( TO EXIT)? PORT A HSC NAME []? PORT A REQUESTOR NUMBER (1-8) []? PORT B HSC NAME []? PORT B REQUESTOR NUMBER (1-8) []? CONTROLLER BASED SHADOW SET []? BUILD_DISK_CABLEP8 FOR$OPEN@4 FOR$OPEN@4PK[k\lFOR$OPEN(*(*(0ß~,< FOR$READ_SF FOR$IO_T_DS4 FOR$IO_T_DSD FOR$IO_T_DS< FOR$IO_T_DSL FOR$IO_T_DS$ FOR$IO_T_DS FOR$IO_END)*)*1tԫԫ)*ˌ LIB$CVT_DTBPPˠ˜ LIB$SIGNAL)*ˤ LIB$CVT_DTBPP˸˴ LIB$SIGNAL\2\V(F<(F% AND THAT THE HSC PUTS IN EACH LINEC COUNT = 1 111 CONTINUEEC TYPE *,'#',COUNT,'=',OUTPUT(COUNT:COUNT),ICHAR(OUTPUT(COUNT:COUNT))B IF (ICHAR(OUTPUT(COUNT:COUNT)) .EQ. 10) OUTPUT(COUNT:COUNT) = ' 'B IF (ICHAR(OUTPUT(COUNT:COUNT)) .EQ. 13) OUTPUT(COUNT:COUNT) = ' ' COUNT = COUNT + 1' IF (COUNT .LE. IOSB.TRANSFER) GOTO 111 TYPE *,OUTPUT(1:IOSB.TRANSFER)C GOTO 100 200 CONTINUE&C TYPE *,'AFTER OUTPUT, BEFORE DASSGN'C DEASSIGN THE CHANNEL STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) 999 CONTINUE END*[HSC.A]DCLHSC.OBJ;82+, ./ 4x-Z0123KPWO 536@˸I7-3<^89GHJ1DCLHSC0112-Oct-1992 18:1912-Oct-1992 18:19VAX FORTRAN V5.8-155 DCLHSCPINCORRECT COMMAND LINE FORMATDEFINE A FOREIGN COMMAND USING: $ DCLHSC :== $DEVICE:[DIRECTORY]DCLHSCAND RUN THE PROGRAM USING THE FORMAT: $DCLHSC HSC_NAME HSC_COMMAND DCLHSCPP'<%c   $   : Q|PK[$LIB$GET_FOREIGNP\\\<8LIB$STOPV2WVP@˚@VVW1~ FOR$WRITE_SL@ FOR$IO_T_DS FOR$IO_END~ FOR$WRITE_SLH FOR$IO_T_DS FOR$IO_END~ FOR$WRITE_SLP FOR$IO_T_DS FOR$IO_END~ FOR$WRITE_SLX FOR$IO_T_DS FOR$IO_END~ FOR$WRITE_SL` FOR$IO_T_DS FOR$IO_END\lhLIB$STOPVP@˚ 1GV\VP\Q@˚AJV\VW\V FJ\1( (&}MSCP$DUPP`Pk`P`P`p SYS$ASSIGN$ HSCLOAD010.A Z[HSC.A]DCLHSC.OBJ;82LVPPˌˈLIB$STOP2V˘2˜ˠ˴ːSYS$QIOWPPLIB$STOPP`PPP2`LIB$STOPЫP8P2VPSYS$QIOPP LIB$STOP SYS$SYNCHPP LIB$STOPP`PPP2`($LIB$STOP2V408<,SYS$QIOPPd`LIB$STOPph SYS$SYNCHPPxtLIB$STOPP`PPP2`ˀ|LIB$STOP2Vˌ!ː˔˄SYS$QIOWPP˼˸LIB$STOPP`PPP2`LIB$STOPPP1@,  2V0\SYS$QIOPPLIB$STOP  SYS$SYNCHPPLIB$STOPP`PPP2`LIB$STOP2V(!,0 SYS$QIOWPPXTLIB$STOPP`PPP2``\LIB$STOPPP1:)WP`P2PXWYIPP  IIPP  IWWX~ FOR$WRITE_SLXdhd FOR$IO_T_DS FOR$IO_END142Vpl SYS$DASSGNPPxtLIB$STOPPP_FYA0:PSEUDO SETSHO-I Program Exit KDCLHSC SYS$ASSIGN SYS$DASSGNSYS$QIOSYS$QIOW SYS$SYNCHLIB$GET_FOREIGNLIB$STOPk$CODE$PDATAl$LOCAL FOR$IO_END FOR$IO_T_DS FOR$WRITE_SLP APPPiPPPPPP'PXPyPPPPP-PNPgPPPPPhPPXP/k*[HSC.A]HSCLOAD010_IG.PS;4+, .8/ 488i-Z0123KPWO95#6f3녖7b3<^89GHJ%!PS-Adobe-2.1 %%Creator: DECwrite V1.1 %%+Copyright (c) 1990 DIGITAL EQUIPMENT CORPORATION. %%+All Rights Reserved. %%DocumentFonts: (atend) %%EndComments %%BeginProcSet DEC_WRITE 1.06 /DEC_WRITE_dict 150 dict def DEC_WRITE_dict begin/$D save def/$I 0 def/$S 0 def/$C matrix def/$R matrix def/$L matrix def/$E matrix def/pat1{/px exch def/pa 8 array def 0 1 7{/py exch def/pw 4 string def 0 1 3{pw exch px py 1 getinterval putinterval}for pa py pw put}for}def/pat2{/pi exch def/cflag exch def save cflag 1 eq{eoclip}{clip}ifelse newpath{clippath pathbbox}stopped not{/ph exch def/pw exch def/py exch def/px exch def/px px 3072 div floor 3072 mul def/py py 3072 div floor 3072 mul def px py translate/pw pw px sub 3072 div floor 1 add cvi def/ph ph py sub 3072 div floor 1 add cvi def pw 3072 mul ph 3072 mul scale/pw pw 32 mul def/ph ph 32 mul def/px 0 def/py 0 def pw ph pi[pw 0 0 ph 0 0]{pa py get/px px 32 add def px pw ge{/px 0 def/py py 1 add 8 mod def}if}pi type/booleantype eq{imagemask}{image}ifelse}if restore}def/PS{/_op exch def/_np 8 string def 0 1 7{/_ii exch def/num _op _ii get def _np 7 _ii sub num -4 bitshift PX num 15 and 4 bitshift -4 bitshift PX 4 bitshift or put}for _np}def/PX{[15 7 11 3 13 5 9 1 14 6 10 2 12 4 8 0]exch get}def/FR{0.7200 0 $E defaultmatrix dtransform/yres exch def/xres exch def xres dup mul yres dup mul add sqrt}def/SU{/_sf exch def/_sa exch def/_cs exch def/_mm $C currentmatrix def/rm _sa $R rotate def/sm _cs dup $L scale def sm rm _mm _mm concatmatrix _mm concatmatrix pop 1 0 _mm dtransform/y1 exch def/x1 exch def/_vl x1 dup mul y1 dup mul add sqrt def/_fq FR _vl div def/_na y1 x1 atan def _mm 2 get _mm 1 get mul _mm 0 get _mm 3 get mul sub 0 gt{{neg}/_sf load concatprocs/_sf exch def}if _fq _na/_sf load setscreen}def/BO{/_yb exch def/_xb exch def/_bv _bs _yb _bw mul _xb 8 idiv add get def/_mk 1 7 _xb 8 mod sub bitshift def _bv _mk and 0 ne $I 1 eq xor}def/BF{DEC_WRITE_dict begin/_yy exch def/_xx exch def/_xi _xx 1 add 2 div _bp mul cvi def/_yi _yy 1 add 2 div _bp mul cvi def _xi _yi BO{/_nb _nb 1 add def 1}{/_fb _fb 1 add def 0}ifelse end}def/setpattern{/_cz exch def/_bw exch def/_bp exch def/_bs exch PS def/_nb 0 def/_fb 0 def _cz 0/BF load SU{}settransfer _fb _fb _nb add div setgray/$S 1 def}def/invertpattern{$S 0 eq{{1 exch sub}currenttransfer concatprocs settransfer}if}def/invertscreen{/$I 1 def/$S 0 def}def/revertscreen{/$I 0 def}def/setrect{/$h exch def/$w exch def/$y exch def/$x exch def newpath $x $y moveto $w $x add $y lineto $w $x add $h $y add lineto $x $h $y add lineto closepath}def/concatprocs{/_p2 exch cvlit def/_p1 exch cvlit def/_pn _p1 length _p2 length add array def _pn 0 _p1 putinterval _pn _p1 length _p2 putinterval _pn cvx}def/OF/findfont load def/findfont{dup DEC_WRITE_dict exch known{DEC_WRITE_dict exch get}if DEC_WRITE_dict/OF get exec}def mark/ISOLatin1Encoding 8#000 1 8#001{StandardEncoding exch get}for /emdash/endash 8#004 1 8#025{StandardEncoding exch get}for /quotedblleft/quotedblright 8#030 1 8#054{StandardEncoding exch get}for /minus 8#056 1 8#217 {StandardEncoding exch get}for/dotlessi 8#301 1 8#317{StandardEncoding exch get}for/space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered /macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph /periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter /onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde /Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde /Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis 256 array astore def cleartomark /encodefont{findfont dup maxlength dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding exch def dup/FontName exch def currentdict definefont end}def/loads{/$/ISOLatin1Encoding load def/&/encodefont load def/*/invertpattern load def/+/revertscreen load def/-/invertscreen load def/:/concatprocs load def/^/setpattern load def/~/pat1 load def/_/pat2 load def/@/setrect load def/A/arcn load def/B/ashow load def/C/curveto load def/D/def load def/E/eofill load def/F/findfont load def/G/setgray load def/H/closepath load def/I/clip load def/K/kshow load def/L/lineto load def/M/moveto load def/N/newpath load def/O/rotate load def/P/pop load def/R/grestore load def/S/gsave load def/T/translate load def/U/sub load def/V/div load def/W/widthshow load def/X/exch load def/Y/awidthshow load def/a/save load def/c/setlinecap load def/d/setdash load def/e/restore load def/f/setfont load def/g/initclip load def/h/show load def/i/setmiterlimit load def/j/setlinejoin load def/k/stroke load def/l/rlineto load def/m/rmoveto load def/n/currentfont load def/o/scalefont load def/p/currentpoint load def/r/currenttransfer load def/s/scale load def/t/setmatrix load def/u/settransfer load def/w/setlinewidth load def/x/matrix load def/y/currentmatrix load def}def end %%EndProcSet %%EndProlog %%BeginSetup DEC_WRITE_dict begin loads version cvi 23.0 gt { currentdict {dup type /arraytype eq {bind def} {pop pop} ifelse} forall} if 0.0100 0.0100 s %%EndSetup %%Page: 1 1 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (1) h -7200 74700 T R R S 7200 -7200 T N 0 G 23400 -1200 M 300 -2600 M 300 -4000 M 23400 -5400 M 9518 -6800 M /Times-Roman-ISOLatin1 F 1200 o f (PACKAGED APPLICATION SOFTWARE SOLUTION) h 23400 -9250 M 23400 -11250 M 18850 -13250 M n 1.500 o f (DEChscload) h 300 -15850 M 300 -18450 M 11876 -21050 M (HSC Requester Load Balancing) h 300 -23050 M ( ) h 12125 -25650 M (Reporting and Switching b$ HSCLOAD010.A Z[HSC.A]HSCLOAD010_IG.PS;48" Tools) h 300 -27650 M 300 -30250 M 6060 -30250 M 11820 -30250 M 17580 -30250 M (Installation Guide) h 34860 -30250 M 300 -32400 M 23400 -33800 M 13650 -35200 M n 0.667 o f (VERSION 1.0 FEBUARY, 1993) h 300 -36600 M -7200 7200 T R showpage $P e %%Page: 2 2 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (2) h -7200 74700 T R R S 7200 -7200 T N 0 G 15799 -1650 M /Helvetica-Bold-ISOLatin1 $ /Helvetica-Bold & P /Helvetica-Bold-ISOLatin1 F 1800 o f (Table of Contents) h 300 -6200 M 1308 -6200 M /Times-Roman-ISOLatin1 F 1200 o f (Preface) h 5306 -6200 M 5700 -6200 M (..............................................................................................................................) h 43692 -6200 M (3) h 300 -9800 M 1308 -9800 M (Purpose of this Guide) h 12141 -9800 M 12300 -9800 M (........................................................................................................) h 43692 -9800 M (4) h 300 -13400 M 1308 -13400 M (Preparing for Installation) h 13773 -13400 M 14100 -13400 M (..................................................................................................) h 43692 -13400 M (5) h 300 -17000 M 1308 -17000 M (Performing the Install) h 12240 -17000 M 12600 -17000 M (.......................................................................................................) h 43692 -17000 M (6) h 300 -20600 M 1308 -20600 M (Post Installation Tasks) h 12575 -20600 M 12900 -20600 M (......................................................................................................) h 43692 -20600 M (8) h 300 -24200 M 1308 -24200 M (Sample Product Install) h 12641 -24200 M 12900 -24200 M (......................................................................................................) h 43692 -24200 M (9) h 300 -27950 M -7200 7200 T R showpage $P e %%Page: 3 3 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (3) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Preface) h 4497 -1350 M 300 -4000 M n 0.857 o f 122.6 0 32 (DE) W 122.6 0 32 (Chscload is designed to reduce I/O delays in a production cluster due to contention at the) W 300 -5400 M 60.3 0 32 (HSC requester card. Since all \(4 or 8\) disks on a requester card can seek data at the same time) W 300 -6800 M 126.9 0 32 (and only one can transfer data at a time, delays can occur if the data channel is busy a large) W 300 -8200 M 70.7 0 32 (portion of the time. If a disk attempts to transfer and the channel is already busy, the disk will) W 300 -9600 M 32.0 0 32 (rotate and then attempt to transfer again. If the other disks on the channel are doing large trans\255) W 300 -11000 M (fers or other I/O access patterns that cause the data channel to be very busy, this wait can add) h 300 -12400 M (significant delays to a production application.) h 300 -13800 M 300 -15200 M 300 -16600 M (Intended Audience) h 300 -18000 M 300 -19400 M 69.7 0 32 (This manual is directed at the DEChscload system manager or other individual responsible for) W 300 -20800 M (installing applications on the system\(s\).) h 300 -22200 M 300 -23600 M 300 -25000 M 300 -28350 M -7200 7200 T R showpage $P e %%Page: 4 4 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (4) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Purpose of this Guide) h 12472 -1350 M 300 -2800 M 300 -5400 M n 0.857 o f (This guide describes how to install DEChscload and consists of the following sections:) h 300 -6800 M 300 -8200 M 6060 -8200 M (Preparing for Installation describes the prerequisites of the software and other tasks) h 300 -9600 M 6060 -9600 M (required prior to the installation.) h 300 -11000 M 300 -12400 M 6060 -12400 M (Performing the install describes the questions specific to DEChscload during the) h 300 -13800 M 6060 -13800 M (VMSinstal procedure and the valid responses to these questions.) h 300 -15200 M 300 -16600 M 6060 -16600 M (Post Installation Tasks describes tasks required after the Installation is complete.) h 300 -18000 M 300 -19400 M 300 -20800 M 87.3 0 32 (Refer to the User Guide for detailed information on generating reports and the meaning of re\255) W 300 -22200 M (port data.) h 300 -23600 M 300 -25000 M (Related Documents) h 300 -26400 M 300 -27800 M (As the installer, you should be familiar with the following VMS manuals:) h 300 -29200 M 300 -30600 M 6060 -30600 M (VMS System Manager's Manual) h 300 -32000 M 300 -33400 M 6060 -33400 M (VMS Authorize Utility Manual) h 300 -34800 M 300 -36200 M 300 -37600 M 300 -40950 M -7200 7200 T R showpage $P e %%Page: 5 5 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (5) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Preparing for Installation) h 14376 -1350 M 300 -2800 M 300 -5400 M n 0.857 o f (This section discusses those topics and tasks you need to be aware of prior to installing ) h 300 -6800 M (DEChscload.) h 300 -8200 M 300 -9600 M (Software and Hardware Requirements) h 300 -11000 M 300 -12400 M 117.1 0 32 (Your computer system must satisfy certain minimum requirements before you can install and) W 300 -13800 M (use DEChscload. The installer must make sure that these requirements are met.) h 300 -15200 M 300 -16600 M (The Hardware must consist of the following:) h 300 -18000 M 300 -19400 M 6060 -19400 M (Any valid VAXcluster configuration with HSC's connected to the CI.) h 300 -20800 M 300 -22200 M (DEChscload will function properly only if the following Digital software is installed:) h 300 -23600 M 300 -25000 M 6060 -25000 M (VAX VMS Version 5.4 to 5.5\2552) h 300 -26400 M 300 -27800 M 6060 -27800 M (Privilege Diagnose is required to run this software) h 300 -29200 M 300 -30600 M 6060 -30600 M (The FYDRIVER must be loaded on all systems running hscload) h 300 -32000 M 6060 -32000 M (\(SYSGEN> CONNECT FYA0 /NOADAPT=FYDRIVER\)) h 300 -33400 M 300 -34800 M 222.3 0 32 (If DECps is installed on the system, additional DEChscload functionality is provided. This) W 300 -36200 M 39.9 0 32 (functionality requires the FORTRAN language interface in SYS$LIBRARY for the product in\255) W 300 -37600 M 109.1 0 32 (stalled. If this language library is not found in SYS$LIBRARY, a copy corresponding to the) W 300 -39000 M 74.0 0 32 (version of DECps that was used to write DEChscload will be copied to SYS$LIBRARY. This) W 300 -40400 M (file is only used when using the DECps callable interface from Fortran.) h 300 -41800 M 300 -43200 M 300 -44600 M (Disk Space Requirements for the Installation Procedure) h 300 -46000 M 300 -47400 M 111.5 0 32 (DEChscload requires under 3000 blocks during the installation. Once the product is installed,) W 300 -48800 M 336.1 0 32 (the application will require a variable amount of space for reports and data files in the) W 300 -50200 M 179.6 0 32 (HSC$LOADING directory \(normally under 5000 blocks\) and space for programs and docu\255) W 300 -51600 M (mentation as follows:) h 300 -53000 M 300 -54400 M 6060 -54400 M (programs in HSC$LOADING) h 23340 -54400 M 29100 -54400 M 34860 -54400 M (Under 200 blocks) h 300 -55800 M 6060 -55800 M (Documentation and procedure in SYS$MANAGER) h 34860 -55800 M (Under 1000 blocks) h 300 -57200 M 6060 -57200 M (DECps definition file if needed in SYS$LIBRARY) h 34860 -57200 M (Under 200 blocks) h 300 -58600 M 300 -59871 M 300 -61099 M 300 -64406 M -7200 7200 T R showpage $P e %%Page: 6 6 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (6) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Performing the Install) h 12588 -1350 M 300 -4000 M n 0.857 o f 114.1 0 32 (To install DEChscload, you0+$ HSCLOAD010.A Z[HSC.A]HSCLOAD010_IG.PS;48A" will need this Installation Guide and the HSCLOAD010 savesets) W 300 -5400 M (\(A,B and C\). These savesets can be on tape or in a directory on one of your disks.) h 300 -6800 M 300 -8200 M (Login to the SYSTEM or a similarly privileged account.) h 300 -9600 M 300 -11000 M (Startup VMSINSTAL using the command $@SYS$UPDATE:VMSINSTAL) h 300 -12400 M 300 -13800 M (Answer YES or to the "are you satisfied with the backup" question.) h 300 -15200 M 300 -16600 M 461.4 0 32 (The distribution volumes question should be answered with either the tape drive unit) W 300 -18000 M 254.2 0 32 (\(MKA500:\) or the disk and directory \($1$DIA0:[SOFTWARE]\) of where the DEChscload) W 300 -19400 M (savesets are located.) h 300 -20800 M 300 -22200 M 300 -23600 M (The products question should be answered HSCLOAD) h 300 -25000 M 300 -26400 M (The installation options question should be answered with a .) h 300 -27800 M 300 -29200 M (After the first saveset \(A\) is restored, the following text is displayed:) h 300 -30600 M 300 -32000 M 86.4 0 32 (This procedure installs the Digital Equipment Corporation HSC Loading Asset package. This) W 300 -33400 M 22.7 0 32 (procedure does not do a system\255wide install of the Asset, but provides a command procedure to) W 300 -34800 M 1070.4 0 32 (allow individual users to use the tools. Executing the command procedure) W 300 -36200 M 43.0 0 32 (\($@sys$manager:hsc_loading_logicals\) will allow you to issue the HSC_LOAD and PREFER) W 300 -37600 M 55.0 0 32 (commands. See the documentation provided with the Asset or print the on\255line postscript files) W 300 -39000 M (sys$manager:hscload*.ps for more information on the HSC loading tool.) h 300 -40400 M 300 -41800 M 6060 -41800 M (The hsc_loading software requires VMS version 5.4.) h 300 -43200 M 300 -44600 M (THERE IS A KNOWN PROBLEM WHEN USING THE SET PREFERRED PATH SYSTEM) h 300 -46000 M (SERVICE CALL IN MIXED INTERCONNECT CLUSTERS. THIS PROBLEM INVOLVES) h 300 -47400 M 297.3 0 32 (HSC ATTACHED DISKS THAT ARE SERVED TO THE LAVC. THE LAVC NODES) W 300 -48800 M (LOSE CONNECTION TO THE DISK \(MEDIA OFFLINE\) IF THE HSC PATH CHANGES.) h 300 -50200 M 300 -51600 M 6060 -51600 M (If you are planning on running the HSC_LOADING software in a MI cluster) h 300 -53000 M 6060 -53000 M (you should avoid using the AUTOMATIC LOADING feature and use the data) h 300 -54400 M 6060 -54400 M (produced by HSC_LOADING to perform MANUAL loading only. A work around) h 300 -55800 M 6060 -55800 M (is discussed in the HSC_LOADING User's Guide.) h 300 -57200 M 300 -58600 M (* Do you want to continue [NO]? yes) h 300 -60000 M 300 -61400 M (The first DEChscload specific question is:) h 300 -62800 M 300 -64200 M (* Where do you want to install the kit [SYS$SYSROOT:[HSC$LOADING]]: ) h -7200 7200 T R showpage $P e %%Page: 7 7 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (7) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 F 1200 o f 98.2 0 32 (This question is asking for a disk and directory to be used to hold the DEChscload programs,) W 300 -2600 M 5.2 0 32 (files and command procedures. This directory is also the default area for all reports and requires) W 300 -4000 M 12.9 0 32 (between 1000 and 10000 blocks of space depending on the number of disks on your system and) W 300 -5400 M 39.0 0 32 (the length of time HSC loading history will be retained. The default is the system disk but any) W 300 -6800 M 98.1 0 32 (disk that is mounted system\255wide during system startup can be used. If the directory does not) W 300 -8200 M (exist, it will be created.) h 300 -9600 M 300 -11000 M (The next question is:) h 300 -12400 M 300 -13800 M (* Do you have DECps installed on this system [N]: ) h 300 -15200 M 300 -16600 M 136.0 0 32 (This question is trying to determine which flavor of the DEChscload software to install. An\255) W 300 -18000 M 81.2 0 32 (swering Y will install the DECps files, Answering N or will install the files that do not) W 300 -19400 M (require DECps to be installed on your system.) h 300 -20800 M 300 -22200 M 16.1 0 32 (The next question should be answered YES to verify the installation and create a file describing) W 300 -23600 M 18.5 0 32 (the HSC to Disk cabling if hscload is not being installed on a MI cluster. If this is an MI cluster) W 300 -25000 M (the question should be answered NO) h 300 -26400 M 300 -27800 M (* Do you want to run the IVP after the installation [YES]? ) h 300 -29200 M 300 -30600 M (The last question should be answered YES to cleanup anyfiles replaced by the install.) h 300 -32000 M 300 -33400 M (* Do you want to purge files replaced by this installation [YES]? ) h 300 -34800 M 300 -36200 M 300 -37600 M 64.9 0 32 (At this point all of the questions required for the install have been asked and the install should) W 300 -39000 M 104.4 0 32 (complete within 10 minutes. If you answered YES to the IVP question, the IVP will be auto\255) W 300 -40400 M 60.3 0 32 (matically run after the installation is complete and may require up to 15 minutes depending on) W 300 -41800 M (the number of disks and HSC's in your cluster.) h 300 -43200 M 300 -44600 M 300 -46000 M 258.8 0 32 (When you see the following message, the installation has completed successfully and you) W 300 -47400 M (should type a ^Z to exit from VMSINSTAL:) h 300 -48800 M 300 -50200 M 6060 -50200 M (Installation of HSCLOAD V1.0 completed at 20:40) h 300 -51600 M 300 -53000 M 300 -56350 M -7200 7200 T R showpage $P e %%Page: 8 8 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (8) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Post Installation Tasks) h 12978 -1350 M 300 -2800 M 300 -5400 M n 0.857 o f (After the installation of DEChscload has successfully completed you should:) h 300 -6800 M 300 -8200 M 252.0 0 32 (Add the command $@SYS$MANAGER:HSC_LOADING_LOGICALS to the login.com of) W 300 -9600 M (users that will be running the DEChscload reports either interactively or from batch.) h 300 -11000 M 300 -12400 M 181.3 0 32 (Check the file HSC$LOADING:Disk_cable_hsc.dat created by the IVP to make sure it cor\255) W 300 -13800 M 228.6 0 32 (rectly shows the cabling of your disks and add shadow set information if Controller\255based) W 300 -15200 M (\(phase 1\) Shadow sets are used. If you did not run the IVP, you need to build this file using data) h 300 -16600 M (collected with the show disk command on the HSC.) h 300 -18000 M 300 -19400 M 97.6 0 32 (If you are using the DECps version, edit Manual_hsc_loading.com and Preferred_path.com to) W 300 -20800 M 20.2 0 32 (add each of the nodes in your cluster to the nodelist defined in the command procedure. If there) W 300 -22200 M (is a single node in the cluster, this step is not needed.) h 300 -25550 M -7200 7200 T R showpage $P e %%Page: 9 9 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (9) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Sample Product Install) h 13055 -1350 M 300 -4000 M 300 -5400 M n 0.857 o f ( ) h 6060 -5400 M (Welcome to VAX/VMS V5.5\2552 ) h 300 -7400 M (Username: SYSTEM) h 300 -8800 M 300 -10200 M (Password: ) h 300 -11600 M 6000 -11600 M (Welcome to VAX/VMS V5.5) h 300 -13600 M 87.5 0 32 ( Last interactive login on Thursday, 11\255FEB\2551993 19:01 Last non\255interactive login on Thurs\255) W 300 -15000 M (day, 4\255FEB\2551993 19:00) h 300 -17000 M ($ @sys$update:vmsinstal) h 300 -19000 M 6000 -19000 M (VAX/VMS Software Product Installation Procedure V5.5\2552) h 300 -21000 M (It is 16\255FEB\2551993 at 11:24.) h 300 -23000 M (Enter a question mark \(?\) at any time for help.) h 300 -25000 M 61.1 0 32 (* Are you satisfied with the backup of your system disk [YES]? * Where will the distribution) W 300 -26400 M (volumes be mounted: $1$DIA2:[HSC]) h 300 -28400 M (Enter the products to be processed from the first distribution volume set. * Products: hscload) h 300 -30400 M (* Enter installation options you wish to use \(none\): ) h 300 -32400 M (The following products will be processed:) h 30 i $ HSCLOAD010.A Z[HSC.A]HSCLOAD010_IG.PS;48O/0 -34400 M ( HSCLOAD V1.0) h 300 -36400 M 6000 -36400 M (Beginning installation of HSCLOAD V1.0 at 11:24) h 300 -38400 M (%VMSINSTAL\255I\255RESTORE, Restoring product save set A ...) h 300 -40400 M 86.4 0 32 (This procedure installs the Digital Equipment Corporation HSC Loading Asset package. This) W 300 -41800 M 22.7 0 32 (procedure does not do a system\255wide install of the Asset, but provides a command procedure to) W 300 -43200 M 1070.4 0 32 (allow individual users to use the tools. Executing the command procedure) W 300 -44600 M 43.0 0 32 (\($@sys$manager:hsc_loading_logicals\) will allow you to issue the HSC_LOAD and PREFER) W 300 -46000 M 55.0 0 32 (commands. See the documentation provided with the Asset or print the on\255line postscript files) W 300 -47400 M (sys$manager:hscload*.ps for more information on the HSC loading tool.) h 300 -49400 M 6000 -49400 M (The hsc_loading software requires VMS version 5.4.) h 300 -51400 M (THERE IS A KNOWN PROBLEM WHEN USING THE SET PREFERRED PATH SYSTEM) h 300 -52800 M (SERVICE CALL IN MIXED INTERCONNECT CLUSTERS. THIS PROBLEM INVOLVES) h 300 -54200 M 297.3 0 32 (HSC ATTACHED DISKS THAT ARE SERVED TO THE LAVC. THE LAVC NODES) W 300 -55600 M (LOSE CONNECTION TO THE DISK \(MEDIA OFFLINE\) IF THE HSC PATH CHANGES.) h 300 -57000 M 300 -58400 M 6000 -58400 M (If you are planning on running the HSC_LOADING software in a MI cluster) h 300 -59800 M 6000 -59800 M (you should avoid using the AUTOMATIC LOADING feature and use the data) h 300 -61200 M 6000 -61200 M (produced by HSC_LOADING to perform MANUAL loading only. A work around) h 300 -62600 M 6000 -62600 M (is discussed in the HSC_LOADING User's Guide.) h -7200 7200 T R showpage $P e %%Page: 10 10 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DEChscload v1.0 Installation Guide Page ) h (10) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 F 1200 o f (* Do you want to continue [NO]? yes ) h 300 -2600 M (* Where do you want to install the kit [SYS$SYSDEVICE:[HSC$LOADING]]: ) h 40200 -2600 M 45900 -2600 M 300 -4000 M 6000 -4000 M 11700 -4000 M 17400 -4000 M 23100 -4000 M (sys$common:[hsc$loading]) h 300 -5400 M (%VMSINSTAL\255I\255SYSDIR, This product creates system disk directory ) h 40200 -5400 M 45900 -5400 M 300 -6800 M 6000 -6800 M 11700 -6800 M 17400 -6800 M (SYS$COMMON:[HSC$LOADING].) h 300 -8800 M (* Do you have DECps installed on this system [N]: ) h 300 -10800 M 6000 -10800 M (If this is not an MI cluster, the ivp should be run.) h 300 -12200 M 6000 -12200 M (If this is a mixed\255interconnect cluster \(ci and lavc\) the lavc nodes may) h 300 -13600 M 6000 -13600 M (see the ci disks as off\255line during the ivp so AVOID running the ivp ) h 300 -15000 M 6000 -15000 M (while lavc nodes are activly using the ci disks ) h 300 -17000 M 110.3 0 32 (* Do you want to run the IVP after the installation [YES]? * Do you want to purge files re\255) W 300 -18400 M (placed by this installation [YES]? ) h 300 -20400 M 6000 -20400 M (No more questions will be asked and the install should complete within) h 300 -21800 M 6000 -21800 M (10 minutes. ) h 300 -23800 M (%VMSINSTAL\255I\255RESTORE, Restoring product save set B ...) h 300 -25800 M 6000 -25800 M (The IVP will attempt to create a valid table of how each disk is cabled) h 300 -27200 M 6000 -27200 M (from each port to an hsc/requestor. After the IVP completes, confirm ) h 300 -28600 M 6000 -28600 M (that this data is correct by performing the following steps:) h 300 -30600 M 6000 -30600 M (@sys$manager:hsc_loading_logicals ) h 300 -32000 M 6000 -32000 M (set def hsc$loading ) h 300 -33400 M 6000 -33400 M (type disk_cable_hsc.dat ) h 300 -34800 M 6000 -34800 M (verify the data against output of the show disk commnad on each HSC) h 300 -36800 M (%VMSINSTAL\255I\255MOVEFILES, Files will now be moved to their target directories...) h 300 -38800 M 6000 -38800 M (Starting the Installation Verification Procedure \(IVP\)) h 300 -40800 M (defining the disk to hsc paths, this may take a while) h 300 -42800 M ( Installation of HSCLOAD V1.0 completed at 13:37) h 300 -44800 M (Enter the products to be processed from the next distribution volume set. * Products:) h 300 -46200 M 300 -47600 M 6000 -47600 M (VMSINSTAL procedure done at 13:37) h 300 -49000 M 300 -50438 M -7200 7200 T R showpage $P e $D restore %%Trailer end % DEC_WRITE_dict %%Pages: 10 %%DocumentFonts: Times-Roman-ISOLatin1 %%+ Helvetica-Bold-ISOLatin1 u*[HSC.A]HSCLOAD010_UG.PS;2+,.@/ 4@?-Z0123KPWOA56 E73<^89GHJ %!PS-Adobe-2.1 %%Creator: DECwrite V2.1 %%+Copyright (c) 1990 DIGITAL EQUIPMENT CORPORATION. %%+All Rights Reserved. %%DocumentFonts: (atend) %%EndComments %%BeginProcSet DEC_WRITE 1.07 /DEC_WRITE_dict 150 dict def DEC_WRITE_dict begin/$D save def/$I 0 def/$S 0 def/$C matrix def/$R matrix def/$L matrix def/$E matrix def/pat1{/px exch def/pa 8 array def 0 1 7{/py exch def/pw 4 string def 0 1 3{pw exch px py 1 getinterval putinterval}for pa py pw put}for}def/pat2{/pi exch def/cflag exch def save cflag 1 eq{eoclip}{clip}ifelse newpath{clippath pathbbox}stopped not{/ph exch def/pw exch def/py exch def/px exch def/px px 3072 div floor 3072 mul def/py py 3072 div floor 3072 mul def px py translate/pw pw px sub 3072 div floor 1 add cvi def/ph ph py sub 3072 div floor 1 add cvi def pw 3072 mul ph 3072 mul scale/pw pw 32 mul def/ph ph 32 mul def/px 0 def/py 0 def pw ph pi[pw 0 0 ph 0 0]{pa py get/px px 32 add def px pw ge{/px 0 def/py py 1 add 8 mod def}if}pi type/booleantype eq{imagemask}{image}ifelse}if restore}def/PS{/_op exch def/_np 8 string def 0 1 7{/_ii exch def/num _op _ii get def _np 7 _ii sub num -4 bitshift PX num 15 and 4 bitshift -4 bitshift PX 4 bitshift or put}for _np}def/PX{[15 7 11 3 13 5 9 1 14 6 10 2 12 4 8 0]exch get}def/FR{0.7200 0 $E defaultmatrix dtransform/yres exch def/xres exch def xres dup mul yres dup mul add sqrt}def/SU{/_sf exch def/_sa exch def/_cs exch def/_mm $C currentmatrix def/rm _sa $R rotate def/sm _cs dup $L scale def sm rm _mm _mm concatmatrix _mm concatmatrix pop 1 0 _mm dtransform/y1 exch def/x1 exch def/_vl x1 dup mul y1 dup mul add sqrt def/_fq FR _vl div def/_na y1 x1 atan def _mm 2 get _mm 1 get mul _mm 0 get _mm 3 get mul sub 0 gt{{neg}/_sf load concatprocs/_sf exch def}if _fq _na/_sf load setscreen}def/BO{/_yb exch def/_xb exch def/_bv _bs _yb _bw mul _xb 8 idiv add get def/_mk 1 7 _xb 8 mod sub bitshift def _bv _mk and 0 ne $I 1 eq xor}def/BF{DEC_WRITE_dict begin/_yy exch def/_xx exch def/_xi _xx 1 add 2 div _bp mul cvi def/_yi _yy 1 add 2 div _bp mul cvi def _xi _yi BO{/_nb _nb 1 add def 1}{/_fb _fb 1 add def 0}ifelse end}def/setpattern{/_cz exch def/_bw exch def/_bp exch def/_bs exch PS def/_nb 0 def/_fb 0 def _cz 0/BF load SU{}settransfer _fb _fb _nb add div setgray/$S 1 def}def/invertpattern{$S 0 eq{{1 exch sub}currenttransfer concatprocs settransfer}if}def/invertscreen{/$I 1 def/$S 0 def}def/revertscreen{/$I 0 def}def/setrect{/$h exch def/$w exch def/$y exch def/$x exch def newpath $x $y moveto $w $x add $y lineto $w $x add $h $y add lineto $x $h $y add lineto closepath}def/concatprocs{/_p2 exch cvlit def/_p1 exch cvlit def/_pn _p1 length _p2 length add array def _pn 0 _p1 putinterval _pn _p1 length _p2 putinterval _pn cvx}def/OF/findfont load def/findfont{dup DEC_WRITE_dict exch known{DEC_WRITE_dict exch get}if DEC_WRITE_dict/OF get exec}def mark/ISOLatin1Encoding 8#000 1 8#001{StandardEncoding exch get}for /emdash/endash 8#004 1 8#025{StandardEncoding exch get}for /quotedblleft/quotedblright 8#030 1 8#054{StandardEncoding exch get}for /minus 8#056 1 8#217 {StandardEn ΁$ HSCLOAD010.AZ[HSC.A]HSCLOAD010_UG.PS;2@u"coding exch get}for/dotlessi 8#301 1 8#317{StandardEncoding exch get}for/space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered /macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph /periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter /onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde /Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde /Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis 256 array astore def cleartomark /encodefont{findfont dup maxlength dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding exch def dup/FontName exch def currentdict definefont end}def/loads{/$/ISOLatin1Encoding load def/&/encodefont load def/*/invertpattern load def/+/revertscreen load def/-/invertscreen load def/:/concatprocs load def/^/setpattern load def/~/pat1 load def/_/pat2 load def/@/setrect load def/A/arcn load def/B/ashow load def/C/curveto load def/D/def load def/E/eofill load def/F/findfont load def/G/setgray load def/H/closepath load def/I/clip load def/J/fill load def/K/kshow load def/L/lineto load def/M/moveto load def/N/newpath load def/O/rotate load def/P/pop load def/R/grestore load def/S/gsave load def/T/translate load def/U/sub load def/V/div load def/W/widthshow load def/X/exch load def/Y/awidthshow load def/a/save load def/c/setlinecap load def/d/setdash load def/e/restore load def/f/setfont load def/g/initclip load def/h/show load def/i/setmiterlimit load def/j/setlinejoin load def/k/stroke load def/l/rlineto load def/m/rmoveto load def/n/currentfont load def/o/scalefont load def/p/currentpoint load def/q/setrgbcolor load def/r/currenttransfer load def/s/scale load def/t/setmatrix load def/u/settransfer load def/w/setlinewidth load def/x/matrix load def/y/currentmatrix load def}def end %%EndProcSet %%EndProlog %%BeginSetup DEC_WRITE_dict begin loads version cvi 23.0 gt { currentdict {dup type /arraytype eq {bind def} {pop pop} ifelse} forall} if 0.0100 0.0100 s %%EndSetup %%Page: 1 1 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M 9518 -3188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (PACKAGED APPLICATION SOFTWARE SOLUTION) h 288 -5188 M 288 -7188 M 18850 -9638 M n 1.500 o f (DEChscload) h 288 -11638 M 288 -14238 M 11876 -16838 M (HSC Requester Load Balancing) h 288 -18838 M ( ) h 12125 -21438 M (Reporting and Switching Tools) h 288 -24038 M 18926 -26038 M (Users Guide) h 288 -28188 M 288 -29588 M 288 -30988 M 13050 -32388 M n 0.667 o f (VERSION 1.0 FEBUARY, 1993) h 288 -33788 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M 288 -2626 M -7286 75354 T showpage $P e %%Page: 2 2 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 15799 -1638 M /Helvetica-Bold-ISOLatin1 $ /Helvetica-Bold & P /Helvetica-Bold-ISOLatin1 F 1800 o f (Table of Contents) h 288 -6188 M 1296 -6188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Introduction) h 7629 -6188 M 7800 -6188 M (.......................................................................................................................) h 43680 -6188 M (3) h 288 -9788 M 1296 -9788 M (Running the HSC loading software) h 18562 -9788 M 18900 -9788 M (..................................................................................) h 43680 -9788 M (4) h 288 -13388 M 1296 -13388 M (Program Logic) h 8928 -13388 M 9300 -13388 M (..................................................................................................................) h 43680 -13388 M (6) h 288 -16988 M 1296 -16988 M (Program Inputs) h 9129 -16988 M ( ) h 9600 -16988 M (.................................................................................................................) h 43680 -16988 M (7) h 288 -20588 M 1296 -20588 M (Program Outputs) h 9929 -20588 M 10200 -20588 M (...............................................................................................................) h 43680 -20588 M (8) h 288 -24338 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (2) h -7286 75354 T showpage $P e %%Page: 3 3 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1338 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1400 o f (Introduction) h 7210 -1338 M 288 -3988 M n 0.857 o f 241.5 0 32 (Many production Data Centers experience processing delays due to contention at the HSC ) W 288 -5388 M 96.1 0 32 (Requester level. A single HSC requester card has either 4 or 8 \(new HSC\25590 card\) ports that) W 288 -6788 M 100.1 0 32 (can each be connected to a disk. A single requestor can do seeks on several disks at once but ) W 288 -8188 M 111.2 0 32 (can only transfer data from one disk at a time. If another disk tries to perform a data transfer) W 288 -9588 M 25.5 0 32 (when the requestor is already busy, it is denied access to the data path and will experience rota\255) W 288 -10988 M 38.0 0 32 (tional latency delays before it can attempt another transfer. If several heavily used disks are ac\255) W 288 -12388 M 60.8 0 32 (tive on the same requestor at the same time, these delays can have a significant impact on per\255) W 288 -13788 M 59.3 0 32 (formance. Version 5.4 of VMS gave system managers the ability to switch disks between their) W 288 -15188 M 39.3 0 32 (dual paths using software, but gives no help in deciding which is the best path. System Manag\255) W 288 -16588 M 30.8 0 32 (ers can determine the best paths by hand but this information quickly becomes obsolete if disks) W 288 -17988 M (are moved or if disk usage changes. ) h 288 -19388 M 288 -20788 M 35.5 0 32 (The purpose of this HSC_LOADING software is to use actual disk usage and a wiring diagram) W 288 -22188 M 197.1 0 32 (of the physical disk\255to\255requestor mapping \(disks are seldom recabled\) to determine the best) W 288 -23588 M 73.6 0 32 (HSC requestor loading given the current usage and wiring constraints. In most cases, the most) W 288 -24988 M 8.3 0 32 (heavily used disks will be alone on a requestor if no hardware problems exist. This software has) W 288 -26388 M 127.1 0 32 (no effect on the safety of dual\255pathing but improves the use of the resources by making sure) W 288 -27788 M 81.3 0 32 (both paths are utilized. In the event of device failure, normal failover will occur but perform\255) W 288 -29188 M 57.1 0 32 (ance may suffer. In extreme cases where many heavily used disks are all wired to the same re\255) W 288 -30588 M 44.7 0 32 (questers or where performance penalties during device failures are not acceptable, disks should) W 288 -31988 M (be moved so that all requesters will be load balanced even if an HSC fails. ) h 288 -33388 M 288 -34788 M 25.4 0 32 (This software requires functionality added to VMS in release 5.4. The program PREFER which) W 288 -36188 M 139.9 0 32 (is included with the HSC software version 6 can be used from preferred_path.com to set the) W 288 -37588 M 61.1 0 32 (preferred paths on all nodes of the cluster and to force failover to the preferred path. There are) W 288 -38988 M 35.4 0 32 (known problems with MI clusters when using the /force qualifier in PREFER which may cause) W 288 -40388 M 20.3 0 32 (disks to appear as MED\255OFFLINE to workstations being served CI disks during failover opera\255) W 288 -41788 M 109.1 0 32 (tions. There is a workaround to the problem \(clear the preferred path after failover\) but prob\255) W 288 -43188 M 29.3 0 32 (lems may occur on the workstations while disks are being forced to the other path. For this rea\255) W 288 -44588 M 44.4 0 32 (son, care should be used in MI clusters when running the IVP and using preferred_path.com or) W 288 -46138 M (force_path.com. THIS PROBLEM IS FIXED IN VMS VERSION 6.0) h n 1.167 o f (. ) h 288 -49538 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M n 0.857 o f (DEChscload v1.0 Users Guide Page ) h (3) h -7286 75354 T showpage $P e %%Page: 4 4 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1338 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1400 o f (Running the HSC loading software) h 19965 -1338 M 288 -3988 M  E$ HSCLOAD010.AZ[HSC.A]HSCLOAD010_UG.PS;2@"n 0.857 o f 161.7 0 32 (Before attempting to run the HSC load balancing software, you must create a description of) W 288 -5388 M 46.1 0 32 (how your disks are cabled to your HSC's. If you run the IVP during the install of the software,) W 288 -6788 M 31.0 0 32 (an attempt was made to produce this description by going out to the HSC's on your system and) W 288 -8188 M 87.3 0 32 (asking them what disks they see. The disks were then switched to their alternate HSC and the) W 288 -9588 M 102.3 0 32 (process was repeated. If everything worked correctly, this list should contain all of your HSC) W 288 -10988 M 54.3 0 32 (connected disks and all paths to the HSC and requestor for each disk. IF the disks are part of a) W 288 -12388 M (controller\255based shadow set \(Phase 1 of shadowing\), this data needs to be added to the table.) h 288 -13788 M 288 -15188 M 89.3 0 32 (If you have an MI cluster and did not run the IVP during the product install, you will need to) W 288 -16588 M 80.1 0 32 (determine the cabling of your disks and add this data manually. Show disk at the HSC is very) W 288 -17988 M (useful but will require the manual failoverof the disks to see the "other" path of mounted disks.) h 288 -19388 M 288 -20788 M 22.5 0 32 (The program BUILD_DISK_CABLE is provided in Hsc$loading: to assist you in this task. The) W 288 -22188 M 88.5 0 32 (file produced by build_disk_cable is DISK_CABLE_HSC.DAT and this file can be edited us\255) W 288 -23588 M 2.5 0 32 (ing any standard text editor. After disk_cable_hsc.dat has been created and the data contained in) W 288 -24988 M 70.5 0 32 (the files has been checked you have two choices in how you want to run the hsc_loading soft\255) W 288 -26388 M (ware; manual or automatic. ) h 288 -27788 M 288 -29188 M 142.3 0 32 (Manual mode \(which is recommended for your first run of the program and for MI clusters\)) W 288 -30588 M 6.3 0 32 (produces the same reports and data files as automatic mode but does not perform the actual load ) W 288 -31988 M 102.3 0 32 (balancing. This allows you to check the load balancing before it actual takes place. The com\255) W 288 -33388 M 121.4 0 32 (mands to perform a manual run of hsc_loading are different depending on whether DECps is) W 288 -34788 M 33.1 0 32 (installed on your cluster \(and how you answered the DECps question during install\). If DECps) W 288 -36188 M 62.3 0 32 (is running on your system, you need to describe which nodes' DECps data should be used and) W 288 -37588 M 173.6 0 32 (the beginning and ending times of the data collection \(periods of abnormal usage should be) W 288 -38988 M (avoided\) in the command line as shown below:) h 288 -40388 M 288 -41788 M ($HSC_LOADING/BEGIN=09\255SEP\2551991:08:00/END=13\255SEP\2551991:17:00 NODE1,NODE2 ) h 288 -43188 M 288 -44588 M 58.8 0 32 (If DECps is not installed on your system, the amount of time that the program is going to wait) W 288 -45988 M (while collecting disk usage information must be provided in the command line as shown below:) h 288 -47388 M 288 -48788 M ($HSC_LOADING/RUNTIME="0 01:00:00") h 288 -50188 M (\(This will cause the program to collect disk usage data for 1 hour\)) h 288 -51588 M ( ) h 288 -52988 M 173.3 0 32 (The command procedure manual_hsc_loading.com will use the correct command to produce) W 288 -54388 M 154.5 0 32 (the HSC_LOADING reports and will also produce three command files set_path, force_path) W 288 -55788 M 136.3 0 32 (and clear_path. These procedures can be used to set/force/clear the disk's preferred path \(the) W 288 -57188 M 46.9 0 32 (path must be set on ALL CI nodes prior to forcing the path\) and adding the set_path procedure) W 288 -58588 M 49.4 0 32 (to system startup files prior to the mounting of disk will attempt to mount the disks on the pre\255) W 288 -59988 M 37.4 0 32 (ferred paths after a reboot. It is suggested that the clear_path be used after the mounts are com\255) W 288 -61388 M (plete to remove preferred path information in MI clusters.) h 288 -62788 M 288 -64188 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (4) h -7286 75354 T showpage $P e %%Page: 5 5 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f 140.3 0 32 (Automatic mode runs hsc_loading and then uses SYSMAN to set the preferred path on each) W 288 -2588 M 9.8 0 32 (node in the cluster and then forces the disks to failover to the preferred path. Automatic mode is) W 288 -3988 M 469.6 0 32 (invoked by the command @HSC$LOADING:PREFERRED_PATH.COM \(or submit\). If ) W 288 -5388 M 83.0 0 32 (DECps is running on your cluster, it is best to run preferred_path on Saturday morning on the) W 288 -6788 M 55.5 0 32 (busiest node of your cluster \(or modify preferred_path.com to define nodelist as a list of nodes) W 288 -8188 M 91.1 0 32 (to include in the data\) Preferred_path.com uses the previous 5 days of data to avoid reloading) W 288 -9588 M 111.7 0 32 (HSC's due to short\255term data spikes. If DECps is not running on your cluster, preferred_path) W 288 -10988 M 9.1 0 32 (should be run during the busiest part of your workday to insure that the loading data is accurate) W 288 -12388 M 117.5 0 32 (\(it sleeps for a hour, so it won't add to your system load\).This procedure will use the correct) W 288 -13788 M 185.9 0 32 (command to produce the HSC_LOADING reports and will also produce the command files) W 288 -15188 M 63.8 0 32 (set_path, force_path and clear_path. Preferred_path uses these procedures to set/force/clear the) W 288 -16588 M 221.3 0 32 (disk's preferred path and adding the set_path procedure to system startup files prior to the) W 288 -17988 M 142.8 0 32 (mounting of disks will attempt to mount the disks on the preferred paths after a reboot. It is) W 288 -19388 M 116.9 0 32 (suggested that the clear_path be used after the mounts are complete to remove preferred path) W 288 -20788 M (information in MI clusters.) h 288 -22788 M 288 -24188 M 288 -26188 M 288 -27457 M 288 -29414 M 288 -32764 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (5) h 288 -2626 M -7286 75354 T showpage $P e %%Page: 6 6 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1338 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1400 o f (Program Logic) h 8726 -1338 M 288 -3988 M n 0.857 o f 83.0 0 32 (Hsc_loading reads a list of disks and hsc/requestor pairs from hsc$loading:disk_cable_hsc.dat.) W 288 -5388 M 6.7 0 32 (The disk loads are determined from either DECps .cpd files or from the operations performed to) W 288 -6788 M 144.1 0 32 (the disks during a user specified interval. The list of disks is sorted by descending operation) W 288 -8188 M 76.3 0 32 (counts. The disk and cable data to is used to produce a list of requesters including the number) W 288 -9588 M 9.3 0 32 (of disks connected to the requestor and the requester load if all of these disks were active to that) W 288 -10988 M 49.1 0 32 (requester. If any disks are single ported, they are assigned to the requestor named because they) W 288 -12388 M 20.9 0 32 (cannot be failed over and their load must be on the requestor specified. The remaining disks are) W 288 -13788 M 17.7 0 32 (processed in descending load order and assigned to the least loaded of it's two possible request\255) W 288 -15188 M 39.2 0 32 (ers. If the choices are equally loaded, the disk is assigned to the requestor with the lower maxi\255) W 288 -16588 M 46.4 0 32 (mum active load. Members of controller\255based shadow\255sets must both be on the same HSC so) W 288 -17988 M 30.9 0 32 (the loading of all shadow\255set members is performed when the most heavily used member is en\255) W 288 -19388 M 52.9 0 32 (countered. Unused disks are given an operation count of one so that new or spare disks will be) W 288 -20788 M (not all be assigned to the first requester listed. ) h 288 -22188 M 288 -23588 M 29.9 0 32 (Hsc_loading produces a file, hsc$loading:disk_path.dat that shows the disk operation count and) W 288 -24988 M (the preferred path for each disk.) h 288 -26388 M 288 -27788 M 271.5 0 32 (Reports are produced showing the new hsc/requestor loading and a list of disks requiring) W 288 -29188 M 38.2 0 32 (switching if a manual switching procedure is preferred. These reports are described later in this ) W 288 -30588 M (document.. ) h 288 -33938 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide  O$ HSCLOAD010.AZ[HSC.A]HSCLOAD010_UG.PS;2@> ) Page ) h (6) h 288 -2626 M -7286 75354 T showpage $P e %%Page: 7 7 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1338 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1400 o f (Program Inputs) h 8960 -1338 M ( ) h 288 -3988 M n 0.857 o f 450.1 0 32 (Hsc$loading:disk_cable_hsc.dat can created either by executing the command procedure) W 288 -5388 M 862.4 0 32 (hsc$loading:build_disk_cable.com \(used by the IVP\) or by running the program) W 288 -6788 M 144.2 0 32 (hsc$loading:build_disk_cable.exe. This file can also be edited using a standard text editor. If) W 288 -8188 M 59.9 0 32 (disk unit numbers are changed or disk to requestor wiring changes, this file should be changed) W 288 -9588 M 27.1 0 32 (to reflect the new wiring or the accuracy of the loading given by hsc_loading will be unpredict\255) W 288 -10988 M 96.1 0 32 (able. Rerunning the command procedure hsc$loading:build_disk_cable.com will produce a re\255) W 288 -12388 M 35.5 0 32 (port on differences between the current cabling file and what was seen by going out and asking) W 288 -13788 M 29.1 0 32 (the HSC's. The data contained in this file can be determined by tracing the cables between disk) W 288 -15188 M 170.6 0 32 (and HSC \(this can be very difficult, but the data may already exist in the Site Management) W 288 -16588 M 41.7 0 32 (Guide\) or by asking the HSC what disks it can see by using the Show Disk at the HSC console) W 288 -17988 M 44.2 0 32 (or after doing a $set host/hsc hsc_node_name. Unfortunately Show Disk command cannot give) W 288 -19388 M 29.2 0 32 (information about disks that are active on another HSC, so you may have to failover all of your) W 288 -20788 M (mounted disks to get all of the data you need. ) h 288 -22188 M 288 -23588 M 55.9 0 32 (If you edit the file, make sure that you use spaces instead of tabs to align the columns, that the) W 288 -24988 M (requestor numbers are not 00 and that there are single spaces between each field. ) h 288 -26388 M 288 -27788 M (An example of the cabling file is shown below:) h 288 -29188 M 288 -30588 M (HSC$LOADING:DISK_CABLE_HSC.DAT) h 288 -32438 M 288 -33638 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1000 o f (DISK HSC A REQ HSC B REQ CONTROLLER\255BASED SHADOW SET ) h 288 -34838 M 288 -36038 M ($2$DUA88: HSC006 06 HSC007 07) h 288 -37238 M ($2$DUA91: HSC006 06 HSC007 05) h 288 -38438 M ($2$DUA96: HSC006 04 HSC007 06) h 288 -39638 M ($2$DUA103: HSC006 05 HSC007 04) h 288 -40838 M ($2$DUA128: HSC006 07 HSC007 06) h 288 -42038 M ($2$DUA129: HSC006 07 HSC007 06) h 288 -43238 M ($2$DUA130: HSC006 07 HSC007 06 $2$DUS0:) h 288 -44438 M ($2$DUA131: HSC006 07 HSC007 08 $2$DUS0:) h 288 -45638 M 288 -46838 M 288 -48188 M /Times-Roman-ISOLatin1 F 1200 o f (Disk is a 15 character physical device name. Disks that are not included in the list, are not ) h 288 -49588 M (mounted or are mounted foreign at program run time will not be included in the load balancing.) h 288 -50988 M (HSC A is the 6 character name of the HSC connected to the A port of the disk.) h 288 -52388 M (REQ \(A\) is the two character Requestor Number \(not 0\) of the requestor in HSC A that is) h 288 -53788 M (connected to the A port of the disk. Any number between 1 and 20 could be used but all disks) h 288 -55188 M (connected to the same requestor must use the same number unique to the HSC.) h 288 -56588 M (HSC B is the 6 character name of the HSC connected to the B port of the disk. ) h 288 -57988 M (REQ \(B\) is the two character Requestor Number \(not 0\) of the requestor in HSC B that is) h 288 -59388 M (connected to the B port of the disk. Any number between 1 and 20 could be used but all disks) h 288 -60788 M (connected to the same requestor must use the same number unique to the HSC. ) h 288 -62188 M (Controller\255based shadow\255set is the name of the shadow set of which the disk is a member.) h -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (7) h 288 -2626 M -7286 75354 T showpage $P e %%Page: 8 8 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1338 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1400 o f (Program Outputs) h 9893 -1338 M 288 -3988 M n 0.857 o f (Hsc$loading:disk_path.dat lists each disk and its preferred loading as determined by the) h 288 -5388 M (hsc_loading program. If Preferred_path.com is run a copy of this file with the date in the) h 288 -6788 M (filename is created in the HSC$LOADING directory to log the changes made over time.) h 288 -8188 M 288 -9438 M 288 -10638 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1000 o f ( DISK HSC REQ #I/O'S * IF DIFFERENT THEN CURRENT HSC ) h 288 -11838 M 288 -13038 M ( $2$DUA96: HSC006 4 19726556*) h 288 -14238 M ( $2$DUA103: HSC006 5 14132188*) h 288 -15438 M ( $2$DUA131: HSC007 8 12473927 ) h 288 -16638 M ( $2$DUA128: HSC006 7 5094922*) h 288 -17838 M ( $2$DUA91: HSC007 5 3361319 ) h 288 -19038 M ( $2$DUA129: HSC007 6 3243510 ) h 288 -20238 M ( $2$DUA133: HSC006 8 3110731*) h 288 -21438 M ( $2$DUA88: HSC007 7 2680404 ) h 288 -22638 M ( $2$DUA130: HSC007 6 2482520 ) h 288 -23838 M 288 -25188 M 288 -26588 M /Times-Roman-ISOLatin1 F 1200 o f (DISK is the 12 character physical device name from hsc$loading:disk_cable_hsc.dat.) h 288 -27988 M 288 -29388 M (HSC is the preferred HSC for this disk as determined by the hsc_loading program.) h 288 -30788 M 288 -32188 M (REQ is the Requestor on the HSC to which DISK is connected.) h 288 -33588 M 288 -34988 M (#I/O'S is the number of operations that were performed to DISK during the period used by) h 288 -36388 M (hsc_loading. ) h 288 -37788 M 288 -39188 M (A * is placed after the operations if the new HSC/requestor is different then the HSC/requestor) h 288 -40588 M (currently being used \(a switch will be made between disk ports\).) h 288 -41838 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide 5 Page ) h (8) h 288 -2626 M -7286 75354 T showpage $P e %%Page: 9 9 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Hsc$loading:new_loading.rpt shows how the load on HSC Requesters will change due to the) h 288 -2588 M (new loading scheme. Note that the heaviest used disks are now alone on a requestor. ) h 288 -3988 M 288 -5238 M 288 -6438 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1000 o f (HSC$LOADING:NEW_LOADING.RPT ) h 288 -7638 M (HSC REQUESTOR # DISKS CURRENT LOAD NEW LOAD) h 288 -8838 M 288 -10038 M (HSC006 REQ# 3 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 126309) h 288 -11238 M (HSC006 REQ# 4 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 19726556) h 288 -12438 M (HSC006 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 14132188) h 288 -13638 M (HSC006 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 2812157) h 288 -14838 M (HSC006 REQ# 7 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 5094922) h 288 -16038 M (HSC006 REQ# 8 # DISKS= 3/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 4932285) h 288 -17238 M (HSC007 REQ# 3 # DISKS= 1/ 1 CURRENT LOAD= 887380 PROPOSED LOAD= 887380) h 288 -18438 M (HSC007 REQ# 4 # DISKS= 2/ 4 CURRENT LOAD= 15683802 PROPOSED LOAD= 1425306) h 288 -19638 M (HSC007 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 6173477 PROPOSED LOAD= 3361319) h 288 -20838 M (HSC007 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 30547508 PROPOSED LOAD= 5726030) h 288 -22038 M (HSC007 REQ# 7 # DISKS= 4/ 4 CURRENT LOAD= 6144614 PROPOSED LOAD= 6144614) h 288 -23238 M (HSC007 REQ# 8 # DISKS= 1/ 4 CURRENT LOAD= 17406212 PROPOSED LOAD= 12473927) h 288 -24438 M (HSC007 REQ# 9 # DISKS= 3/ 3 CURRENT LOAD= 477679 PROPOSED LOAD= 477679) h 288 -25638 M 288 -26988 M 288 -28388 M /Times-Roman-ISOLatin1 F 1200 o f (HSC is the name of the HSC where the Requestor is located. ) h 288 -29788 M 288 -31188 M (REQ# is the Requestor number from hsc$loading:disk_cable_hsc.dat.) h 288 -32588 M 288 -33988 M (# DISKS shows the number of disks that have this Requestor as the preferred port / the number) h 288 -35388 M (of disks connected to this Requestor.) h 288 -36788 M 288 -38188 M (CURRENT LOAD is the total I/O operations from all disks using this Requestor before ) h 288 -39588 M (Hsc_loading was run.) h 288 -40988 M 288 -42388 M (NEW LOAD is the current load restated as it would be if the preferred paths had bee d$ HSCLOAD010.AZ[HSC.A]HSCLOAD010_UG.PS;2@ :n in effect) h 288 -43788 M (when the load was generated.) h 288 -45038 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (9) h 288 -2626 M -7286 75354 T showpage $P e %%Page: 10 10 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Hsc$loading:manual_hsc_loading.rpt can be used to manually fail over the disks using the port) h 288 -2588 M (buttons if you do not want the hsc_loading software to automatically do the load balancing. The) h 288 -3988 M (A/B preferred port assumes that the first HSC in the disk_cable_hsc.dat file is connected to the) h 288 -5388 M (A port of the disk. If this is not true \(as will most likely be the case if the unmodified file) h 288 -6788 M (created by the IVP is used\), use the file disk_path.dat for manual loading and failover the disks) h 288 -8188 M (marked with an *.) h 288 -9588 M 288 -10988 M (Only Disks that should be switched to the other port are shown.) h 288 -12388 M 288 -13638 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1000 o f (HSC$LOADING:MANUAL_HSC_LOADING.RPT) h 288 -14838 M 288 -16038 M ( DISK HSC REQ PREFERRED PORT) h 288 -17238 M 288 -18438 M ( $2$DUA96: HSC006 4 A) h 288 -19638 M ( $2$DUA103: HSC006 5 A) h 288 -20838 M ( $2$DUA128: HSC006 7 B) h 288 -22038 M ( $2$DUA133: HSC006 8 A) h 288 -23238 M 288 -24438 M 6048 -24438 M 11808 -24438 M 17568 -24438 M 288 -25788 M /Times-Roman-ISOLatin1 F 1200 o f (DISK is the physical device name of the disk to be switched.) h 288 -27188 M 288 -28588 M (HSC is the HSC to which the DISK will be switched.) h 288 -29988 M 288 -31388 M (REQ is the Requestor on the HSC that DISK is connected to.) h 288 -32788 M 288 -34188 M (PREFERRED PORT is the disk port that the disk should be using. The other disk port should) h 288 -35588 M (be disabled \(press in to release the button/turn off the light\) until the disk fails over to the) h 288 -36988 M (correct port, then press again to enable failover. An operation to the disk is required to force the) h 288 -38388 M (failover in most cases. If the preferred port has a hardware error, it will not be possible to force) h 288 -39788 M (failover and the other port should be used until the hardware error can be fixed. ) h 288 -41188 M 288 -42626 M -7200 7200 T 7286 -75354 T N 0 G 288 -1188 M (DEChscload v1.0 Users Guide Page ) h (10) h 288 -2626 M -7286 75354 T showpage $P e %%Trailer $D restore end % DEC_WRITE_dict %%Pages: 10 %%DocumentFonts: Times-Roman %%+ Helvetica-Bold %%+ Courier *[HSC.A]HSC_LOADING_DECPS.FOR;27+,.4/ 4Q41-Z0123KPWO556A7@F3<^89GHJCCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CHC THIS PROGRAM ACCEPTS A FILE CONTAINING PHYSICAL DISK NUMBERS AND THEIRDC HSC/REQUESTOR FOR EACH PORT AND USES I/O INFORMATION FROM DECPS TOIC PRODUCE AN HSC-LOADING THAT MINIMIZES THE REQUESTOR LOADS. THIS LOADINGEC FILE CAN BE USED BY PREFERRED_PATH.COM TO ACTUALLY PERFORM THE HSC C LOAD BALANCING. CHC THIS FILE CONTAINS ADDITIONAL INFORMATION (BEYOND HOST NAME) ABOUT THEFC PROPOSED LOADING (REQUESTOR,I/O'S AND A * IF THE HSC FOR A DISK HAS EC CHANGED) THAT IS NOT USED BY PREFERRED_PATH BUT HELP TO EXPLAIN WHY$C THE LOADING WAS PERFORMED AS DONE.CGC THIS PROGRAM REQUIRES THE LIBRARY SYS$LIBRARY:PSPA$LIB.FOR TO COMPILE>C (PROVIDED WITH DECPS AS THE FORTRAN DATA EXTRACTION LIBRARY)CC PROGRAM INPUTS:GC INPUTS TO THIS PROGRAM ARE DECPS (PSPA$DATABASE:*.CPD) DATA FILES ANDDC HSC$LOADING:DISK_CABLE_HSC.DAT. IF DISK UNIT NUMBERS ARE CHANGED, FC DISK_CABLE_HSC.DAT MUST BE UPDATED TO REFLECT THE NEW CABLING OR THEIC ACCURACY OF THIS PROGRAM WILL BE UNPREDICTABLE. THE FORMAT OF EACH DISKJC RECORD IN DISK_CABLE_HSC.DAT IS AS FOLLOWS (HSC/REQUESTOR # CANNOT BE 0)C2CDISK HSC A REQ HSC B REQ SHADOW-SET NAMEC!C$2$DUA88: HSC006 06 HSC007 07!C$2$DUA91: HSC006 06 HSC007 05!C$2$DUA96: HSC006 04 HSC007 06!C$2$DUA103: HSC006 05 HSC007 04!C$2$DUA128: HSC006 07 HSC007 06!C$2$DUA129: HSC006 07 HSC007 06*C$2$DUA130: HSC006 07 HSC007 06 $1$DUS1:*C$2$DUA131: HSC006 07 HSC007 08 $1$DUS0:C*C DISK - 15 CHARACTER PHYSICAL DEVICE NAME'C HSC A/B - 6 CHARACTER HSC DEVICE NAMEAC REQ A/B - TWO CHARACTER NUMBER BETWEEN 1 AND 20 (HSC>SHOW DISK)GC SHADOW SET NAME IF THE DISK IS THE MEMBER OF A CONTROLLER-BASED S-SET,C THERE ARE SINGLE SPACES BETWEEN EACH FIELDCC PROGRAM OUTPUTS:=C HSC$LOADING:NEW_LOADING.RPT DESCRIBES THE PROPOSED CHANGES:EC (NOTE THAT THE HEAVILY USED DISKS ARE NOW ALONE ON A HSC REQUESTOR)CPCHSC# 6 REQ# 3 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 126309PCHSC# 6 REQ# 4 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 19726556PCHSC# 6 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 14132188PCHSC# 6 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 2812157PCHSC# 6 REQ# 7 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 5094922PCHSC# 6 REQ# 8 # DISKS= 3/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 4932285PCHSC# 7 REQ# 3 # DISKS= 1/ 1 CURRENT LOAD= 887380 PROPOSED LOAD= 887380PCHSC# 7 REQ# 4 # DISKS= 2/ 4 CURRENT LOAD= 15683802 PROPOSED LOAD= 1425306PCHSC# 7 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 6173477 PROPOSED LOAD= 3361319PCHSC# 7 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 30547508 PROPOSED LOAD= 5726030PCHSC# 7 REQ# 7 # DISKS= 4/ 4 CURRENT LOAD= 6144614 PROPOSED LOAD= 6144614PCHSC# 7 REQ# 8 # DISKS= 1/ 4 CURRENT LOAD= 17406212 PROPOSED LOAD= 12473927PCHSC# 7 REQ# 9 # DISKS= 3/ 3 CURRENT LOAD= 477679 PROPOSED LOAD= 477679C;C /OUTPUT=FILENAME.EXT (DEFAULT=HSC$LOADING:DISK_PATH.DAT) ?C DISK HSC REQ #I/O'S * IF DIFFERENT THEN CURRENT HSC C!C $2$DUA96: HSC006 4 19726556*!C $2$DUA103: HSC006 5 14132188*!C $2$DUA131: HSC007 8 12473927 !C $2$DUA128: HSC006 7 5094922*!C $2$DUA91: HSC007 5 3361319 !C $2$DUA129: HSC007 6 3243510 !C $2$DUA133: HSC006 8 3110731*!C $2$DUA88: HSC007 7 2680404 !C $2$DUA130: HSC007 6 2482520 C0C OUTPUT FILE HSC$LOADING:MANUAL_HSC_LOADING.RPTCPC DISK HSC REQ PREFERRED PORT(ONLY DISKS REQUIRING A SWITCH ARE SHOWN) CC $2$DUA96: HSC006 4 AC $2$DUA103: HSC006 5 AC $2$DUA128: HSC006 7 BC $2$DUA133: HSC006 8 ACC PROGRAM LOGIC:BC READ LIST OF DISKS, HSC/REQUESTOR PAIRS FROM DISK_CABLE_HSC.DATC INTO DISK_ARRAY.C2C ADD DECPS I/O COUNT AND # RECORDS TO DISK_ARRAYC+C SORT DISK_ARRAY BY DESCENDING I/O COUNT C=C BUILD THE REQUESTOR_ARRAY(HSC,REQUESTOR) # DISKS,MAX LOAD,C FROM DISK_ARRAYCAC TRAVERSE DISK_ARRAY(1-MAX_DISKS) UPDATING THE REQUESTOR_ARRAY.;C ASSIGN DISKS TO THE REQUESTOR WITH THE SMALLER ADD_LOAD.CC IN CASE OF TIES (MOST LIKELY 2 UNASSIGNED REQUESTORS) ASSIGN THE0C DISK TO THE REQUESTOR WITH THE LOWER MAX_LOADC GC 1/7/92 DRB DEC ADDED LOGIC FOR CONTROLLER-BASED SHADOW SETS (MEMBERS0C MUST BE ON THE SAME HSC SO LOAD THEM AS A SETCHC 7/793 DRB DEC CHANGED LOGIC SO THAT THE FIRST DISK ON INDENTICLY WIREDBC REQUESTERS WILL STAY ON THE SAME HSC TO AVOID SWITCHING ALL THE C DISKS IF LOAD HASN'T CHANGED. PROGRAM HSC_LOADING IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)'# INCLUDE 'SYS$LIBRARY:PSPA$LIB.FOR' INCLUDE '($CLIDEF)' INCLUDE '($SYSSRVNAM)' CHARACTER*64 HOST CHARACTER*64 ]$ HSCLOAD010.AZ[HSC.A]HSC_LOADING_DECPS.FOR;27Q4L" ALTHOST CHARACTER*32 DEV CHARACTER*64 DEVICEN CHARACTER*12 VOLNAME CHARACTER*25 START_TIME CHARACTER*25 STOP_TIME CHARACTER*39 OUTPUT_FILE CHARACTER*15 DEVICE CHARACTER*15 SSNAME CHARACTER*6 HSCA_NAM CHARACTER*6 HSCB_NAM CHARACTER*6 CUR_PRF CHARACTER*6 CUR_ACT CHARACTER*6 NEW_PRF CHARACTER*2 REQA CHARACTER*2 REQB CHARACTER*1 MARKER INTEGER*2 CHAN INTEGER*4 STATUS INTEGER*4 HSCA_NUM INTEGER*4 IREQA INTEGER*4 HSCB_NUM INTEGER*4 IREQB INTEGER*4 IOREC INTEGER*4 MAX_DISKS INTEGER*4 PSPA$OPEN_CONTEXT INTEGER*4 PSPA$READ_CONTEXT INTEGER*4 PSPA$CLOSE_CONTEXT INTEGER*4 CLI$GET_VALUE INTEGER*4 CLI$PRESENT INTEGER*4 MAX_HSC INTEGER*4 NODE_NAME_SIZE INTEGER*4 OUTPUT_FILE_SIZE INTEGER*4 MAX_INDEX INTEGER*4 BEG_LEN INTEGER*4 END_LEN INTEGER*4 DEVICEL INTEGER*4 VOLNAM_B INTEGER*4 IOCNT INTEGER*4 HOSTLEN EXTERNAL CLI$_ABSENT EXTERNAL PSPA$_NOMORE RECORD /CONTEXT/ PSPA$CTX(C DISK_ARRAY SET UP FOR UP TO 1000 DISKS STRUCTURE /DISKS/ CHARACTER*15 DEVICE INTEGER*4 DEVICEL CHARACTER*64 DEVICEN CHARACTER*6 HSCA_NAM INTEGER*4 HSCA_NUM INTEGER*4 REQA CHARACTER*6 HSCB_NAM INTEGER*4 HSCB_NUM INTEGER*4 REQB CHARACTER*15 SHADOW CHARACTER*6 CUR_PRF CHARACTER*6 CUR_ACT CHARACTER*6 NEW_PRF INTEGER*4 NEW_REQ INTEGER*4 IOREC INTEGER*4 IOCNT CHARACTER*1 AORB END STRUCTURE RECORD /DISKS/ DISK_ARRAY(1000) RECORD /DISKS/ HOLDARRAY<C REQUESTOR ARRAY (HSC#,REQ#) [HOW MANY'S REQS IN A HSC90??] STRUCTURE /HSCS/ INTEGER*4 NUM_DISKS (20) INTEGER*4 MAX_LOAD (20) INTEGER*4 CUR_LOAD (20) INTEGER*4 ADD_LOAD (20) INTEGER*4 ADD_DISKS (20) END STRUCTURE RECORD /HSCS/ REQ(100)&C HSC_ARRAY SET UP FOR UP TO 100 HSC'S STRUCTURE /HSC_NUMBERS/ CHARACTER*6 HNAME END STRUCTURE$ RECORD /HSC_NUMBERS/ HSC_ARRAY(100)*C SET UP THE ITEMLIST FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(7) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLST Structure / str_disk / Character*12 DEV_T_VOLNAME Character*15 DEV_T_DEVNAME7 Character*6 DEV_T_NODENAME ! disk server node name7 Character*40 DEV_T_HWNAME ! CPU type of disk owner Byte DEV_B_DEV_TYPE. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput rate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rate- Real*4 DEV_F_MSCPIO ! MSCP thruput rate( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEV Common / COM$CTX / PSPA$CTX+ Common / COM$ARRAY / DISK_ARRAY,MAX_DISKS( Common / HSC$ARRAY / HSC_ARRAY,MAX_HSCC SETUP DECPS CONTEXT RECORD; PSPA$CTX.CTX$T_SCHED_SUN = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_MON = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_TUE = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_WED = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_THU = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_FRI = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_SAT = CHAR(255)//CHAR(255)//CHAR(255)C(C Get parameters and qualifiers from DCLC?C BEGINNING TIME IS OPTIONAL BUT HAS A DEFAULT OF YESTERDAY 8AM8 STATUS = CLI$GET_VALUE ('BEGINNING',START_TIME,BEG_LEN)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))<C ENDING TIME IS OPTIONAL BUT HAS A DEFAULT OF YESTERDAY 5PM4 STATUS = CLI$GET_VALUE ('ENDING',STOP_TIME,END_LEN)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))+C OUTPUT FILE IS OPTIONAL BUT HAS A DEFAULT IF(CLI$PRESENT('OUTPUT')) THENA STATUS = CLI$GET_VALUE ('OUTPUT',OUTPUT_FILE,OUTPUT_FILE_SIZE)1 IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) END IFC BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 64( ITMLST.ITEM(1).BUFCODE = DVI$_HOST_NAME! ITMLST.ITEM(1).ADDR = %LOC(HOST)' ITMLST.ITEM(1).ADDRLEN = %LOC(HOSTLEN) ITMLST.ITEM(2).BUFLEN = 4& ITMLST.ITEM(2).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(2).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(2).ADDRLEN = 0 ITMLST.ITEM(3).BUFLEN = 4' ITMLST.ITEM(3).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(3).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(3).ADDRLEN = 0 ITMLST.ITEM(4).BUFLEN = 4% ITMLST.ITEM(4).BUFCODE = DVI$_ERRCNT# ITMLST.ITEM(4).ADDR = %LOC(ERRCNT) ITMLST.ITEM(4).ADDRLEN = 0 ITMLST.ITEM(5).BUFLEN = 64, ITMLST.ITEM(5).BUFCODE = DVI$_ALT_HOST_NAME$ ITMLST.ITEM(5).ADDR = %LOC(ALTHOST) ITMLST.ITEM(5).ADDRLEN = 0 ITMLST.ITEM(6).BUFLEN = 64) ITMLST.ITEM(6).BUFCODE = DVI$_FULLDEVNAM$ ITMLST.ITEM(6).ADDR = %LOC(DEVICEN)' ITMLST.ITEM(6).ADDRLEN = %LOC(DEVICEL) ITMLST.ITEM(7).BUFLEN = 12% ITMLST.ITEM(7).BUFCODE = DVI$_VOLNAM$ ITMLST.ITEM(7).ADDR = %LOC(VOLNAME)( ITMLST.ITEM(7).ADDRLEN = %LOC(VOLNAM_B) END_OF_LIST = 0  C OPEN DISK_CABLE_HSC FILE@ OPEN(UNIT=1,FILE='HSC$LOADING:DISK_CABLE_HSC.DAT',STATUS='OLD',% 1 RECL=52,ORGANIZATION='SEQUENTIAL') MAX_DISK = 0:C DEFINED "DISKS" LOOP (CHECK BEFORE ADDING TO DISK_ARRAY) 10 CONTINUE HSCA_NAM = ' ' HSCB_NAM = ' ' SSNAME = ' '; READ(1,11,END=19)DEVICE,HSCA_NAM,REQA,HSCB_NAM,REQB,SSNAME011 FORMAT(1X,A15,1X,A6,1X,A2,1X,A6,1X,A2,1X,A15)BC IF BOTH PORTS ARE EMPTY, IGNORE THE DISK (HOW CAN YOU LOAD IT??)E IF ((HSCA_NAM .EQ. ' ') .AND. (HSCB_NAM .EQ. ' ')) GOTO 10!C ASSIGN A CHANNEL TO THE DEVICE # STATUS = SYS$ASSIGN(DEVICE,CHAN,,) IF (.NOT. STATUS) THEN? TYPE *,'Device ',DEVICE, 'Not on this system, current load=0' HOST = ' ' GOTO 12 END IF:C GET THE DEVICE INFORMATION INCLUDING PRIMARY PATH [HOST]. STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,) IF (.NOT. STATUS) THEN CALL LIB$SIGNAL (%VAL(STATUS)) GOTO 12 END IF$C DEASSIGN THE CHANNEL TO THE DEVICE STATUS = SYS$DASSGN(%VAL(CHAN)) IF (.NOT. STATUS) THEN CALL LIB$SIGNAL (%VAL(STATUS)) GOTO 12 END IFC IS IT A DISK! IF (DEVCLASS .NE. DC$_DISK) THEN% CALL LIB$SIGNAL(%VAL(SS$_IVDEVNAM)) GOTO 12 END IFC IS IT MOUNTED IF (.NOT. DEV$V_MNT) THEN( CALL LIB$SIGNAL(%VAL(SS$_DEVNOTMOUNT)) GOTO 12 END IFC MOUNTED FOREIGN IF (DEV$V_FOR) THEN' CALL LIB$SIGNAL(%VAL(SS$_DEVFOREIGN)) GOTO 12 END IF&C DEVICE IS A MOUNTED NON-FOREIGN DISK 12 CONTINUE MAX_DISKS = MAX_DISKS + 1BC CONVERT THE ASCII TEXT FROM THE FILE TO INTEGERS THAT WE CAN USE HSCA_NUM = 0 IREQA = 0 HSCB_NUM = 0 IREQB = 0! IF (HSCA_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQA),%REF(IREQA))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))( CALL GET_HSC_NUMBER(HSCA_NAM,HSCA_NUM) END IF! IF (HSCB_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQB),%REF(IREQB))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))( CALL GET_HSC_NUMBER(HSCB_NAM,HSCB_NUM) END IF<C DEVICEN IS THE PHYSICAL DISK NAME RETURNED FROM SYS$GETDVI& DISK_ARRAY(MAX_DISKS).DEVICE = DEVICE( DISK_ARRAY(MAX_DISKS).DEVICEL = DEVICEL( DISK_ARRAY(MAX_DISKS).DEVICEN = DEVICEN* DISK_ARRAY(MAX_DISKS).HSCA_NAM = HSCA_NAM* DISK_ARRAY(MAX_DISKS).HSCA_NUM = HSCA_NUM# DISK_ARRAY(MAX_DISKS).REQA = IREQA* DISK_ARRAY(MAX_DISKS).HSCB_NAM = HSCB_NAM* DISK_ARRAY(MAX_DISKS).HSCB_NUM = HSCB_NUM# DISK_ARRAY(MAX_DISKS).REQB = IREQB0 DISK_ARRAY(MAX_DISKS).CUR_ACT = HOST(1:HOSTLEN)& DISK_ARRAY(MAX_DISKS).SHADOW = SSNAME) DISK_ARRAY(MAX_DISKS).NEW_PRF = ' ' C NEXT DISK GOTO 10 C END OF FILE 19 CONTINUE CLOSE(UNIT=1)HC NODE IS A REQUIRED PARAMETER AND MAY BE A LIST THAT NEEDS TO BE PARSED 20 CONTINUEF STATUS = CLI$GET_VALUE('NODE',PSPA$CTX.CTX$T_NODENAME,NODE_NAME_SIZE)0 IF (STATUS .EQ. %LOC( CLI$_ABSENT ) ) GOTO 9001/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)): TYPE *,'PROCESSING NODE ',PSPA$CTX.CTX$T_NODENAME,' DATA'( PSPA$CTX.CTX$B_NODELEN = NODE_NAME_SIZE< CALL SYS$BINTIM(START_TIME(1:BEG_LEN),PSPA$CTX.CTX$L_START): CALL SYS$BINTIM(STOP_TIME(1:END_LEN),PSPA$CTX.CTX$L_STOP)CQC Open DECPS Context TO OBTAIN D $ HSCLOAD010.AZ[HSC.A]HSC_LOADING_DECPS.FOR;27Q4E"ISK USAGE AND HOTFILES INFO IF NODE WAS SPECIFIEDC% STATUS = PSPA$OPEN_CONTEXT(PSPA$CTX), IF ( .NOT. STATUS ) CALL PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR,! 1 PSPA$CTX.CTX$L_RMS_ERR,# 1 PSPA$CTX.CTX$L_RMS_IOSB ) STATUS = 1 DO WHILE ( STATUS )* STATUS = PSPA$READ_CONTEXT( PSPA$CTX )5 IF ( STATUS .EQ. %LOC( PSPA$_NOMORE ) ) GOTO 9000, IF ( .NOT. STATUS ) CALL PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR,! 1 PSPA$CTX.CTX$L_RMS_ERR,# 1 PSPA$CTX.CTX$L_RMS_IOSB )- IF ( PSPA$CTX.CTX$L_DEV_CNT .NE. 0 ) THEN2 CALL GET_PSPA_DISK(%VAL(PSPA$CTX.CTX$A_DEV_REC), 1 PSPA$CTX.CTX$L_DEV_CNT) END IF END DO 9000 CONTINUE( STATUS = PSPA$CLOSE_CONTEXT( PSPA$CTX ), If ( .NOT. STATUS ) Call PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR,! 1 PSPA$CTX.CTX$L_RMS_ERR,# 1 PSPA$CTX.CTX$L_RMS_IOSB )4C LOOP THROUGH ALL NODES SPECIFIED UNTIL CLI$_ABSENT GOTO 20 9001 CONTINUE(C SORT THE DISK_ARRAY BY I/O'S PERFORMED250 INVERSIONS = 0 DO 260 K = 1, MAX_DISKS-1 DO 270 L = K+1, MAX_DISKS9 IF (DISK_ARRAY(K).IOCNT .LT. DISK_ARRAY(L).IOCNT) THEN  HOLDARRAY = DISK_ARRAY(K) DISK_ARRAY(K) = DISK_ARRAY(L) DISK_ARRAY(L) = HOLDARRAY INVERSIONS = 1 GOTO 270 END IF 270 CONTINUE 260 CONTINUE IF (INVERSIONS .EQ. 1) GOTO 2502C BUILD (HSC#,REQ#) ARRAY FROM THE DISK_ARRAY DATA DO 300 L=1,MAX_DISKS@C MAKE I/O COUNT OF UNUSED DISKS 1 TO AVOID MISLOADING NEW DISKSCC (YOU COULD PUT ALL 4 NEW DISKS ON THE SAME REQUESTOR SINCE 0+0=0)8 IF (DISK_ARRAY(L).IOCNT .EQ. 0) DISK_ARRAY(L).IOCNT = 1/ IF (DISK_ARRAY(L).HSCA_NAM .NE. ' ') THEN I = DISK_ARRAY(L).HSCA_NUM N = DISK_ARRAY(L).REQA ? REQ(I).MAX_LOAD(N) = REQ(I).MAX_LOAD(N) + DISK_ARRAY(L).IOCNT/ REQ(I).NUM_DISKS(N) = REQ(I).NUM_DISKS(N) + 19 IF (DISK_ARRAY(L).HSCA_NAM .EQ. DISK_ARRAY(L).CUR_ACT) @ 1 REQ(I).CUR_LOAD(N) = REQ(I).CUR_LOAD(N) + DISK_ARRAY(L).IOCNT END IF/ IF (DISK_ARRAY(L).HSCB_NAM .NE. ' ') THEN I = DISK_ARRAY(L).HSCB_NUM N = DISK_ARRAY(L).REQB? REQ(I).MAX_LOAD(N) = REQ(I).MAX_LOAD(N) + DISK_ARRAY(L).IOCNT/ REQ(I).NUM_DISKS(N) = REQ(I).NUM_DISKS(N) + 19 IF (DISK_ARRAY(L).HSCB_NAM .EQ. DISK_ARRAY(L).CUR_ACT) @ 1 REQ(I).CUR_LOAD(N) = REQ(I).CUR_LOAD(N) + DISK_ARRAY(L).IOCNT END IF 300 CONTINUEIC LOAD THE DISKS THAT ARE SINGLE PORTED (CANNOT BE PUT ON THE OTHER PORT) DO 400 M = 1,MAX_DISKS I = DISK_ARRAY(M).HSCA_NUM J = DISK_ARRAY(M).REQA  K = DISK_ARRAY(M).HSCB_NUME L = DISK_ARRAY(M).REQB 0C IF THE B PORT IS EMPTY, WE MUST USE THE A PORT/ IF (DISK_ARRAY(M).HSCB_NAM .EQ. ' ') THENH0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNTS/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1R GOTO 400 END IFC0C IF THE A PORT IS EMPTY, WE MUST USE THE B PORT/ IF (DISK_ARRAY(M).HSCA_NAM .EQ. ' ') THENO0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNTE/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1R GOTO 400 END IFB 400 CONTINUE DO 500 M = 1,MAX_DISKSA2 IF (DISK_ARRAY(M).NEW_PRF .NE. ' ') GOTO 480 I = DISK_ARRAY(M).HSCA_NUMR J = DISK_ARRAY(M).REQA  K = DISK_ARRAY(M).HSCB_NUMS L = DISK_ARRAY(M).REQB 5C CHOOSE BETWEEN PORTS THAT HAVE DISKS LOADED ALREADYT5 IF (REQ(I).ADD_LOAD(J) .LT. REQ(K).ADD_LOAD(L)) THENU0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNTO/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1 GOTO 480 END IF65 IF (REQ(I).ADD_LOAD(J) .GT. REQ(K).ADD_LOAD(L)) THEN$0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT:/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1 GOTO 480 END IFE?C EQUAL LOAD ON REQUESTORS, USE REQUESTOR WITH LOWEST MAX LOAD.25 IF (REQ(I).MAX_LOAD(J) .LT. REQ(K).MAX_LOAD(L)) THENM0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNTA/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1 GOTO 480 END IF 5 IF (REQ(I).MAX_LOAD(J) .GT. REQ(K).MAX_LOAD(L)) THEN 0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT6/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1L GOTO 480 END IF HC EQUAL LOAD ON REQUESTORS AND MAX LOADS ARE EQUAL, ATTEMPT TO KEEP THE C DISK WHERE IT IS.S< IF (DISK_ARRAY(M).HSCA_NAM .EQ. DISK_ARRAY(M).CUR_ACT) THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNT / REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 19 ELSE 0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT / REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1 END IFR 480 CONTINUE>C LOAD ALL CONTROLLER-BASED SHADOW SET MEMBERS TO THE SAME HSC: IF (DISK_ARRAY(M).SHADOW .EQ. ' ') GOTO 500 DO 490 NN = M + 1,MAX_DISKS> IF (DISK_ARRAY(M).SHADOW .NE. DISK_ARRAY(NN).SHADOW) GOTO 490 I = DISK_ARRAY(NN).HSCA_NUM J = DISK_ARRAY(NN).REQA 8 K = DISK_ARRAY(NN).HSCB_NUM L = DISK_ARRAY(NN).REQB A= IF (DISK_ARRAY(M).NEW_PRF .EQ. DISK_ARRAY(NN).HSCA_NAM) THEN2 DISK_ARRAY(NN).NEW_PRF = DISK_ARRAY(NN).HSCA_NAM. DISK_ARRAY(NN).NEW_REQ = DISK_ARRAY(NN).REQA DISK_ARRAY(NN).AORB = 'A'$@ REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(NN).IOCNT/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1  END IF2= IF (DISK_ARRAY(M).NEW_PRF .EQ. DISK_ARRAY(NN).HSCB_NAM) THEN:2 DISK_ARRAY(NN).NEW_PRF = DISK_ARRAY(NN).HSCB_NAM. DISK_ARRAY(NN).NEW_REQ = DISK_ARRAY(NN).REQB DISK_ARRAY(NN).AORB = 'B'D@ REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(NN).IOCNT/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1I END IFU 490 CONTINUE D 500 CONTINUEC OPEN OUTPUT FILE+ OPEN(UNIT=3,FILE=OUTPUT_FILE,STATUS='NEW')TD OPEN(UNIT=5,FILE='HSC$LOADING:MANUAL_HSC_LOADING.RPT',STATUS='NEW') WRITE(5,609)RD609 FORMAT(' DISK UNIT # HSC # REQ # PREFERRED PORT (A OR B)') DO 600 L=1,MAX_DISKSA; IF (DISK_ARRAY(L).NEW_PRF .EQ. DISK_ARRAY(L).CUR_ACT) THEN MARKER = ' ' ELSE  MARKER = '*'8 WRITE(5,610)DISK_ARRAY(L).DEVICE,DISK_ARRAY(L).NEW_PRF,+ 1 DISK_ARRAY(L).NEW_REQ,DISK_ARRAY(L).AORBR END IFN8 WRITE(3,611)DISK_ARRAY(L).DEVICE,DISK_ARRAY(L).NEW_PRF,3 1 DISK_ARRAY(L).NEW_REQ,DISK_ARRAY(L).IOCNT,MARKERA/610 FORMAT(' ',A15,' ',A6,' ',I2,' ',A1)R-611 FORMAT(' ',A15,' ',A6,' ',I2,' ',I9,A1) 600 CONTINUE CLOSE(UNIT=3) CLOSE(UNIT=5)*C WRITE LOADING CHANGES TO NEW_LOADING.RPT= OPEN(UNIT=4,FILE='HSC$LOADING:NEW_LOADING.RPT',STATUS='NEW')C DO 700 I = 1,100I DO 750 J = 1,20) IF (REQ(I).NUM_DISKS(J) .EQ. 0) GOTO 750:6 WRITE(4,760)HSC_ARRAY(I).HNAME,J,REQ(I).ADD_DISKS(J),< 1 REQ(I).NUM_DISKS(J),REQ(I).CUR_LOAD(J),REQ(I).ADD_LOAD(J)6760 FORMAT(' ',A6,' REQ# ',I2,' # DISKS= ',I2,'/',I2,. 1 ' CURRENT LOAD= ',I9,' PROPOSED LOAD= ',I9) 750 CONTINUE 700 CONTINUE CLOSE(UNIT=4) 999 CONTINUE ENDCEC GET_HSC_NUMBERCA/ Subroutine GET_HSC_NUMBER(HSC_NAME,HSC_NUMBER)C Implicit None CHARACTER*6 HSC_NAMEC INTEGER*4 HSC_NUMBERA INTEGER*4 MAX_HSC INTEGER*4 K'C DISK_ARRAY SET UP FOR UP TO 100 HSC'S STRUCTURE /HSC_NUMBERS/ CHARACTER*6 HNAME4 END STRUCTURE$ RECORD /HSC_NUMBERS/ HSC_ARRAY(100)( Common / HSC$ARRAY / HSC_ARRAY,MAX_HSC K = 0 10 CONTINUEN K = K + 1+ IF (HSC_ARRAY(K).HNAME .EQ. HSC_NAME) THENV HSC_NUMBER = K RETURN ENDIF IF (K .LT. MAX_HSC) GOTO 10 MAX_HSC = MAX_HSC + 1$ HSC_ARRAY(MAX_HSC).HNAME = HSC_NAME HSC_NUMBER = MAX_HSCG ReturnL EndCRC GET_PSPA_DISK C4) Subroutine GET_PSPA_DISK( PSPA$DEV, CNT)L Implicit None$ Include 'SYS$LIBRARY:PSPA$LIB.FOR' CHARACTER*15 HOLD_DEVICE  CHARACTER*15 PSPA_DEVICE Integer `@$$ HSCLOAD010.AZ[HSC.A]HSC_LOADING_DECPS.FOR;27Q4- -CNTS Integer STR$COPY_DXR Integer i, j Integer status INTEGER BAREPSPA INTEGER BAREHOLD Integer*4 DEVLENE INTEGER*4 MAX_DISKS(C DISK_ARRAY SET UP FOR UP TO 1000 DISKS STRUCTURE /DISKS/ CHARACTER*15 DEVICE5 INTEGER*4 DEVICEL* CHARACTER*64 DEVICEN CHARACTER*6 HSCA_NAM INTEGER*4 HSCA_NUM INTEGER*4 REQA CHARACTER*6 HSCB_NAM INTEGER*4 HSCB_NUM INTEGER*4 REQB CHARACTER*15 SHADOWI CHARACTER*6 CUR_PRF  CHARACTER*6 CUR_ACT  CHARACTER*6 NEW_PRFE INTEGER*4 NEW_REQI INTEGER*4 IORECR INTEGER*4 IOCNTN CHARACTER*1 AORB END STRUCTURE RECORD /DISKS/ DISK_ARRAY(1000)9 Record / PSPADEVRECS / PSPA$DEV( CNT ) ! DEVICE records2+ Common / COM$ARRAY / DISK_ARRAY,MAX_DISKS I = 1 200 CONTINUEB STATUS = STR$COPY_DX(HOLD_DEVICE,%VAL(PSPA$DEV(I).DEV_A_DEVNAME))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)))3 PSPA_DEVICE = '_'//HOLD_DEVICE(1:LEN(HOLD_DEVICE))S BAREHOLD = LEN(HOLD_DEVICE) BAREPSPA = LEN(PSPA_DEVICE) J = 0 500 J = J + 1D# DEVLEN = DISK_ARRAY(J).DEVICEL - 1RH IF ( PSPA_DEVICE(1:BAREPSPA) .EQ. DISK_ARRAY(J).DEVICEN(1:DEVLEN)) THEN/ DISK_ARRAY(J).IOREC = DISK_ARRAY(J).IOREC + 1 . DISK_ARRAY(J).IOCNT = DISK_ARRAY(J).IOCNT +  1 INT(PSPA$DEV(I).DEV_F_IOCNT)c GOTO 599 END IF  IF (J .LT. MAX_DISKS) GOTO 500cC NO DISK MATCH FOR DECPS DATA 599 I = I + 1 ! IF (.NOT. (I .GT. CNT)) GOTO 200 1100 CONTINUES Returnm End? Subroutine PSPA$STOP( ret_stat, PSPA_code, vr_stat, rms_iosb )O Implicit None$ Include 'SYS$LIBRARY:PSPA$LIB.FOR' Include '($SYSSRVNAM)' Integer ret_stat Integer PSPA_code_ Integer vr_statu Integer rms_iosb Character*80 msg_buff Integer msg_len  Integer status; status = SYS$GETMSG( %VAL( ret_stat ), msg_len, msg_buff ) & Write( *, 100 ) msg_buff( 1:msg_len ), If ( PSPA_code .EQ. CTX$K_ERREADFILE ) Then? status = SYS$GETMSG( %VAL( vr_stat ), msg_len, msg_buff )_+ Write( *, 100 ) msg_buff( 1:msg_len )e@ status = SYS$GETMSG( %VAL( rms_iosb ), msg_len, msg_buff )+ Write( *, 100 ) msg_buff( 1:msg_len )// Else If ( PSPA_code .EQ. CTX$K_INCOMPAT ) ThenP Write( *, 200 )M5 Else If ( PSPA_code .EQ. CTX$K_NOALLOCVA ) ThenH Write( *, 300 ) End IfO" Call SYS$EXIT( %VAL( ret_stat ) )100 Format( A )AD200 Format( ' %PSPA-F-INCOMPAT, Data is incompatible with reader.' )@300 Format( ' %PSPA-F-NOALLOCVA, Insufficient virtual memory.' ) End*[HSC.A]HSC_LOADING_NOVPA.FOR;19+,.(/ 4P((R-Z0123KPWO)56!?73<^89GHJCCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CHC THIS PROGRAM ACCEPTS A FILE CONTAINING PHYSICAL DISK NUMBERS AND THEIREC HSC/REQUESTOR FOR EACH PORT AND USES I/O INFORMATION TO PRODUCE AN >C HSC-LOADING THAT MINIMIZES THE REQUESTOR LOADS. THIS LOADINGEC FILE CAN BE USED BY PREFERRED_PATH.COM TO ACTUALLY PERFORM THE HSC C LOAD BALANCING. CHC THIS FILE CONTAINS ADDITIONAL INFORMATION (BEYOND HOST NAME) ABOUT THEFC PROPOSED LOADING (REQUESTOR,I/O'S AND A * IF THE HSC FOR A DISK HAS EC CHANGED) THAT IS NOT USED BY PREFERRED_PATH BUT HELP TO EXPLAIN WHY$C THE LOADING WAS PERFORMED AS DONE.CC PROGRAM INPUTS:;C HSC$LOADING:DISK_CABLE_HSC.DAT. IS INPUT TO THIS PROGRAM.GC IF DISK UNIT NUMBERS ARE CHANGED, DISK_CABLE_HSC.DAT MUST BE UPDATED EC TO REFLECT THE NEW CABLING OR THE ACCURACY OF THIS PROGRAM WILL BE FC UNPREDICTABLE. THE FORMAT OF EACH DISK RECORD IN DISK_CABLE_HSC.DAT *C IS AS FOLLOWS: (REQUESTOR # CANNOT BE 0)C2CDISK HSC A REQ HSC B REQ SHADOW-SET NAMEC!C$2$DUA88: HSC006 06 HSC007 07!C$2$DUA91: HSC006 06 HSC007 05!C$2$DUA96: HSC006 04 HSC007 06!C$2$DUA103: HSC006 05 HSC007 04!C$2$DUA128: HSC006 07 HSC007 06!C$2$DUA129: HSC006 07 HSC007 06*C$2$DUA130: HSC006 07 HSC007 06 $1$DUS1:*C$2$DUA131: HSC006 07 HSC007 08 $1$DUS0:C*C DISK - 15 CHARACTER PHYSICAL DEVICE NAME'C HSC A/B - 6 CHARACTER HSC DEVICE NAMEAC REQ A/B - TWO CHARACTER NUMBER BETWEEN 1 AND 20 (HSC>SHOW DISK)GC SHADOW SET NAME IF THE DISK IS THE MEMBER OF A CONTROLLER-BASED S-SET,C THERE ARE SINGLE SPACES BETWEEN EACH FIELDCC PROGRAM OUTPUTS:=C HSC$LOADING:NEW_LOADING.RPT DESCRIBES THE PROPOSED CHANGES:EC (NOTE THAT THE HEAVILY USED DISKS ARE NOW ALONE ON A HSC REQUESTOR)CPCHSC# 6 REQ# 3 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 126309PCHSC# 6 REQ# 4 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 19726556PCHSC# 6 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 14132188PCHSC# 6 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 2812157PCHSC# 6 REQ# 7 # DISKS= 1/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 5094922PCHSC# 6 REQ# 8 # DISKS= 3/ 4 CURRENT LOAD= 0 PROPOSED LOAD= 4932285PCHSC# 7 REQ# 3 # DISKS= 1/ 1 CURRENT LOAD= 887380 PROPOSED LOAD= 887380PCHSC# 7 REQ# 4 # DISKS= 2/ 4 CURRENT LOAD= 15683802 PROPOSED LOAD= 1425306PCHSC# 7 REQ# 5 # DISKS= 1/ 4 CURRENT LOAD= 6173477 PROPOSED LOAD= 3361319PCHSC# 7 REQ# 6 # DISKS= 2/ 4 CURRENT LOAD= 30547508 PROPOSED LOAD= 5726030PCHSC# 7 REQ# 7 # DISKS= 4/ 4 CURRENT LOAD= 6144614 PROPOSED LOAD= 6144614PCHSC# 7 REQ# 8 # DISKS= 1/ 4 CURRENT LOAD= 17406212 PROPOSED LOAD= 12473927PCHSC# 7 REQ# 9 # DISKS= 3/ 3 CURRENT LOAD= 477679 PROPOSED LOAD= 477679C;C /OUTPUT=FILENAME.EXT (DEFAULT=HSC$LOADING:DISK_PATH.DAT) ?C DISK HSC REQ #I/O'S * IF DIFFERENT THEN CURRENT HSC C!C $2$DUA96: HSC006 4 19726556*!C $2$DUA103: HSC006 5 14132188*!C $2$DUA131: HSC007 8 12473927 !C $2$DUA128: HSC006 7 5094922*!C $2$DUA91: HSC007 5 3361319 !C $2$DUA129: HSC007 6 3243510 !C $2$DUA133: HSC006 8 3110731*!C $2$DUA88: HSC007 7 2680404 !C $2$DUA130: HSC007 6 2482520 C0C OUTPUT FILE HSC$LOADING:MANUAL_HSC_LOADING.RPTCPC DISK HSC REQ PREFERRED PORT(ONLY DISKS REQUIRING A SWITCH ARE SHOWN) CC $2$DUA96: HSC006 4 AC $2$DUA103: HSC006 5 AC $2$DUA128: HSC006 7 BC $2$DUA133: HSC006 8 ACC PROGRAM LOGIC:BC READ LIST OF DISKS, HSC/REQUESTOR PAIRS FROM DISK_CABLE_HSC.DATC INTO DISK_ARRAY.C;C GET CURRENT I/O COUNT, WAIT ONE HOUR, GET NEW I/O COUNT,9C SUBTRACT TO GET I/OS PERFORMED AND STORE IN DISK_ARRAYC+C SORT DISK_ARRAY BY DESCENDING I/O COUNT C=C BUILD THE REQUESTOR_ARRAY(HSC,REQUESTOR) # DISKS,MAX LOAD,C FROM DISK_ARRAYCAC TRAVERSE DISK_ARRAY(1-MAX_DISKS) UPDATING THE REQUESTOR_ARRAY.;C ASSIGN DISKS TO THE REQUESTOR WITH THE SMALLER ADD_LOAD.CC IN CASE OF TIES (MOST LIKELY 2 UNASSIGNED REQUESTORS) ASSIGN THE0C DISK TO THE REQUESTOR WITH THE LOWER MAX_LOADC GC 1/7/92 DRB DEC ADDED LOGIC FOR CONTROLLER-BASED SHADOW SETS (MEMBERS0C MUST BE ON THE SAME HSC SO LOAD THEM AS A SETCPC 7/793 DRB DEC CHANGED LOGIC SO THAT THE FIRST DISK ON INDENTICLY WIREDOC REQUESTERS WILL STAY ON THE SAME HSC TO AVOID SWITCHING ALL THE-C DISKS IF LOAD HASN'T CHANGED. PROGRAM HSC_LOADING IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)' INCLUDE '($CLIDEF)' INCLUDE '($SYSSRVNAM)' CHARACTER*64 HOST CHARACTER*64 ALTHOST CHARACTER*32 DEV CHARACTER*64 DEVICEN CHARACTER*12 VOLNAME CHARACTER*25 START_TIME CHARACTER*25 STOP_TIME CHARACTER*25 RUN_TIME CHARACTER*39 OUTPUT_FILE CHARACTER*15 DEVICE CHARACTER*15 SSNAME CHARACTER*6 HSCA_NAM CHARACTER*6 HSCB_NAM CHARACTER*6 CUR_PRF CHARACTER*6 CUR_ACT CHARACTER*6 NEW_PRF CHARACTER*2 REQA CHARACTER*2 REQB CHARACTER*1 MARKER INTEGER*2 CHAN INTEGER*4 STATUS INTEGER*4 HSCA_NUM INTEGER*4 IREQA INTEGER*4 HSCB_NUM INTEGER*4 IREQB INTEGER*4 IOREC INTEGER*4 MAX_DISKS INTEGER*4 CLI$GET_VALUE INTEGER*4 CLI$PRESENT INTEGER*4 MAX_HSC INTEGc$ HSCLOAD010.AZ[HSC.A]HSC_LOADING_NOVPA.FOR;19P(\" ER*4 NODE_NAME_SIZE INTEGER*4 OUTPUT_FILE_SIZE INTEGER*4 MAX_INDEX INTEGER*4 BEG_LEN INTEGER*4 END_LEN INTEGER*4 DEVICEL INTEGER*4 VOLNAM_B INTEGER*4 IOCNT INTEGER*4 OPCNTFC DO NOT SEPARATE THE FOLLOWING TWO TIME FIELDS THEY ARE REALLY A QUAD INTEGER*4 WAIT_TIME INTEGER*4 WAIT_TIME2 INTEGER*4 RUN_LEN INTEGER*4 HOSTLEN EXTERNAL CLI$_ABSENT(C DISK_ARRAY SET UP FOR UP TO 1000 DISKS STRUCTURE /DISKS/ CHARACTER*15 DEVICE INTEGER*4 DEVICEL CHARACTER*64 DEVICEN CHARACTER*6 HSCA_NAM INTEGER*4 HSCA_NUM INTEGER*4 REQA CHARACTER*6 HSCB_NAM INTEGER*4 HSCB_NUM INTEGER*4 REQB CHARACTER*15 SHADOW CHARACTER*6 CUR_PRF CHARACTER*6 CUR_ACT CHARACTER*6 NEW_PRF INTEGER*4 NEW_REQ INTEGER*4 IOREC INTEGER*4 IOCNT INTEGER*4 FIRSTIO INTEGER*4 SECONDIO CHARACTER*1 AORB END STRUCTURE RECORD /DISKS/ DISK_ARRAY(1000) RECORD /DISKS/ HOLDARRAY<C REQUESTOR ARRAY (HSC#,REQ#) [HOW MANY'S REQS IN A HSC90??] STRUCTURE /HSCS/ INTEGER*4 NUM_DISKS (20) INTEGER*4 MAX_LOAD (20) INTEGER*4 CUR_LOAD (20) INTEGER*4 ADD_LOAD (20) INTEGER*4 ADD_DISKS (20) END STRUCTURE RECORD /HSCS/ REQ(100)&C HSC_ARRAY SET UP FOR UP TO 100 HSC'S STRUCTURE /HSC_NUMBERS/ CHARACTER*6 HNAME END STRUCTURE$ RECORD /HSC_NUMBERS/ HSC_ARRAY(100)*C SET UP THE ITEMLIST FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(8) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLST+ Common / COM$ARRAY / DISK_ARRAY,MAX_DISKS( Common / HSC$ARRAY / HSC_ARRAY,MAX_HSCC(C Get parameters and qualifiers from DCLC+C OUTPUT FILE IS OPTIONAL BUT HAS A DEFAULT IF(CLI$PRESENT('OUTPUT')) THENA STATUS = CLI$GET_VALUE ('OUTPUT',OUTPUT_FILE,OUTPUT_FILE_SIZE)1 IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) END IFC RUNTIME IS REQUIRED4 STATUS = CLI$GET_VALUE ('RUNTIME',RUN_TIME,RUN_LEN)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 64( ITMLST.ITEM(1).BUFCODE = DVI$_HOST_NAME! ITMLST.ITEM(1).ADDR = %LOC(HOST)' ITMLST.ITEM(1).ADDRLEN = %LOC(HOSTLEN) ITMLST.ITEM(2).BUFLEN = 4& ITMLST.ITEM(2).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(2).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(2).ADDRLEN = 0 ITMLST.ITEM(3).BUFLEN = 4' ITMLST.ITEM(3).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(3).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(3).ADDRLEN = 0 ITMLST.ITEM(4).BUFLEN = 4% ITMLST.ITEM(4).BUFCODE = DVI$_ERRCNT# ITMLST.ITEM(4).ADDR = %LOC(ERRCNT) ITMLST.ITEM(4).ADDRLEN = 0 ITMLST.ITEM(5).BUFLEN = 64, ITMLST.ITEM(5).BUFCODE = DVI$_ALT_HOST_NAME$ ITMLST.ITEM(5).ADDR = %LOC(ALTHOST) ITMLST.ITEM(5).ADDRLEN = 0 ITMLST.ITEM(6).BUFLEN = 64) ITMLST.ITEM(6).BUFCODE = DVI$_FULLDEVNAM$ ITMLST.ITEM(6).ADDR = %LOC(DEVICEN)' ITMLST.ITEM(6).ADDRLEN = %LOC(DEVICEL) ITMLST.ITEM(7).BUFLEN = 12% ITMLST.ITEM(7).BUFCODE = DVI$_VOLNAM$ ITMLST.ITEM(7).ADDR = %LOC(VOLNAME)( ITMLST.ITEM(7).ADDRLEN = %LOC(VOLNAM_B) ITMLST.ITEM(8).BUFLEN = 4$ ITMLST.ITEM(8).BUFCODE = DVI$_OPCNT" ITMLST.ITEM(8).ADDR = %LOC(OPCNT) ITMLST.ITEM(8).ADDRLEN = 0 END_OF_LIST = 0  C OPEN DISK_CABLE_HSC FILE@ OPEN(UNIT=1,FILE='HSC$LOADING:DISK_CABLE_HSC.DAT',STATUS='OLD',% 1 RECL=52,ORGANIZATION='SEQUENTIAL') MAX_DISK = 0:C DEFINED "DISKS" LOOP (CHECK BEFORE ADDING TO DISK_ARRAY) 10 CONTINUE HSCA_NAM = ' ' HSCB_NAM = ' ' SSNAME = ' '; READ(1,11,END=19)DEVICE,HSCA_NAM,REQA,HSCB_NAM,REQB,SSNAME011 FORMAT(1X,A15,1X,A6,1X,A2,1X,A6,1X,A2,1X,A15)BC IF BOTH PORTS ARE EMPTY, IGNORE THE DISK (HOW CAN YOU LOAD IT??)E IF ((HSCA_NAM .EQ. ' ') .AND. (HSCB_NAM .EQ. ' ')) GOTO 10!C ASSIGN A CHANNEL TO THE DEVICE # STATUS = SYS$ASSIGN(DEVICE,CHAN,,) IF (.NOT. STATUS) THEN$ TYPE *,'Current Device is ',DEVICE CALL LIB$SIGNAL (%VAL(STATUS)) GOTO 10 END IF:C GET THE DEVICE INFORMATION INCLUDING PRIMARY PATH [HOST]. STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,) IF (.NOT. STATUS) THEN CALL LIB$SIGNAL (%VAL(STATUS)) GOTO 10 END IF$C DEASSIGN THE CHANNEL TO THE DEVICE STATUS = SYS$DASSGN(%VAL(CHAN)) IF (.NOT. STATUS) THEN CALL LIB$SIGNAL (%VAL(STATUS)) GOTO 10 END IFC IS IT A DISK! IF (DEVCLASS .NE. DC$_DISK) THEN% CALL LIB$SIGNAL(%VAL(SS$_IVDEVNAM)) GOTO 10 END IFC IS IT MOUNTED IF (.NOT. DEV$V_MNT) THEN( CALL LIB$SIGNAL(%VAL(SS$_DEVNOTMOUNT)) GOTO 10 END IFC MOUNTED FOREIGN IF (DEV$V_FOR) THEN' CALL LIB$SIGNAL(%VAL(SS$_DEVFOREIGN)) GOTO 10 END IF&C DEVICE IS A MOUNTED NON-FOREIGN DISK MAX_DISKS = MAX_DISKS + 1BC CONVERT THE ASCII TEXT FROM THE FILE TO INTEGERS THAT WE CAN USE HSCA_NUM = 0 IREQA = 0 HSCB_NUM = 0 IREQB = 0! IF (HSCA_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQA),%REF(IREQA))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))( CALL GET_HSC_NUMBER(HSCA_NAM,HSCA_NUM) END IF! IF (HSCB_NAM .NE. ' ') THEN6 STATUS = LIB$CVT_DTB(%VAL(2),%REF(REQB),%REF(IREQB))2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))( CALL GET_HSC_NUMBER(HSCB_NAM,HSCB_NUM) END IF<C DEVICEN IS THE PHYSICAL DISK NAME RETURNED FROM SYS$GETDVI& DISK_ARRAY(MAX_DISKS).DEVICE = DEVICE( DISK_ARRAY(MAX_DISKS).DEVICEL = DEVICEL( DISK_ARRAY(MAX_DISKS).DEVICEN = DEVICEN* DISK_ARRAY(MAX_DISKS).HSCA_NAM = HSCA_NAM* DISK_ARRAY(MAX_DISKS).HSCA_NUM = HSCA_NUM# DISK_ARRAY(MAX_DISKS).REQA = IREQA* DISK_ARRAY(MAX_DISKS).HSCB_NAM = HSCB_NAM* DISK_ARRAY(MAX_DISKS).HSCB_NUM = HSCB_NUM# DISK_ARRAY(MAX_DISKS).REQB = IREQB0 DISK_ARRAY(MAX_DISKS).CUR_ACT = HOST(1:HOSTLEN)& DISK_ARRAY(MAX_DISKS).SHADOW = SSNAME) DISK_ARRAY(MAX_DISKS).NEW_PRF = ' '& DISK_ARRAY(MAX_DISKS).FIRSTIO = OPCNT0C TYPE *,' DEVICE ',DEVICE,' FIRST OPCNT ',OPCNT C NEXT DISK GOTO 10 C END OF FILE 19 CONTINUE CLOSE(UNIT=1)EC WAIT SPECIFIED PERIOD (DEFAULT IS 1 HOUR) TO GATHER I/O INFORMATION1 TYPE *,'PROGRAM RUN TIME = ',RUN_TIME(1:RUN_LEN)/ CALL SYS$BINTIM(RUN_TIME(1:RUN_LEN),WAIT_TIME)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))" STATUS = SYS$SCHDWK(,,WAIT_TIME,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) STATUS = SYS$HIBER()/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) C GET NEW I/O NUMBER DO 20 M = 1, MAX_DISKSC ASSIGN A CHANNEL TO THE DISK DEVICE = DISK_ARRAY(M).DEVICE# STATUS = SYS$ASSIGN(DEVICE,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))2C GET THE DEVICE INFO (ONLY REALLY WANT THE OPCNT). STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))$C DEASSIGN THE CHANNEL TO THE DEVICE STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C UPDATE THE OPERATIONS COUNTS4 DISK_ARRAY(M).IOCNT = OPCNT - DISK_ARRAY(M).FIRSTIO DISK_ARRAY(M).SECONDIO = OPCNTFC TYPE *,' DEVICE ',DEVICE,' 2ND CNT ',OPCNT,' # ',DISK_ARRAY(M).IOCNT 20 CONTINUE(C SORT THE DISK_ARRAY BY I/O'S PERFORMED250 INVERSIONS = 0 DO 260 K = 1, MAX_DISKS-1 DO 270 L = K+1, MAX_DISKS9 IF (DISK_ARRAY(K).IOCNT .LT. DISK_ARRAY(L).IOCNT) THEN  HOLDARRAY = DISK_ARRAY(K) DISK_ARRAY(K) = DISK_ARRAY(L) DISK_ARRAY(L) = HOLDARRAY INVERSIONS = 1 GOTO 270 END IF 270 CONTINUE 260 CONTINUE IF (INVERSIONS .EQ. 1) GOTO 2502C BUILD (HSC#,REQ#) ARRAY FROM THE DISK_ARRAY DATA DO 300 L=1,MAX_DISKS@C MAKE I/O COUNT OF UNUSED DISKS 1 TO AVOID MISLOADING NEW DISKSCC (YOU COULD PUT ALL 4 NEW DISKS ON THE SAME REQUESTOR SINCE 0+0=0)8 IF (DISK_ARRAY(L).IOCNT .EQ. 0) DISK_ARRAY(L).IOCNT = 1/ IF (DISK_ARRAY(L).HSCA_NAM .NE. ' ') THEN I = DISK_ARRAY(L).HSCA_NUM N = DISK_ARRAY(L).REQA ? REQ(I).MAX_LOAD(N) = REQ(I).MAX_LOAD(N) + DISK_ARRAY(L).IOCNT/ REQ(I).NUM_DISKS(N) = REQ(I).NUM_DISKS(N) + 19 IF (DISK_ARRAY(L).HSCA_NAM .EQ. DISK_ARRAY(L).CUR_ACT) @ 1 REQ(I).CUR_LOAD(N) = REQ(I).CUR_LOAD(N) + DISK_ARRAY(L).IOCNT END IF/ IF (DISK_ARRAY(L).HSCB_NAM .NE. ' ') THEN I = DISK_ARRAY(L).HSCB_NUM N = DISK_ARRAY(L).REQB? REQ(I).MAX_LOAD(N) = REQ(I).MAX_LOAD(N) + DISK_ARRAY(L).IOCNT/ REQ(I).NUM_DISKS(N) = REQ(I).NUM_DISKS(N) + 19 IF (DISK_ARRAY(L).HSCB_NAM .EQ. DISK_ARRAY(L).CUR_ACT) @ 1 REQ(I).CUR_LOAD(N) = REQ(I).CUR_LOAD(N) + DISK_ARRAY(L).IOCNT END IF 300 CONTINUEIC LOAD THE DISKS THAT ARE SINGLE PORTED (CANNOT BE PUT ON THE OTHER PORT) DO 400 M = 1,MAX_DISKS I =$ HSCLOAD010.AZ[HSC.A]HSC_LOADING_NOVPA.FOR;19P(F DISK_ARRAY(M).HSCA_NUM J = DISK_ARRAY(M).REQA  K = DISK_ARRAY(M).HSCB_NUM L = DISK_ARRAY(M).REQB 0C IF THE B PORT IS EMPTY, WE MUST USE THE A PORT/ IF (DISK_ARRAY(M).HSCB_NAM .EQ. ' ') THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNT/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1 GOTO 400 END IF0C IF THE A PORT IS EMPTY, WE MUST USE THE B PORT/ IF (DISK_ARRAY(M).HSCA_NAM .EQ. ' ') THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1 GOTO 400 END IF 400 CONTINUE DO 500 M = 1,MAX_DISKS2 IF (DISK_ARRAY(M).NEW_PRF .NE. ' ') GOTO 480 I = DISK_ARRAY(M).HSCA_NUM J = DISK_ARRAY(M).REQA  K = DISK_ARRAY(M).HSCB_NUM L = DISK_ARRAY(M).REQB 5C CHOOSE BETWEEN PORTS THAT HAVE DISKS LOADED ALREADY5 IF (REQ(I).ADD_LOAD(J) .LT. REQ(K).ADD_LOAD(L)) THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNT/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1 GOTO 480 END IF5 IF (REQ(I).ADD_LOAD(J) .GT. REQ(K).ADD_LOAD(L)) THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1 GOTO 480 END IF>C EQUAL LOAD ON REQUESTORS, USE REQUESTOR WITH LOWEST MAX LOAD5 IF (REQ(I).MAX_LOAD(J) .LT. REQ(K).MAX_LOAD(L)) THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNT / REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1P GOTO 480 END IF 5 IF (REQ(I).MAX_LOAD(J) .GT. REQ(K).MAX_LOAD(L)) THENR0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNTS/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1 GOTO 480 END IFHEC EQUAL LOAD ON REQUESTORS AND EQUAL MAX LOAD, TRY TO AVOID SWITCHINGO< IF (DISK_ARRAY(M).HSCA_NAM .EQ. DISK_ARRAY(M).CUR_ACT) THEN0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCA_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQA DISK_ARRAY(M).AORB = 'A'? REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(M).IOCNTA/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1I ELSE 0 DISK_ARRAY(M).NEW_PRF = DISK_ARRAY(M).HSCB_NAM, DISK_ARRAY(M).NEW_REQ = DISK_ARRAY(M).REQB DISK_ARRAY(M).AORB = 'B'? REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(M).IOCNT / REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 1A END IF:>C LOAD ALL CONTROLLER-BASED SHADOW SET MEMBERS TO THE SAME HSC 480 CONTINUE: IF (DISK_ARRAY(M).SHADOW .EQ. ' ') GOTO 500 DO 490 NN = M + 1,MAX_DISKS> IF (DISK_ARRAY(M).SHADOW .NE. DISK_ARRAY(NN).SHADOW) GOTO 490 I = DISK_ARRAY(NN).HSCA_NUM J = DISK_ARRAY(NN).REQA  K = DISK_ARRAY(NN).HSCB_NUM L = DISK_ARRAY(NN).REQB = IF (DISK_ARRAY(M).NEW_PRF .EQ. DISK_ARRAY(NN).HSCA_NAM) THENC2 DISK_ARRAY(NN).NEW_PRF = DISK_ARRAY(NN).HSCA_NAM. DISK_ARRAY(NN).NEW_REQ = DISK_ARRAY(NN).REQA DISK_ARRAY(NN).AORB = 'A'H@ REQ(I).ADD_LOAD(J) = REQ(I).ADD_LOAD(J) + DISK_ARRAY(NN).IOCNT/ REQ(I).ADD_DISKS(J) = REQ(I).ADD_DISKS(J) + 1 END IFG= IF (DISK_ARRAY(M).NEW_PRF .EQ. DISK_ARRAY(NN).HSCB_NAM) THENS2 DISK_ARRAY(NN).NEW_PRF = DISK_ARRAY(NN).HSCB_NAM. DISK_ARRAY(NN).NEW_REQ = DISK_ARRAY(NN).REQB DISK_ARRAY(NN).AORB = 'B' @ REQ(K).ADD_LOAD(L) = REQ(K).ADD_LOAD(L) + DISK_ARRAY(NN).IOCNT/ REQ(K).ADD_DISKS(L) = REQ(K).ADD_DISKS(L) + 19 END IFH 490 CONTINUE D 500 CONTINUEC OPEN OUTPUT FILE+ OPEN(UNIT=3,FILE=OUTPUT_FILE,STATUS='NEW')SD OPEN(UNIT=5,FILE='HSC$LOADING:MANUAL_HSC_LOADING.RPT',STATUS='NEW') WRITE(5,609)1D609 FORMAT(' DISK UNIT # HSC # REQ # PREFERRED PORT (A OR B)') DO 600 L=1,MAX_DISKSO; IF (DISK_ARRAY(L).NEW_PRF .EQ. DISK_ARRAY(L).CUR_ACT) THENS MARKER = ' ' ELSE  MARKER = '*'8 WRITE(5,610)DISK_ARRAY(L).DEVICE,DISK_ARRAY(L).NEW_PRF,+ 1 DISK_ARRAY(L).NEW_REQ,DISK_ARRAY(L).AORBH END IFQ8 WRITE(3,611)DISK_ARRAY(L).DEVICE,DISK_ARRAY(L).NEW_PRF,3 1 DISK_ARRAY(L).NEW_REQ,DISK_ARRAY(L).IOCNT,MARKERD/610 FORMAT(' ',A15,' ',A6,' ',I2,' ',A1)Q-611 FORMAT(' ',A15,' ',A6,' ',I2,' ',I8,A1)P 600 CONTINUE CLOSE(UNIT=3) CLOSE(UNIT=5)*C WRITE LOADING CHANGES TO NEW_LOADING.RPT= OPEN(UNIT=4,FILE='HSC$LOADING:NEW_LOADING.RPT',STATUS='NEW')7 DO 700 I = 1,100  DO 750 J = 1,20) IF (REQ(I).NUM_DISKS(J) .EQ. 0) GOTO 750T6 WRITE(4,760)HSC_ARRAY(I).HNAME,J,REQ(I).ADD_DISKS(J),< 1 REQ(I).NUM_DISKS(J),REQ(I).CUR_LOAD(J),REQ(I).ADD_LOAD(J)6760 FORMAT(' ',A6,' REQ# ',I2,' # DISKS= ',I2,'/',I2,. 1 ' CURRENT LOAD= ',I9,' PROPOSED LOAD= ',I9) 750 CONTINUE 700 CONTINUE CLOSE(UNIT=4) 999 CONTINUE ENDC2C GET_HSC_NUMBERC3/ Subroutine GET_HSC_NUMBER(HSC_NAME,HSC_NUMBER)D Implicit None CHARACTER*6 HSC_NAMEF INTEGER*4 HSC_NUMBERH INTEGER*4 MAX_HSC INTEGER*4 K'C DISK_ARRAY SET UP FOR UP TO 100 HSC'SN STRUCTURE /HSC_NUMBERS/ CHARACTER*6 HNAME4 END STRUCTURE$ RECORD /HSC_NUMBERS/ HSC_ARRAY(100)( Common / HSC$ARRAY / HSC_ARRAY,MAX_HSC K = 0 10 CONTINUET K = K + 1+ IF (HSC_ARRAY(K).HNAME .EQ. HSC_NAME) THEN  HSC_NUMBER = K RETURN ENDIF IF (K .LT. MAX_HSC) GOTO 10 MAX_HSC = MAX_HSC + 1$ HSC_ARRAY(MAX_HSC).HNAME = HSC_NAME HSC_NUMBER = MAX_HSCR ReturnR End*[HSC.A]KITINSTAL.COM;43+, ./ 4N$-Z0123KPWO56 C7)3<^89GHJ2$ ! COPYRIGHT (C) 1992 BY=$ ! DIGITAL EQUIPMENT CORPORATION, MAYNARD<$ ! MASSACHUSETTS. ALL RIGHTS RESERVED.$ !J$ ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDM$ ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSIONF$ ! OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIESI$ ! THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHERN$ ! PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.$ !M$ ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ANDN$ ! SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.$ !H$ ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS;$ ! SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.$ !N$ !***************************************************************************$ ! $!set verify($! KITINSTAL.COM - for HSC Loading ASSET$!*$ On Control_Y Then Vmi$Callback CONTROL_Y$ On Warning Then Exit $Status.$ If P1 .eqs. "VMI$_INSTALL" then goto Install&$ If P1 .eqs. "VMI$_IVP" then goto IVP$ Exit VMI$_UNSUPPORTED$ $ Install:$set def vmi$kwd:$ Type Sys$InputLThis procedure installs the Digital Equipment Corporation HSC Loading Asset Gpackage. This procedure does not do a system-wide install of the Asset,Lbut provides a command procedure to allow individual users to use the tools.JExecuting the command procedure ($@sys$manager:hsc_loading_logicals) will Kallow you to issue the HSC_LOAD and PREFER commands. See the documentation =provided with the Asset or print the on-line postscript filesEsys$manager:hscload*.ps for more information on the HSC loading tool.3 The hsc_loading software requires VMS version 5.4.$!check vms version$!.$vmi$callback check_vms_version version_ok 054.$if version_ok .eq. 1 then goto vms_version_ok$!$!bad version number$!#$vmi$callback message i badvmsver -&"this $ HSCLOAD010.A Z[HSC.A]KITINSTAL.COM;43N͓s asset REQUIRES VMS version 5.4" $exit vmi$_failure$vms_version_ok:$type sys$inputB THERE IS A KNOWN PROBLEM WHEN USING THE SET PREFERRED PATH SYSTEMH SERVICE CALL IN MIXED INTERCONNECT CLUSTERS IN VMS VERSIONS 5.4 THROUGHF 5.5-2. THE PROBLEM IS FIXED IN VMS VERSION 6.0. THIS PROBLEM INVOLVESD HSC ATTACHED DISKS THAT ARE SERVED TO THE LAVC. THE LAVC NODES LOSE@ CONNECTION TO THE DISK (MEDIA OFFLINE) IF THE HSC PATH CHANGES.H If you are planning on running the HSC_LOADING software in a MI clusterH prior to VMS v6.0, you should avoid using the AUTOMATIC LOADING featureI and use the data produced by HSC_LOADING to perform MANUAL loading only.< A work around is discussed in the HSC_LOADING User's Guide.;$vmi$callback ask goon "Do you want to continue" "NO" b,r,u'$if (.not. goon) then exit vmi$_failure$!$create_directory:%$dire :== sys$sysdevice:[hsc$loading]$vmi$callback ask dire -0"Where do you want to install the kit" "''dire'"*$vmi$callback create_directory user 'dire' $ask_decps:$!$vmi$callback ask decps -4"Do you have DECps installed on this system" "N" s,u5$if ((decps .eqs. "Y") .or. (decps .eqs. "N")) then - goto decps_ok$type sys$input/ Enter "Y" if DECps is installed on this system3 "N" if DECps is not installed on this system$goto ask_decps $decps_ok:$type sys$input5 If this is not an MI cluster, the ivp should be run.E If this is a mixed-interconnect cluster (ci and lavc) running a VMS G version prior to 6.0, the lavc nodes may see the ci disks as off-line F during the ivp so AVOID running the ivp while lavc nodes are activly  using the ci disks $ Vmi$Callback SET IVP ASK$ Vmi$Callback SET PURGE ASK$!$type sys$inputG No more questions will be asked and the install should complete within 10 minutes. 0$open/write com vmi$kwd:hsc_loading_logicals.com($write com "$define hsc$loading ''dire'"/$write com "$set command hsc$loading:prefer.cld4$write com "$set command hsc$loading:hsc_loading.cld$write com "$exit" $close comM$vmi$callback provide_file hscload hsc_loading_logicals.com vmi$root:[sysmgr]$!$! saveset b is the decps kit#$! saveset c is the stand-alone kit$!-$if (decps .eqs. "Y") then goto decps_install-$if (decps .eqs. "N") then goto novpa_install$decps_install:$vmi$callback restore_saveset B$!find sys$library:PSPA$LIB.FORD$vmi$callback find_file cilib pspa$lib.for vmi$root:[syslib] s found$if (found .eqs. "E") then -? vmi$callback provide_file cilib pspa$lib.for vmi$root:[syslib]F$link/executable=vmi$kwd:hsc_loading.exe vmi$kwd:hsc_loading_decps.obj7$Vmi$Callback PROVIDE_IMAGE Exe$ hsc_loading.exe 'dire'6$link/executable=vmi$kwd:prefer.exe vmi$kwd:prefer.obj2$Vmi$Callback PROVIDE_IMAGE Exe$ prefer.exe 'dire'6$link/executable=vmi$kwd:dclhsc.exe vmi$kwd:dclhsc.obj=$Vmi$Callback PROVIDE_IMAGE Exe$ dclhsc.exe vmi$root:[sysexe]J$link/executable=vmi$kwd:build_disk_cable.exe vmi$kwd:build_disk_cable.obj<$Vmi$Callback PROVIDE_IMAGE Exe$ build_disk_cable.exe 'dire';$copy vmi$kwd:hsc_loading_decps.cld vmi$kwd:hsc_loading.cld6$Vmi$Callback PROVIDE_FILE cld$ hsc_loading.cld 'dire'1$Vmi$Callback PROVIDE_FILE cld$ prefer.cld 'dire'1$Vmi$Callback PROVIDE_FILE mar$ prefer.mar 'dire'1$Vmi$Callback PROVIDE_FILE txt$ prefer.txt 'dire'B$Vmi$Callback PROVIDE_FILE doc$ hscload010_ug.ps vmi$root:[sysmgr]B$Vmi$Callback PROVIDE_FILE doc$ hscload010_ig.ps vmi$root:[sysmgr];$Vmi$Callback PROVIDE_FILE Com$ build_disk_cable.com 'dire'9$Vmi$Callback PROVIDE_FILE Com$ preferred_path.com 'dire'=$Vmi$Callback PROVIDE_FILE Com$ manual_hsc_loading.com 'dire'D$Vmi$Callback PROVIDE_FILE ivp$ hscloadingivp.com vmi$root:[systest]G$Vmi$Callback PROVIDE_FILE ivp$ hscloadingivp_mi.com vmi$root:[systest]$goto endinstall$novpa_install:$vmi$callback restore_saveset CF$link/executable=vmi$kwd:hsc_loading.exe vmi$kwd:hsc_loading_novpa.obj7$Vmi$Callback PROVIDE_IMAGE Exe$ hsc_loading.exe 'dire'6$link/executable=vmi$kwd:prefer.exe vmi$kwd:prefer.obj2$Vmi$Callback PROVIDE_IMAGE Exe$ prefer.exe 'dire'6$link/executable=vmi$kwd:dclhsc.exe vmi$kwd:dclhsc.obj=$Vmi$Callback PROVIDE_IMAGE Exe$ dclhsc.exe vmi$root:[sysexe]J$link/executable=vmi$kwd:build_disk_cable.exe vmi$kwd:build_disk_cable.obj<$Vmi$Callback PROVIDE_IMAGE Exe$ build_disk_cable.exe 'dire';$copy vmi$kwd:hsc_loading_novpa.cld vmi$kwd:hsc_loading.cld6$Vmi$Callback PROVIDE_FILE Cld$ hsc_loading.cld 'dire'1$Vmi$Callback PROVIDE_FILE cld$ prefer.cld 'dire'1$Vmi$Callback PROVIDE_FILE mar$ prefer.mar 'dire'1$Vmi$Callback PROVIDE_FILE txt$ prefer.txt 'dire'B$Vmi$Callback PROVIDE_FILE doc$ hscload010_ug.ps vmi$root:[sysmgr]B$Vmi$Callback PROVIDE_FILE doc$ hscload010_ig.ps vmi$root:[sysmgr];$Vmi$Callback PROVIDE_FILE Com$ build_disk_cable.com 'dire'9$Vmi$Callback PROVIDE_FILE Com$ preferred_path.com 'dire'=$Vmi$Callback PROVIDE_FILE Com$ manual_hsc_loading.com 'dire'D$Vmi$Callback PROVIDE_FILE ivp$ hscloadingivp.com vmi$root:[systest]G$Vmi$Callback PROVIDE_FILE ivp$ hscloadingivp_mi.com vmi$root:[systest]$! $endinstall:$!$!set def to the directory$!$set def 'dire'$!$$IF (VMI$IVP .EQ. 0) THEN GOTO NOIVP$TYPE SYS$INPUTH The IVP will attempt to create a valid table of how each disk is cabledF from each port to an hsc/requestor. After the IVP completes, confirm = that this data is correct by performing the following steps:A @sys$manager:hsc_loading_logicals * set def hsc$loading = type disk_cable_hsc.dat D verify the data against output of the show disk commnad on each HSC$Exit Vmi$_success$noivp:$TYPE SYS$INPUT> This code requires an up to date list of the disk cabling to H HSC/requestor which can be automaticly built during the run of the IVP,F or by running the command procedure build_disk_cable.com. These stepsI can cause lavc served disks to go off-line. You can also manually update? the disk to hsc and requestor table using the following steps:= Determine the HSC and requestor for both ports of each disk? using the show disk command on each HSC and failing over the A disks and then repeating the command on each HSC.(disks mounted5 on one HSC will not be shown on the alternate HSC).B @sys$manager:hsc_loading_logicals + set def hsc$loading 1 run build_disk_cable 9 (disk_cable_hsc.dat can also be changed with an editor)A @sys$common:[systest]hscloadingivp_mi.com will $Exit Vmi$_success$ivp: $on control_y then goto err_exit$on warning then goto err_exit$type sys$input7 Starting the Installation Verification Procedure (IVP)'$@sys$common:[systest]hscloadingivp.com $done_ivp:$exit vmi$_success $err_exit:$ exit vmi$_failure*[HSC.A]PREFER.CLD;1+,u./ 42-Z0123KPWO5F6q7^3<^89GHJdefine verb PREFER$ image hsc$loading:PREFER.exe+ parameter P1 ! Disk name label=disk_name prompt="Disk Name"$ value(type=$device,required)2 disallow ((NOT host_name) AND (NOT force))2 disallow ((NOT host_name) AND (NEG force)) qualifier HOST label=host_name nonnegatable+ value(type=$quoted_string,required) qualifier FORCE label=force*[HSC.A]PREFER.EXE;1+,v./ 4-Z0123 KPWO5E6:m57 3<^89GHJ0DX0205(H0l hPREFERV2.0-8dH005-05   ?Dq!$ HSCLOAD010.AvZ[HSC.A]PREFER.EXE;10 " disk_name  Hhost_name]force<`^,n䐏P`ݬY^|AVX^,n䐏Qݬf^PRݬXl$լ ݬf  RP|VD^,nȐSȞ'؞ܕlլݬfЬ̑lլ  lլ,n䞭l լ Ь l լЬlլ ݬf^<`^,n䐏T}l լЬ^<`^,n䐏U<ݬ^|P~P1|~aPP10PяP1Y1I|~|~|~<~<~ P1 P1 я P@|~|~|~(n2V'РTVTQV4ɏ@VdPV(TQK(`PPR1nDSP@PРTVV4РQɏ@VdPV(T(mTV42P¢$VPVP'SlЬ P`P1ePSмT4L,m£(TˏdUUTP͏@dQȠQQdURT PPT$ЏPмUT 1m Uʣ U4TQUP3V4 QPVPUYUU0?Ss 1UH}~PUHYЏlPUHU UUPP\d`1ãHUPPL1x1PP@PP\d`1УHVPPѠU"X ѠU\d`X 1X PV51УHVУLQxQWCPP`FX 8`2РVUVU^`VV\d`VT 4UVURQX X QPQHQPPVQHԣLQL5T14+cSRRTT bRRS1NUTPP1A)%U P\d`14UP\d`14Wg1UTPT0,Vg3QQQdQQVTVUUddUddТ8QTQ0T8P1`1`QQPVQUUddPQРVРPPVg13PPPaPP10PPQРPPTI`aQVVT/a+VT3UVVP`'aUUag 3XXdXQT,UTVVP`)Y&ЏdPUdTPVP`UUdРg 3`3U,U,ɢ P$P^`T ˏU1 P^`TU1~)P ^ЬV5Z5Ц WЦW4PѬWPP[[ЬWPˏPWxW4ήPXP XP48XXZ^hYm4 ^Y@PtZЮY<4YPЩQ @P*\`hQ$Ï@Q@PQ\`A*Z,n@iZ* @P\ihPЮQ42 .fVPP"(!Q (W W\ih`PPVQWQ (QW0408045[\if]ifYPP0ЏP< <43 h@t DPЏ< <@4 0HL$(,@" DP0ЏP< Џ04@D }PѠ  ѠTաЏd |~p< P^W(0al Џ\PlRRP#@gQaQQ@h1Q@1Q@RPծ<) ݧ$?P<QQQQ,QӮ,Qh0QӮ0Q]Ѯ,0Ю0,P ϮV<ծ: 6 ?ծ+Ѯ!ծ8Ю,8ЮQ~A ЮQQЏ4PQQ YЮ Y<QQQQ ծ@3n^ݬ1PмVU QxQ(P,n ЮмVx Pî PRPP*8Q\`aR鐮0Ю , ծ4 44Ю XXX24XX34X4Ю0(0$,X4X5@ծ@ Ч(@@4DծD Ч,D4ϮKF Pʦ PPH3 ,PQQ1 8Q˦ QPPHQ PQPLЮHYYVPY6`(x $ծ(Ц 6x ( |~VPRæݬ϶BϓPX5(æPЏP|^Rl լмR` l@լ; ݬ|P<QQQQЮ S<QQQQ Sn^ݬPUмV0 RHlRRPa@LPR @ QQ@LPSSVPS6`(æP|мVpm505&ЏdPHT|PxPԦLxP,nPPΦTԦfVPPPàRRT43SРQSSRРà 4Ԡ,0QQ4Q8|| `PPVTP^мϬmЮS5ЏdPZ<YΣX0 HXPYXcSRR4W3V48SKSBâUUXWТQVVUâ QxQ DPR bR\ cЮTRTЮQ4k|a8SRRR bRЮ Q*\ RSЮScSRRR bR DPGRSS< PPxPD< P XYPOόϬ PeP PP|TмUidP0QQQ ]`dOPP֤PPUPUP0PQP0=0}PVQP0/PVQ0ЏlPTVfRRRVVTPUЏPQQPU:P˕qQP a;PaVQRxRRRSRfRURfyU RUfZSRR fSRUS R SS $R fR fRxRRRPRVQ1bRSfSRURSRf RUSSRUPXPRx RPPxS~RRf SnPQ19Џ PRTScQQQSST ѣ RУ RPR PRRRR ]`dQP^^QaPHP}P^QaЏPlTмPмQQ¼֤ PЏlPЏdPTScRRRSST2QQ ãQRxRRQ RRQXPЏdP@ЬP QR РR((( / (/@ (Џ$P<`QPР QӏQPJ ; To test for global presence thisE ; must be the first CLI$ call8 PUSHAL FORCE_LABEL ; Switch to testA CALLS #1,CLI$PRESENT ; Is it present globally?? MOVL R0,FORCE_SWITCH ; Save status for laterF PUSHAL DEV_DESC ; Address of string descriptor: PUSHAL DEV_LABEL ; Want device name? CALLS #2,G^CLI$GET_VALUE ; From the command line1 BLBS R0,1$ ; Success BRW 10$1$:? $ASSIGN_S - ; Assign an I/O channel! DEVNAM=DEV_DESC,- CHAN=CHNL BLBS R0,2$A BRW 10$ ; Branch if error occured2$: PUSHAL HOST_LEN PUSHAL HOST_DESC7 PUSHAL HOST_LABEL ; Get host name? CALLS #3,G^CLI$GET_VALUE ; From the command line1 BLBS R0,3$ ; Success CMPL #CLI$_ABSENT,R0O BEQL 21$ ; No Host specified, should be a /FORCE BRW 10$21$: BRW 7$3$:> MOVB HOST_LEN,HOST_COUNT ; Create .ASCIC stringH $QIOW_S - ; Issue QIO to set prefered path CHAN=CHNL,-& FUNC=#IO$_SETPRFPATH,- IOSB=IOSB,-: P1=HOST_COUNT ; .ASCIC Node name1 BLBS R0,6$ ; Success BRW 10$6$: BLBS IOSB,7$ MOVW IOSB,R0 BRW 10$7$:* CMPL #CLI$_PRESENT,FORCE_SWITCHE BEQL 13$ ; Issue QIO to force the path10$: $EXIT_S R0;+,; Need to switch Primary and Secondary Hosts;-13$: $QIOW_S - CHAN=CHNL,-7 FUNC=#,- IOSB=IOSB BLBC R0,10$ MOVW IOSB,R0 BRB 10$ .END PREFER*[HSC.A]PREFER.OBJ;1+,x./ 4d-Z0123KPWO5E6`az7 3<^89GHJ5PREFERV2.0-817-SEP-1991 21:00 VAX MACRO T5.2V-4MACRO PREFER  PREFER CLI$GET_VALUE CLI$PRESENT CLI$_ABSENT CLI$_PRESENT DSC$K_CLASS_S DSC$K_DTYPE_T SYS$ASSIGNSYS$EXITSYS$QIOW . ABS .P$ABS$ PPRWDATAP3disk_nameQ &QQ DSC$K_DTYPE_T% DSC$K_CLASS_S%Q D3host_nameQ &QQ DSC$K_DTYPE_T% DSC$K_CLASS_S%]QQ3forceQ&Q QQCODEP PREFER& CLI$PRESENTP CLI$GET_VALUEP1|~ SYS$ASSIGNP1|T@ CLI$GET_VALUEP CLI$_ABSENTP1Y1I|\|~|~\|~<~<~ SYS$QIOWP1 P1 CLI$_PRESENT PSYS$EXIT|~|~|~ SET ENVIRONMENT/CLUSTER, SYSMAN> DO PREFER $10$DUA10:/HOST=HSC014 SYSMAN> EXIT) $ PREFER $10$DUA10:/HOST=HSC014/FORCE# NOTE9 The PREFER command must be defined as a DCL command7 verb on all nodes in the VAXcluster system before using it within SYSMAN.FThe SYSMAN PREFER command sets the preferred path on all nodes so thatHthe next mount command from any node will use the selected path. The DCLJPREFER command using the /FORCE qualifier causes the device to enter mountEverification. After mount verification completes, the device will be:remounted by all nodes through the preferred path, HSC014.FThe following DCL command procedure will compile and link the program., $ IF F$SEARCH("PREFER.MAR") .NES. "" THEN - MACRO/LIST/CROSS'p1' PREFER, $ IF F$SEARCH("PREFER.OBJ") .NES. "" THEN - LINK/MAP/CROSS'p1' PREFER $ PURGE/LOG, $ IF F$SEARCH("PREFER.CLD") .NES. "" THEN - SET COMMAND PREFER $ EXIT: NOTE: PHYS_IO privilege is required for IO$_SETPRFPATH and IO$M_FORCEPATH. Z[HSC.A]YNXPLP;)+@?* kuF\ i 7.5  !)AA4:{lzQ|16yV:쿫%Rb~}P]7#^5C~<~gzJ,rS)m*R߱ov%kZ,̲8Zn-K+yfsZ`"? VHF;s}+e7.BLAY.mREr`m_0csX\PKהw3%76,`G Gm|?W/ڶ@< y2 A/[aq&?_a$CI,ct;Vd}1V+I)FTWnzWRoOV!!sO/'M@ 6/ gg$ITWHm2xoE`B1[YjAw`*y!eu" I_'V{"'6x|ǫX-?6~Syu{LhJl*]N6i|c: cV2jgPZ~{*nUY ]HK+}0A7Y36ܟakW89pQ$\dSu<٪Vf63inN~w|p0 ܪV"7ہ0ddG IV ]F*8"1| q{,|xBMvsWK0yߓ#h+ez7ll)RXLC>O"[VOHj;=rS&vtȖ-|v ^?0DGd09 'tmbyitJAbZN$/dwin@ fD7(ZHWiIk+@<XVAr3 W;6;p{W֕`ci/5dc<[_\iWͽYL4#N"LNF[|n<7c#oWkK8t[[|nO d,ړj PBM+ص&/-0-P^Ŋ33QLQG&S M9y VҩQ#.6 & Rs8J+4ytńZ5QRB[N $]0Ad@НNB^aQd*ŸMh4G]qY%*j]E jIIw$\QpYBt&;Vp0)1rKܧCVuЁ_.F]z [Q_INq rVf軘#Gv°$eVp #󎤦 "ѕ&ead@Z ~ޥ x. ^K&px$Üv *4Z̢I%`G"uš} -:Y8#ƓYñ D!4F*1~h ڋ"pLD47%ETTQ7>՗84L1Ww@.cNLdO:XϚŇ(i. e Au@<"GPEd2%!p6@F~_wh Ԙb/( ^Nv9)t[p2p! Pcm0o$g'E_B_^PbPfcqqF$ VS.? Yn"VXZR*ՊIl2IpZuEt٤.4q]`э4#ac :>( ˄t|H-$h]c!SWa"f3EzByR%@4[$q3^@1ؓK0$=S)&=GViJM;2\pTӢ9W?)*.qv) J@6xBɷ/'@lM?aఙC_Bi5o#:S^S Ix4I_ Q.NZt|Ohi+_6ZAf}& ?}SX.';_0s9;lt;Ei0 bur,Gk)2~Xd@!_'R+3QjVKabbw1+qB#W/'KFđtϔ߅Q`!Z`GS ms.ÒԏCmsb{rHSz_z2?tȎ|oZ2Sxd ]?gy!.:}/*7 A?1ZL'4@+VvhZh'9yuvw65YbiAbCd,3bL6Bl ')I1`|5Go%5q%\[z+!*cxT_X{M0O>hH7@,+J <=t[zhjRI:~A#sD' VW. NzS& eγXB: Zh"O{3^V %+ qŃp~v T8dfLy (TR`?C`i Zؿ|~H Br`'SuqJ)hP 4g >tQ,-Nh y`%q\'CvU55On"-GcD[E?q(2d5@OWk6Sy1li# -Xt-\(BrIRtO.A+ <6Gx1ST#STtШ>RgLR(F(Q\Jڠ;V( MleL@l"#,L.`J=ao|a$wN]JD_UBjAH-@u<uf!(f)$Y)H,r0qC;ѝ*PkeiDڙ gEBgX&#?G-+c5hV*3nckr¬ݖ;9b9i?7qKزuODosn=&kraQ+4e!mgG]Tq?0 N( >hU7'D,B >mj)V|ʢvL:#_>M? k+p.sR5&=_*"AW0h aRCDjT{w8cp24Ixeo0&}prn jus- ?9p%XX)-i:{Q!]Gv_'ALVD:7lm-<-=Z~羣Q8}.(3l 8ێ~ \3J^1U tzS)W!fnSVmm\=}QtW+ 2iph~p {ulF>Kތ&UH,Zt_S>{'>RxZ*qOp)_ZBU !E_orc6-@h+lqW@u I|xQ96t Xz\;97!ZH MzsU "bCuy>XcL=t>L+GE]cSA=~;`op'mjy(Y7'D}#Z]:''R\I=zkE|xRX1@oJD >p&KR&UhXܙ+ArUyIV4kR! cE\3*вȍ\p]x2] {r'MDNΕ|CH"l#{tRY -lF'ƛʝ;sa]w߈)Z[1INl? U&q1y^9>DϏx5:G:gW A|3'>?,w%[ۺct ;]!ѭai D4< {Y~o>M½1x%cJD_/N+<^GV߳ ~Wv3]j5e2쀟=xSu Zfa ~fyX'P$ΉZd63 #rV>.<ܺ&Exb9 `+D-ȡSaB J|ⴻ+ vv`02nGdeP #@,*S.9Tڒ^OIaRѲl(hYP:.TGχtJ M]"Ol!(VXz~dt M q^"5]teҪ} !=I] : M-hgiE;\P2uia]L֔CTTL"0;-'IJUU[}ZREM:LwmxkT{)F]sTXsvL+z1*4j-'\p4S<+@D)S!qYZX<1[E*||=zf PG}S ΃dҬl؅{pi,vpHƕtj֖B=2`=4`x"'#4h4vH=y֍KYP 9L%cL1vD`k֞%q@WqQT_@$8w/ H"mt^2G>㛭 Aڳ$Nj,û D[ /j c:H_+5xʥgr~ydZxOusċW4M}CKa_͗X|o*ip2rLyD*>QQzF۷ AXTL9A* ߵ!b/c϶S9Ec"' \rw@Sny!-roWO#DC'(!G+_P_?6r}&d.kxI D6W<C>`w4r71LIRqf0[ *]K)])v 1ծ ٭1t#I%͌KC'p aS0w*\4P?/PI 7rf_Q#HQCQg K=^EEZDM \k#et-M:3u4l'+52d8ل4y6Nx `9c{#ykuIg-)/Ht NKJ 5vO~tg&g/yv:(y>JK8 /"WS*N_g8YQIi+=|/PZrnRcFlUZ)po&h>}APR}5"@|7~YHeMS#}|"K!]Btw4*Q[u+`*{V3oi:k*k]D(FTr CeYlb6Vz[agc@DhrU%IjKL.?YT"=s3Y[a8z %Lj|/, b#7hz8g.XXD%OOsCT|h  v}j7\[I( }~sB>JSA<ӳ 1@JDuw8L|W[ d}Vx/\90 JC̐ ̇9P>T3&h~i:Yo\ `aVQrWtlv>h,W0\~Y%)+3-"mt)aJ*]"# wZ{ [BA P)rPuM⼻x@gQz.-':"@x8 xOR,1-5F O6~p"R g^?+*Q&gf sTa2R!QZ_,|PY y9,-`1mt&f-]`h!=`.0AZw6mzmBNbuXn3'T];\Z' u&5a" >4ޞۄM00`<* <:>#}taF Zh\(d,;*?tu:U +^;,@,9?&*ܬL8#j@e^N\{+^;'w m}$b~ HTdO9&`{z6+5AL5XX]pb$q ٚuz(EGYޯn"KR0,vN%Iݡx# ё鉤ܚk䕕􀽫Ԇ͈疷ê˥úሿՄ껭ށꦝ螗֌ٱծ˸׎鎳ρρƍԥمɌݪ唑̙诛വ`ސ׌뒫>'TCNT')) THEN GOTO CUR_LOOP$GOTO TEMPLOOP1$DONE_TEMPLOOP1: