1#!/bin/rc 2# restore arena# [dev] - load venti with arenas on dev, stored one per track 3# starting with arena#. must have run fmtarenas before restoring 4# the first arena in the partition. 5# this must be run on the venti server, without venti running on the 6# affected arena partition(s). 7rfork ne 8if (test -e /sys/lib/backup/funcs) 9 . /sys/lib/backup/funcs 10switch ($#*) { 11case 1 12case 2 13 rdev=$2 14case * 15 echo usage: $0 arena-num '[dev]' >[1=2] 16 exit usage 17} 18starena=$1 19if (! ~ $starena [0-9] [0-9][0-9] [0-9][0-9][0-9]) { 20 echo $0: bad starting arena: $starena >[1=2] 21 exit bad-arena-num 22} 23 24# clear any dregs from a previous run 25unmount /mnt/cd >[2]/dev/null 26sleep 1 27kill cdfs | rc 28sleep 1 29cdfs -d $rdev || exit 30cd /mnt/cd 31 32#for (track in d[0-9]*) 33# venti/wrarena $track # slow; takes about 12½ mins. per GB 34 35arena = $starena 36# set arenabase for arenastart 37arenabase = `{ venti/printarenapart $arenas | sed -e 's/.*arenabase=//' -e 1q } 38kill printarenapart | rc # printarenapart leaves a process behind 39# echo arenabase $arenabase 40 41skipping=yes 42for (track in d[0-9]*) { 43 if (~ track 'd[0-9]*') { 44 echo $0: no tracks in /mnt/cd >[1=2] 45 exit no-tracks 46 } 47 if (~ $skipping yes) { 48 # verify that first track is the expected one 49 type=`{file $track} 50 switch ($"type) { 51 case *': venti arena' 52 name=`{ venti/printarena $track >[2=1] | 53 sed -e 's/.*name=([^ =]+).*/\1/' -e 1q } 54 case * 55 name=NOT-A-VENTI-ARENA 56 } 57 kill printarena | rc # printarena leaves a process behind 58 59 echo -n first track is $"name'; is that right? ' 60 switch (`{read}) { 61 case [yY]* 62 skipping=no 63 case skip 64 skipping=yes 65 case * 66 echo aborting, arena is unchanged. >[1=2] 67 exit 'wrong track' 68 } 69 } 70 71 if (! ~ $skipping yes) { 72 # copy each track into its slot in the arena partition 73 venti/printarena $track >[2=1] | sed 1q | tr -d '\12' 74 kill printarena | rc # printarena leaves a process behind 75 76 off = `{arenastart $arena} 77 # echo -n writing $track to $arenas at 8K-block offset $off: 78 sleep 3 79 echo 80 # argh! something (cdfs?) appends 60K of *stuff* to each 81 # arena on optical disc. restrain dd. 82 count=`{ echo $arenasize/$blocksize | bc } 83 pump -i 1048576 -o 65536 -d 10 <$track | 84 dd -quiet 1 -count $count -bs $blocksize -of $arenas \ 85 -oseek $off 86 arena = `{hoc -e $arena+1} 87 } 88} 89# when all done, must run venti/checkarenas, fmtisect, fmtbloom, fmtindex, 90# and (the big one) venti/buildindex -b /cfg/pie/venti.conf 91