As described above, we can skip bad directories by modifying the program RTOX.
Extracting the source for RTOX
ypatchy /cern/new/src/car/zebra.car r2x.f :go <We then modify the routine RZTOFZ to exclude the directories that contain corrupted entries.
Modifying RTOX
CDECK ID>, RZTOFZ. SUBROUTINE RZTOFZ(LUNFZ,CHOPT) * ************************************************************************ * * Copy the CWD tree to a sequential FZ file * The FZ file must have been declared with FZOPEN * Input: * LUNFZ Logical unit number of the FZ sequential access file * CHOPT default save only the highest cycle to LUNFZ * 'C' save all cycles * * Called by* * Author : R.Brun DD/US/PD * Written : 14.05.86 * Last mod: 26.06.92 JDS - protect against RZPAFF problems * ************************************************************************ PARAMETER (IQDROP=25, IQMARK=26, IQCRIT=27, IQSYSX=28) COMMON /QUEST/ IQUEST(100) COMMON /ZVFAUT/IQVID(2),IQVSTA,IQVLOG,IQVTHR(2),IQVREM(2,6) COMMON /ZEBQ/ IQFENC(4), LQ(100) DIMENSION IQ(92), Q(92) EQUIVALENCE (IQ(1),LQ(9)), (Q(1),IQ(1)) COMMON /MZCA/ NQSTOR,NQOFFT(16),NQOFFS(16),NQALLO(16), NQIAM +, LQATAB,LQASTO,LQBTIS, LQWKTB,NQWKTB,LQWKFZ +, MQKEYS(3),NQINIT,NQTSYS,NQM99,NQPERM,NQFATA,NQCASE +, NQTRAC,MQTRAC(48) EQUIVALENCE (KQSP,NQOFFS(1)) COMMON /MZCB/ JQSTOR,KQT,KQS, JQDIVI,JQDIVR +, JQKIND,JQMODE,JQDIVN,JQSHAR,JQSHR1,JQSHR2,NQRESV +, LQSTOR,NQFEND,NQSTRU,NQREF,NQLINK,NQMINR,LQ2END +, JQDVLL,JQDVSY,NQLOGL,NQSNAM(6) DIMENSION IQCUR(16) EQUIVALENCE (IQCUR(1),LQSTOR) COMMON /MZCC/ LQPSTO,NQPFEN,NQPSTR,NQPREF,NQPLK,NQPMIN,LQP2E +, JQPDVL,JQPDVS,NQPLOG,NQPNAM(6) +, LQSYSS(10), LQSYSR(10), IQTDUM(22) +, LQSTA(21), LQEND(20), NQDMAX(20),IQMODE(20) +, IQKIND(20),IQRCU(20), IQRTO(20), IQRNO(20) +, NQDINI(20),NQDWIP(20),NQDGAU(20),NQDGAF(20) +, NQDPSH(20),NQDRED(20),NQDSIZ(20) +, IQDN1(20), IQDN2(20), KQFT, LQFSTA(21) DIMENSION IQTABV(16) EQUIVALENCE (IQTABV(1),LQPSTO) C COMMON /RZCL/ LTOP,LRZ0,LCDIR,LRIN,LROUT,LFREE,LUSED,LPURG +, LTEMP,LCORD,LFROM EQUIVALENCE (LQRS,LQSYSS(7)) C PARAMETER (NLPATM=100) COMMON /RZDIRN/NLCDIR,NLNDIR,NLPAT COMMON /RZDIRC/CHCDIR(NLPATM),CHNDIR(NLPATM),CHPAT(NLPATM) CHARACTER*16 CHNDIR, CHCDIR, CHPAT C COMMON /RZCH/ CHWOLD,CHL CHARACTER*255 CHWOLD,CHL C PARAMETER (KUP=5,KPW1=7,KNCH=9,KDATEC=10,KDATEM=11,KQUOTA=12, + KRUSED=13,KWUSED=14,KMEGA=15,KIRIN=17,KIROUT=18, + KRLOUT=19,KIP1=20,KNFREE=22,KNSD=23,KLD=24,KLB=25, + KLS=26,KLK=27,KLF=28,KLC=29,KLE=30,KNKEYS=31, + KNWKEY=32,KKDES=33,KNSIZE=253,KEX=6,KNMAX=100) C CHARACTER*(*) CHOPT DIMENSION ISD(NLPATM),NSD(NLPATM),IHDIR(4) * *----------------------------------------------------------------------- * IQUEST(1)=0 IQ1=0 IF(LQRS.EQ.0)GO TO 99 * CALL UOPTC(CHOPT,'C',IOPTC) NLPAT0=NLPAT DO 5 I=1,NLPAT0 CHPAT(I)=CHCDIR(I) 5 CONTINUE ITIME=0 CALL RZCDIR(CHWOLD,'R') * * Garbage collection in user short range divisions * in primary store * CALL MZGARB(21,0) * * Write general header * IHDIR(1)=12345 IHDIR(2)=NLPAT0 CALL FZOUT(LUNFZ,JQPDVS,0,1,'Z',1,2,IHDIR) IF(IQUEST(1).NE.0)THEN IQ1=IQUEST(1) GO TO 90 ENDIF * * Set CWD to the current level * 10 CONTINUE IF(ITIME.NE.0)THEN CALL RZPAFF(CHPAT,NLPAT,CHL) IF(IQUEST(1).NE.0)THEN IQ1=IQUEST(1) NLPAT=NLPAT-1 GO TO 20 ENDIF CALL RZCDIR(CHL,' ') ENDIF ISD(NLPAT)=0 NSD(NLPAT)=IQ(KQSP+LCDIR+KNSD) * * Skip bad directories * if(chl(1:lchl).eq.'//RZ/L3/PROD/DATA/SDRETT') goto 20 * * Write current directory * CALL RZTOF1(LUNFZ,IOPTC) IF(IQUEST(1).NE.0)THEN IQ1=IQUEST(1) NLPAT=NLPAT-1 GO TO 20 ENDIF * * Process possible down directories * 20 ISD(NLPAT)=ISD(NLPAT)+1 IF(ISD(NLPAT).LE.NSD(NLPAT))THEN NLPAT=NLPAT+1 LS=IQ(KQSP+LCDIR+KLS) IH=LS+7*(ISD(NLPAT-1)-1) CALL ZITOH(IQ(KQSP+LCDIR+IH),IHDIR,4) CALL UHTOC(IHDIR,4,CHPAT(NLPAT),16) ITIME=ITIME+1 GO TO 10 ELSE NLPAT=NLPAT-1 IF(NLPAT.GE.NLPAT0)THEN LUP=LQ(KQSP+LCDIR+1) CALL MZDROP(JQPDVS,LCDIR,' ') LCDIR=LUP GO TO 20 ENDIF ENDIF * * Write final trailer * NLPAT=NLPAT0 CALL FZOUT(LUNFZ,JQPDVS,0,1,'Z',1,1,99) IF(IQUEST(1).NE.0)THEN IQ1=IQUEST(1) GO TO 90 ENDIF LCORD=LQ(KQSP+LTOP-4) IF(LCORD.NE.0)THEN CALL MZDROP(JQPDVS,LCORD,'L') LCORD=0 ENDIF * * Reset CWD * 90 CONTINUE CALL RZCDIR(CHWOLD,' ') IF(IQ1.NE.0.AND.IQUEST(1).EQ.0)IQUEST(1)=1 * 99 RETURN END We now perform the following steps:
- Convert the catalogue to sequential (FZ) format and back, skipping bad directories in the process
- Extract all good entries in the bad directories, as shown above
- Move this file to the input directory (/todo) of the server
Now we have almost completed the catalogue recovery, with the exception of the corrupted entries.