C C EVENT CODE FOR THE FILE TRANSFER NETWORK C VPI BASE CASE C SUBROUTINE INTLC C $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" C $INCLUDE:"UCOM.FOR" C C ROUTINE TO SET UP THE SIMULATION C CHARACTER*1 ICODE, DIR1, DIR2 CHARACTER*80 LINE, OPTIONS, EXPER, FNAME DIMENSION DELTIM(12) C SAVE IATEND DATA IATEND /1/ DATA DELTIM /2678400.0, 2678400.0, 2419200.0, 2678400.0, 1 2592000.0, 2678400.0, 2592000.0, 2678400.0, 2 2678400.0, 2592000.0, 2678400.0, 2592000.0/ C WRITE(*,*) 'SIMULATION REPLICATE ', NNRUN IF (IATEND.EQ.2) RETURN C C INITIALIZE THE FILE AND STATISTIC COUNTS C DO 5 IDCACHE = 1, 5 ICNTFL(IDCACHE,1) = 0 ICNTFL(IDCACHE,2) = 0 ICNTFL(IDCACHE,3) = 0 5 CONTINUE C DO 1 IDCACHE = 1, 6 DO 2 ISTAT = 1, 4 DO 3 ISUM = 1, 2 STATPREV (IDCACHE, ISTAT, ISUM) = 0.0 3 CONTINUE 2 CONTINUE 1 CONTINUE C C SET THE CORE AND FILE SYSTEMS C CALL STARTCORE CALL STARTFILE C C C OPEN THE EXPERIMENT FILE AND READ DOWN TO START C IF (NNRUN.EQ.1) THEN WRITE (*,*) 'ENTER THE NAME OF THE EXPERIMENT FILE' READ (*,FMT='(A80)') EXPER OPEN(FILE=EXPER, STATUS='OLD', UNIT = 25, IOSTAT = ISTAT) DO WHILE (ISTAT.NE.0) WRITE (*,*) 'ERROR OPENING EXPERIMENT FILE.', 1 ' PLEASE REENTER THE NAME.' READ (*,FMT='(A80)') EXPER OPEN(FILE=EXPER, STATUS='OLD', UNIT = 25, IOSTAT = ISTAT) ENDDO LINE = ' ' DO WHILE (LINE(1:6).NE.'TRACE:') READ(25, FMT='(A80)') LINE END DO C C READ IN THE OPTIONS FOR THIS SIMULATION C WRITE (*,*) 'ENTER THE NAME OF THE OPTIONS FILE' READ (*,FMT='(A80)') OPTIONS OPEN(FILE=OPTIONS,STATUS='OLD', UNIT = 24, IOSTAT = ISTAT) DO WHILE (ISTAT.NE.0) WRITE (*,*) 'ERROR OPENING OPTIONS FILE.', 1 ' PLEASE REENTER THE NAME.' READ (*,FMT='(A80)') OPTIONS OPEN(FILE=OPTIONS,STATUS='OLD', UNIT = 24, IOSTAT = ISTAT) ENDDO CALL PROPTS C C OPEN EACH OUTPUT TRACE FILE IF USED AND WRITE THE FILE HEADER C DO 7 IDCACHE = 1,6 IF (IDCACHE.LT.6 .AND. IS_CACHE(IDCACHE).EQ.1) GO TO 7 IBASE = (IDCACHE-1)*8 + 40 FNAME = ' ' IF (TRACES(1).EQ.'Y') THEN LUNIT = IBASE + 1 FNAME(1:7) = 'TRNTIME' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME, STATUS='UNKNOWN', UNIT = LUNIT) WRITE(LUNIT, 1 FMT='(1X, 19HTRANSFER TIME TRACE, / 1X, 6HTRACE:)') END IF C IF (TRACES(2).EQ.'Y') THEN LUNIT = IBASE + 2 FNAME(1:7) = 'HITRATE' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, FMT='(1X, 14HHIT RATE TRACE, / 1X, 6HTRACE:)') END IF C IF (TRACES(3).EQ.'Y') THEN LUNIT = IBASE + 3 FNAME(1:7) = 'TRNRATE' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, 1 FMT='(1X, 19HTRANSFER RATE TRACE, / 1X, 6HTRACE:)') END IF C IF (TRACES(4).EQ.'Y') THEN LUNIT = IBASE + 4 FNAME(1:7) = 'CACHENT' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, FMT="(1X,'CACHE AT SIMULATION END TIME' 1 ' IN CACHE TRACE' / 1X, 6HTRACE:)") END IF C IF (TRACES(5).EQ.'Y') THEN LUNIT = IBASE + 5 FNAME(1:7) = 'CACHETM' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, FMT="(1X, 'FILE LEAVING CACHE TRACE', / 1 1X, 6HTRACE:)") END IF C LUNIT = IBASE + 6 FNAME(1:7) = 'RESULTS' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.CSV' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, FMT="(1X,',', ',', 1 'Min.,', 2 'On,', 3 ',', 4 ',', 5 ',', 6 ',', ',', 7 ',', ',', 8 ',', 'Total,', 9 'Avg. ,', 1 'Avg.,',',','Percentage,', 2 'Percentage,', 'Average' )") WRITE(LUNIT, FMT="(1X,',', ',', 1 'File,', 2 'Campus,', 3 ',', 4 'Proxy,', 5 'Cache,', 6 ',',',', 7 'Hit ,', ' ,', 8 ',', 'Cache,', 9 'File ,', 1 'File,', 'Weighted,', 2 'of Ties,','of Ties,', 'URLs')") WRITE(LUNIT, FMT="(1X,'Cache,','Cache,', 1 'Size,', 2 'Files ,', 3 'All,', 4 'Speed,', 5 'Replacement,', 6 'Parameter,', 'Parameter,', 7 'Transfers ,', 'Current,', 8 'Hit ,', 'Size ,', 9 'Life ,', 1 'Transfer,', 'Hit,','Primary,', 2 'Secondary,' ,'Per')") WRITE(LUNIT, FMT="(1X,'ID,', 'Size ,', 1 'Cached ,', 2 'Cached ,', 3 'Files ,', 4 'Factor,', 5 'Policy,', 6 '1,', '2,', 7 'Different ,','Replicate ,', 8 'Rate,', 'at End ,', 9 'in Cache ,', 1 'Rate,', 'Rate,','Key,', 2 'Key,', 'Tie' )") WRITE(LUNIT, FMT="(1X,',', '(MBytes),', 1 '(KBytes),', 2 '(+1->Y or -1->N),', 3 '(+1->Y or -1->N),', 4 ',', 5 ',', 6 ',', ',', 7 '(+1->Y or -1->N),',' ,', 8 ',', '(KBytes),', 9 '(Seconds),', 1 '(Bytes/Sec),',' ')") C LUNIT = IBASE + 7 FNAME(1:7) = 'ACCESS_' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT, FMT="(1X,'FILE', T50, 'CUMULATIVE')") WRITE(LUNIT, FMT="(1X,'NAME', T50, ' ACCESSES')") C LUNIT = IBASE + 8 FNAME(1:7) = 'BYDAY__' WRITE(FNAME(8:8), FMT="(I1)") IDCACHE FNAME(9:12) = '.TXT' OPEN (FILE=FNAME ,STATUS='UNKNOWN',UNIT = LUNIT) WRITE(LUNIT,FMT="(1X,T19,'CUMULATIVE',T56,'ONE DAY')") WRITE(LUNIT,FMT="(1X,T20,'WEIGHTED', T55,'WEIGHTED')") WRITE(LUNIT,FMT="(1X,' DAY',T10,'HIT RATE',T20,'HIT RATE',T30, 1 ' LIFETIME',T45,'HIT RATE',T55,'HIT RATE',T65, 2 ' LIFETIME')") 7 CONTINUE C OPEN (FILE='MESSAGES.TXT', STATUS='UNKNOWN', UNIT = 40) C C SET THE FIRST ICUREP VALUE TO TRIGGER READING THE EXPERIMENT C ICUREP = NREP C ENDIF C C READ AND PROCESS THE EXPERIMENT C ICUREP = ICUREP + 1 IF (ICUREP.GT.NREP) THEN ICUREP = 1 READ(25, FMT='(A80)') LINE DO WHILE(LINE(1:1).EQ.'#') READ(25, FMT='(A80)') LINE END DO IF (LINE(1:4).NE.'END.') THEN P1 = 0.0 P2 = 0.0 CALL PREXP(LINE) C C EVENT FOR READING THE TRACE FILE C CALL SCHDL(7,0.0,ATRIB) ELSE IATEND = 2 ENDIF ELSE CALL SCHDL(7,0.0,ATRIB) ENDIF C C OPEN TRACE FILE AND TIME FILE. C READ DOWN TO START OF TRACE FOR EACH. C READ FIRST TRACE RECORD IN EACH FILE C IF (LINE(1:4) .EQ. 'END.') RETURN DO 10 IFILE = 1, 5 IF (FILES(IFILE).NE.'NONE') THEN OPEN (FILE=FILES(IFILE),STATUS='OLD',UNIT = IFILE+30) LINE = ' ' DO WHILE (LINE(1:6).NE.'TRACE:') READ(IFILE+30, FMT='(A80)') LINE END DO BASETIME(IFILE) = 0.0 FILENAME(IFILE) = "\JAN01" CALL SETFILE(IFILE+30, ICODE) IRET = 1 DO WHILE (IRET.EQ.1) READ (IFILE+25, FMT='(A80)') RECORD(IFILE) CALL PRTRAC(RECORD(IFILE), CURTIME(IFILE), ATRIB, IRET) END DO END IF 10 CONTINUE C C SET BASETIME TO EARLIEST MONTH C MONMIN = HUGE(I) DO 15 IFILE=1,5 IF (FILES(IFILE).NE.'NONE') THEN LINE = FILENAME(IFILE) ISTART = INDEX(LINE, '\', .TRUE.) MON = NUM_MONTH(LINE(ISTART+1:ISTART+3)) IF (MON.LT.MONMIN) THEN MONMIN = MON ENDIF ENDIF 15 CONTINUE C DO 20 IFILE = 1, 5 IF (FILES(IFILE).NE.'NONE') THEN DO 30 IMON = 1, MONMIN-1 BASETIME(IFILE) = BASETIME(IFILE) - DELTIM(IMON) 30 CONTINUE C C TIME IS IN INTEGER. UNITS ARE ADJUSTED TO SECONDS BY SF C CURTIME(IFILE) = CURTIME(IFILE) / SF + BASETIME(IFILE) ENDIF 20 CONTINUE C C SCHEDULE CLEARING OF TIME PERSISTENT STATISTICS AT EARLIEST RECORD C TIME C CALL FINDMIN (IFILEMIN, TIMEMIN) CALL SCHDL(8, CURTIME(IFILEMIN), ATRIB) C C DEFINE THE ORDERINGS FOR THE POLICIES USED IN THIS REPLICATE C C FIRST LEVEL CACHES (UP TO FIVE) C C SET RANDOM STREAM SEED C CALL GETTIM (IHR, IMIN, ISEC, I100TH) CALL SEED (ISEC*I100TH) C DO 40 I = 1,5 IF (IS_CACHE(I).EQ.2) THEN IF (POLICY(1:5).NE.'PITKO') THEN CALL DFFILE (I, 2, 14) ELSE CALL DFFILE (I, 3, 14) ENDIF CALL DFKEY(1, 'UP', 0, 'UP') IF (POLICY(1:5).NE.'SORT ') THEN CALL DFKEY(7, 'UP', 0, 'UP') C ELSE IF (PP1.EQ.2 .OR. PP1.EQ.12) THEN DIR1 = 'D' ELSE DIR1 = 'U' ENDIF C IF (PP2.EQ.2 .OR. PP2.EQ.12) THEN DIR2 = 'D' ELSE DIR2 = 'U' ENDIF CALL DFKEY(IFIX(PP1), DIR1, IFIX(PP2), DIR2) ENDIF C C AND DEFINE ORDERING FOR PITKOW AND RECKER AND IF NECESSARY C IF (POLICY(1:5).EQ.'PITKO') THEN CALL DFKEY(2, 'DOWN', 0, 'UP') ENDIF ENDIF 40 CONTINUE C C SECOND LEVEL CACHE C IF (POLICY2(1:4).NE.'NONE') THEN IF (POLICY2(1:5).NE.'PITKO') THEN CALL DFFILE (6, 2, 14) ELSE CALL DFFILE (6, 3, 14) ENDIF CALL DFKEY(1, 'UP', 0, 'UP') IF (POLICY2(1:5).NE.'SORT ') THEN CALL DFKEY(7, 'UP', 0, 'UP') C ELSE IF (PP12.EQ.2 .OR. PP12.EQ.12) THEN DIR1 = 'D' ELSE DIR1 = 'U' ENDIF C IF (PP22.EQ.2 .OR. PP22.EQ.12) THEN DIR2 = 'D' ELSE DIR2 = 'U' ENDIF CALL DFKEY(IFIX(PP12), DIR1, IFIX(PP22), DIR2) ENDIF C C AND DEFINE ORDERING FOR PITKOW AND RECKER AND IF NECESSARY C IF (POLICY2(1:5).EQ.'PITKO') THEN CALL DFKEY(2, 'DOWN', 0, 'UP') ENDIF ENDIF C C SCHEDULE END OF DAY EVENT C CALL SCHDL (9, BASETIME(IFILEMIN), ATRIB) C C SCHEDULE EVENT TO TURN TRACE ON C CALL SCHDL (10, CURTIME(IFILEMIN)+TRACETIME(1)*60.0*60.0, ATRIB) C C OPEN THE TIME FILE AND READ DOWN TO TRACE C IF(FILES(6).NE.'NONE') THEN OPEN (FILE=FILES(6),STATUS='OLD',UNIT =22) LINE = ' ' DO WHILE (LINE(1:6).NE.'TRACE:') READ(22, FMT='(A80)') LINE END DO END IF C C OPEN THE INITIAL CACHE FILE C READ IN EACH FILE AND PLACE IN SLAM II FILE 1 C DO 50 I = 1,5 IF(INITFILES(I).NE.'NONE') THEN OPEN (FILE=INITFILES(I),STATUS='OLD',UNIT =23) LINE = ' ' DO WHILE (LINE(1:6).NE.'TRACE:') READ(23, FMT='(A80)') LINE END DO C READ (23, FMT='(A80)') LINE DO WHILE (LINE(1:4).NE.'END.') CALL PRTRAC(LINE, TIME, ATRIB, IRET) IF (ATRIB(2).GE. FILEMN) THEN XX(1) = XX(1) + ATRIB(2) XX(2) = XX(1) / 1024.0 C ATRIB(13) = 1.0 ATRIB(14) = 0.0 ISIZE = 0 DO WHILE (ATRIB(2).GE.2**ISIZE) ISIZE = ISIZE + 1 END DO ATRIB(15) = ISIZE - 1 CALL PUTFILE(ICACHE(I), ATRIB, ISOK, ISTIEP, ISTIES) XX(3) = NUM_FILE(1) IF (ISOK.EQ.1) THEN CALL WS_ERROR(106,'F') ENDIF ENDIF READ (23, FMT='(A80)') LINE END DO END IF 50 CONTINUE C RETURN END C SUBROUTINE OTPUT $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" C $INCLUDE:"UCOM.FOR" C C END OF SIMULATION ROUTINE C CHARACTER*200 LINE C C CLOSE INPUT FILES C DO 5 IFILE = 1, 5 IF(FILES(IFILE).NE.'NONE') CLOSE(IFILE+30) 5 CONTINUE CLOSE(22) CLOSE(23) IF(TNOW.EQ.0.0) RETURN C C TRACE THE CURRENT CONTENTS OF THE CACHE C DO 7 IDCACHE = 1,6 IF (IDCACHE.LT.6 .AND. IS_CACHE(IDCACHE).EQ.1 ) GO TO 7 IF (IDCACHE.EQ.6 .AND. POLICY2(1:5).EQ.'NONE ') GO TO 7 IBASE = (IDCACHE-1)*8 + 40 CALL COPYHEAD (IDCACHE, 2, ATRIB, ISOK) IEND = NUM_FILE(IDCACHE) DO 10 I = 1, IEND CALL PUTRACE (IDBASE+4, TNOW, ATRIB, (TNOW-ATRIB(8))*SF) CALL MEASURE (TNOW-ATRIB(8), 8, IDCACHE) CALL MEASURE (ATRIB(13), 14, IDCACHE) CALL MEASURE (ATRIB(2), 9, IDCACHE) CALL COPYSEQ (IDCACHE, 2, ATRIB, ISOK) 10 CONTINUE C C PLACE THE END MARKER AT THE END OF EACH TRACE C DO 20 I = 1,5 IF (TRACES(I).EQ.'Y') WRITE(IBASE+I, FMT='(1X,4HEND.)') 20 CONTINUE C C MISCELLANEOUS OUTPUT MESSAGES C WRITE(40, FMT="(/////,'MESSAGE FOR CACHE ',I3)") IDCACHE IF (IDCACHE.NE.6) 1 WRITE(40, FMT="(' NUMBER OF FILES WITH NO SIZE',I10)") 1 ICNTFL(IDCACHE,3) C WRITE(40, FMT= 1 "(' NUMBER OF FILES IN CACHE AT END OF SIMULATION',I10)") IEND C WRITE(40, FMT= 1 "(' TOTAL SIZE OF FILES IN CACHE AT END OF SIMULATION (KBYTES)', 2 I10)") JFIX(XX(IDCACHE*3-1)) C WRITE(40, FMT= 1 "(' NUMBER OF FILES REPLACED IN THE CACHE', F10.0)") 2 PMNUM(7,IDCACHE) C IF (IDCACHE.NE.6) THEN WRITE(40, FMT="(42H NUMBER OF RECORDS READ FROM FILE OF FILES, 1 I10)") ICNTFL(IDCACHE,1) C WRITE(40, FMT="(42H NUMBER OF RECORDS READ FROM FILE OF TIMES, 1 I10)") ICNTFL(IDCACHE,2) C WRITE(40, FMT="(' NUMBER OF FILE TRANSFERS OBSERVED', I10)") 1 JFIX(PMNUM(2,IDCACHE)) C WRITE(40, FMT="(' AVERAGE TRANSFER RATE', F10.2)") 1 PMAVG(2,IDCACHE) C WRITE(40, FMT="(' AVERAGE IN-BOUND TRANSFER RATE', F10.2)") 1 PMAVG(6,IDCACHE) C WRITE(40, FMT="(' AVERAGE FILE SIZE', F10.0)") 1 PMAVG(5,IDCACHE) ENDIF C WRITE(40, 1 FMT="(' NUMBER AND AVERAGE FILE SIZE FOR CACHE HITS', 2F10.0)") 2 PMNUM(10,IDCACHE), PMAVG(10,IDCACHE) C WRITE(40, 1 FMT="(' NUMBER AND AVERAGE FILE SIZE FOR CACHE MISSES',2F10.0)") 1 PMNUM(11,IDCACHE), PMAVG(11,IDCACHE) C WRITE(40, 1 FMT="(' TOTAL NUMBER OF REFERENCES TO FILES IN THE CACHE', 1 F10.1)") PMNUM(14,IDCACHE)*PMAVG(14,IDCACHE) C WRITE(40, 1 FMT="(' AVERAGE NUMBER OF REFERENCES TO FILES IN THE CACHE', 1 F10.1)") PMAVG(14,IDCACHE) C C WRITE EXPERIMENT C LINE = ' ' C IF (IDCACHE.LT.6) THEN SIZE = CACHESIZ(1) ELSE SIZE = CACHESIZ(2) ENDIF C WRITE(LINE(1:4),FMT="(1X,I2,',')") IDCACHE WRITE(LINE(5:23),FMT="(F10.2,',',F7.0,',')") SIZE, FILEMN C IF (DOMAIN.EQ.'Y') THEN LINE(24:27) = ' +1,' ELSE LINE(24:27) = ' -1,' END IF C WRITE (LINE(28:39), FMT="(1X,10I1,',')") IBITMAP C WRITE (LINE(40:48),FMT="(1X,F7.2,',')") PROXY C IF(POLICY(1:5).EQ.'LRU ') LINE(49:51) = ' 1,' IF(POLICY(1:5).EQ.'LRU-M') LINE(49:51) = ' 2,' IF(POLICY(1:5).EQ.'LRU-T') LINE(49:51) = ' 3,' IF(POLICY(1:5).EQ.'PITKO') LINE(49:51) = ' 4,' IF(POLICY(1:5).EQ.'SORT ') LINE(49:51) = ' 5,' WRITE (LINE(52:68),FMT="(1X,2(F7.2,','))") 1 PP1, PP2 C IF (HITS.EQ.'Y') THEN LINE(69:72) = ' +1,' ELSE LINE(69:72) = ' -1,' END IF C WRITE(LINE(73:79),FMT="(1X,I5,',')") ICUREP C WRITE(LINE(80:88),FMT="(1X,F7.1,',')") 1 (PMAVG(3,IDCACHE)-1.0)*100.0 C WRITE(LINE(89:122),FMT="(1X,3(F10.0,','))") 1 XX(IDCACHE*3-1), PMAVG(7,IDCACHE), PMAVG(2,IDCACHE) C WHR = (PMAVG(10,IDCACHE)*PMNUM(10,IDCACHE))*100.0 / 1 (PMAVG(10,IDCACHE)*PMNUM(10,IDCACHE) + 2 PMAVG(11,IDCACHE)*PMNUM(11,IDCACHE)) WRITE(LINE(123:131), FMT="(1X,F7.1,',')") WHR C WRITE(LINE(132:140), FMT="(1X,F7.1,',')") 1 (PMNUM(12,IDCACHE) / PMNUM(13,IDCACHE))*100.0 WRITE(LINE(141:149), FMT="(1X,F7.1,',')") 1 (PMAVG(13,IDCACHE)-1.0)*100.0 C WRITE(LINE(150:157), FMT="(1X,F7.1)") 1 PMAVG(12,IDCACHE) C WRITE(IBASE+6,FMT="(1X,A157)") LINE(1:157) C WRITE(IBASE+7,FMT="(1X,'END OF SIMULATION',T50,F10.0)") 1 PMNUM(5,IDCACHE) C C END OF DAY REPORT C WRITE(IBASE+8,FMT="(1X,'END',T10,F8.1,T20,F8.1,T30,F10.0)") 1 (PMAVG(3,IDCACHE)-1.0)*100.0, WHR, PMAVG(7,IDCACHE) C 7 CONTINUE C RETURN END C