xref: /plan9-contrib/sys/lib/dist/pc/inst/fmtventi (revision 3cdeec5c5169e8d928b070689be6770201eac7a6)
139734e7eSDavid du Colombier#!/bin/rc
239734e7eSDavid du Colombier
339734e7eSDavid du Colombier# desc: initialize disks for a venti server
4a22b0629SDavid du Colombier# prereq: mountdist
539734e7eSDavid du Colombier
639734e7eSDavid du Colombierswitch($1){
739734e7eSDavid du Colombiercase checkready checkdone
839734e7eSDavid du Colombier	if(! ~ $fstype fossil+venti){
939734e7eSDavid du Colombier		fmtventi=notdone
1039734e7eSDavid du Colombier		export fmtventi
1139734e7eSDavid du Colombier		exit
1239734e7eSDavid du Colombier	}
13*3cdeec5cSDavid du Colombier	if(! test -e /bin/venti/fmtarenas || ! test -e /bin/venti/fmtisect || ! test -e /bin/venti/fmtindex || ! test -e /bin/venti/fmtbloom){
14a22b0629SDavid du Colombier		bind -a /n/dist/386/bin/venti /bin/venti
15*3cdeec5cSDavid du Colombier		if(! test -e /bin/venti/fmtarenas || ! test -e /bin/venti/fmtisect || ! test -e /bin/venti/fmtindex || ! test -e /bin/venti/fmtbloom){
16a22b0629SDavid du Colombier			fmtventi=notdone
17a22b0629SDavid du Colombier			export fmtventi
18a22b0629SDavid du Colombier			exit
19a22b0629SDavid du Colombier		}
20a22b0629SDavid du Colombier	}
21a22b0629SDavid du Colombier	ff=`{ls /dev/sd*/arenas* /dev/fs/arenas* >[2]/dev/null}
22a22b0629SDavid du Colombier	if(~ $#ff 0){
23a22b0629SDavid du Colombier		fmtventi=notdone
24a22b0629SDavid du Colombier		export fmtventi
25a22b0629SDavid du Colombier		exit
26a22b0629SDavid du Colombier	}
2739734e7eSDavid du Colombier	gg=()
2839734e7eSDavid du Colombier	for(f in $ff)
2939734e7eSDavid du Colombier		if(isventi $f)
3039734e7eSDavid du Colombier			gg=($gg $f)
3139734e7eSDavid du Colombier	if(~ $#gg 0){
32a22b0629SDavid du Colombier		fmtventi=ready
3339734e7eSDavid du Colombier		export fmtventi
3439734e7eSDavid du Colombier		exit
3539734e7eSDavid du Colombier	}
36a22b0629SDavid du Colombier
37a22b0629SDavid du Colombier	ventiarena=$gg(1)
38a22b0629SDavid du Colombier	export ventiarena
39a22b0629SDavid du Colombier
4039734e7eSDavid du Colombier	fmtventi=done
4139734e7eSDavid du Colombier	export fmtventi
4239734e7eSDavid du Colombier	exit
4339734e7eSDavid du Colombier
4439734e7eSDavid du Colombiercase go
45a22b0629SDavid du Colombier	ff=`{ls /dev/sd*/arenas* /dev/fs/arenas* >[2]/dev/null}
4639734e7eSDavid du Colombier	if(~ $#ff 0){
4739734e7eSDavid du Colombier		echo 'You need to create a partition or partitions to hold the Venti arenas.'
48a22b0629SDavid du Colombier		echo 'The arena partition names must begin with "arenas".'
4939734e7eSDavid du Colombier		echo
5039734e7eSDavid du Colombier		fmtventi=notdone
5139734e7eSDavid du Colombier		export fmtventi
5239734e7eSDavid du Colombier		exit
5339734e7eSDavid du Colombier	}
5439734e7eSDavid du Colombier	default=(-d $"ff)
5539734e7eSDavid du Colombier	if(! ~ $#ventiarena 0){
5639734e7eSDavid du Colombier		default=(-d $"ventiarena)
5739734e7eSDavid du Colombier	}
58f8d0ebfeSDavid du Colombier	echo You have the following Venti arena partitions.
5939734e7eSDavid du Colombier	ls -l $ff
6039734e7eSDavid du Colombier	echo
6139734e7eSDavid du Colombier
6239734e7eSDavid du Colombier	prompt $default 'Venti arena partitions to use'
6339734e7eSDavid du Colombier	aa=`{echo $rd}
6439734e7eSDavid du Colombier	bad=no
6539734e7eSDavid du Colombier	for(a in $aa){
6639734e7eSDavid du Colombier		if(! ~ $a $ff){
6739734e7eSDavid du Colombier			echo 'Bad venti arena partition' $a
6839734e7eSDavid du Colombier			fmtventi=notdone
6939734e7eSDavid du Colombier			export fmtventi
7039734e7eSDavid du Colombier			exit
7139734e7eSDavid du Colombier		}
7239734e7eSDavid du Colombier	}
7339734e7eSDavid du Colombier	ventiarena=$aa
7439734e7eSDavid du Colombier	export ventiarena
7539734e7eSDavid du Colombier
76a22b0629SDavid du Colombier	gg=`{ls /dev/sd*/isect* /dev/fs/isect* >[2]/dev/null}
7739734e7eSDavid du Colombier	if(~ $#gg 0){
7839734e7eSDavid du Colombier		echo 'You need to create a partition or partitions to hold the Venti indices.'
79a22b0629SDavid du Colombier		echo 'The index partition names must begin with "isect".'
8039734e7eSDavid du Colombier		echo
8139734e7eSDavid du Colombier		fmtventi=notdone
8239734e7eSDavid du Colombier		export fmtventi
8339734e7eSDavid du Colombier		exit
8439734e7eSDavid du Colombier	}
8539734e7eSDavid du Colombier	default=(-d $"gg)
8639734e7eSDavid du Colombier	if(! ~ $#ventiindex 0){
8739734e7eSDavid du Colombier		default=(-d $"ventiindex)
8839734e7eSDavid du Colombier	}
8939734e7eSDavid du Colombier
9039734e7eSDavid du Colombier	echo You have the following Venti index partitions.
9139734e7eSDavid du Colombier	ls -l $gg
9239734e7eSDavid du Colombier	echo
9339734e7eSDavid du Colombier
94f8d0ebfeSDavid du Colombier	prompt $default 'Venti index partitions to use'
9539734e7eSDavid du Colombier	aa=`{echo $rd}
9639734e7eSDavid du Colombier	bad=no
9739734e7eSDavid du Colombier	for(a in $aa){
9839734e7eSDavid du Colombier		if(! ~ $a $gg){
9939734e7eSDavid du Colombier			echo 'Bad venti index partition' $a
10039734e7eSDavid du Colombier			fmtventi=notdone
10139734e7eSDavid du Colombier			export fmtventi
10239734e7eSDavid du Colombier			exit
10339734e7eSDavid du Colombier		}
10439734e7eSDavid du Colombier	}
10539734e7eSDavid du Colombier	ventiindex=$aa
10639734e7eSDavid du Colombier	export ventiindex
10739734e7eSDavid du Colombier
108*3cdeec5cSDavid du Colombier	hh=`{ls /dev/sd*/bloom* /dev/fs/bloom* >[2]/dev/null}
109*3cdeec5cSDavid du Colombier	if(~ $#hh 0){
110*3cdeec5cSDavid du Colombier		echo 'You need to create a partition or partitions to hold the Venti bloom.'
111*3cdeec5cSDavid du Colombier		echo 'The bloom partition names must begin with "bloom".'
112*3cdeec5cSDavid du Colombier		echo
113*3cdeec5cSDavid du Colombier		fmtventi=notdone
114*3cdeec5cSDavid du Colombier		export fmtventi
115*3cdeec5cSDavid du Colombier		exit
116*3cdeec5cSDavid du Colombier	}
117*3cdeec5cSDavid du Colombier	default=(-d $"hh)
118*3cdeec5cSDavid du Colombier	if(! ~ $#ventibloom 0){
119*3cdeec5cSDavid du Colombier		default=(-d $"ventibloom)
120*3cdeec5cSDavid du Colombier	}
121*3cdeec5cSDavid du Colombier
122*3cdeec5cSDavid du Colombier	echo You have the following Venti bloom partitions.
123*3cdeec5cSDavid du Colombier	ls -l $hh
124*3cdeec5cSDavid du Colombier	echo
125*3cdeec5cSDavid du Colombier
126*3cdeec5cSDavid du Colombier	prompt $default 'Venti bloom partitions to use'
127*3cdeec5cSDavid du Colombier	aa=`{echo $rd}
128*3cdeec5cSDavid du Colombier	bad=no
129*3cdeec5cSDavid du Colombier	for(a in $aa){
130*3cdeec5cSDavid du Colombier		if(! ~ $a $hh){
131*3cdeec5cSDavid du Colombier			echo 'Bad venti bloom partition' $a
132*3cdeec5cSDavid du Colombier			fmtventi=notdone
133*3cdeec5cSDavid du Colombier			export fmtventi
134*3cdeec5cSDavid du Colombier			exit
135*3cdeec5cSDavid du Colombier		}
136*3cdeec5cSDavid du Colombier	}
137*3cdeec5cSDavid du Colombier	ventibloom=$aa
138*3cdeec5cSDavid du Colombier	export ventibloom
139*3cdeec5cSDavid du Colombier
14039734e7eSDavid du Colombier	n=-1
14139734e7eSDavid du Colombier	fmta=()
14239734e7eSDavid du Colombier	for(a in $ventiarena){
14339734e7eSDavid du Colombier		do=yes
14439734e7eSDavid du Colombier		n=`{hoc -e 1+$n}
14539734e7eSDavid du Colombier		if(isventiarenas $a){
14639734e7eSDavid du Colombier			echo File $a is already formatted as a Venti arenas partition.
14739734e7eSDavid du Colombier			prompt -d no 'Reformat '$a yes no
14839734e7eSDavid du Colombier			do=$rd
14939734e7eSDavid du Colombier		}
15039734e7eSDavid du Colombier		if(~ $do yes)
15139734e7eSDavid du Colombier			fmta=($fmta arenas$n:$a)
15239734e7eSDavid du Colombier	}
15339734e7eSDavid du Colombier
15439734e7eSDavid du Colombier	n=-1
15539734e7eSDavid du Colombier	fmti=()
15639734e7eSDavid du Colombier	for(a in $ventiindex){
15739734e7eSDavid du Colombier		do=yes
15839734e7eSDavid du Colombier		n=`{hoc -e 1+$n}
15939734e7eSDavid du Colombier		if(isventiisect $a){
16039734e7eSDavid du Colombier			echo File $a is already formatted as a Venti index section.
16139734e7eSDavid du Colombier			prompt -d no 'Reformat '$a yes no
16239734e7eSDavid du Colombier			do=$rd
16339734e7eSDavid du Colombier		}
16439734e7eSDavid du Colombier		if(~ $do yes)
16539734e7eSDavid du Colombier			fmti=($fmti isect$n:$a)
16639734e7eSDavid du Colombier	}
16739734e7eSDavid du Colombier
168*3cdeec5cSDavid du Colombier	n=-1
169*3cdeec5cSDavid du Colombier	fmtb=()
170*3cdeec5cSDavid du Colombier	for(a in $ventibloom){
171*3cdeec5cSDavid du Colombier		do=yes
172*3cdeec5cSDavid du Colombier		n=`{hoc -e 1+$n}
173*3cdeec5cSDavid du Colombier		if(isventibloom $a){
174*3cdeec5cSDavid du Colombier			echo File $a is already formatted as a Venti bloom section.
175*3cdeec5cSDavid du Colombier			prompt -d no 'Reformat '$a yes no
176*3cdeec5cSDavid du Colombier			do=$rd
177*3cdeec5cSDavid du Colombier		}
178*3cdeec5cSDavid du Colombier		if(~ $do yes)
179*3cdeec5cSDavid du Colombier			fmtb=($fmtb bloom$n:$a)
180*3cdeec5cSDavid du Colombier	}
181*3cdeec5cSDavid du Colombier
18239734e7eSDavid du Colombier	echo Formatting Venti arenas and indices (this takes a while).
18339734e7eSDavid du Colombier	# do each disk in parallel
18439734e7eSDavid du Colombier	echo good >/tmp/fmt
18539734e7eSDavid du Colombier	dd=()
186*3cdeec5cSDavid du Colombier	for(a in $fmta $fmti $fmtb){
18739734e7eSDavid du Colombier		d=`{echo $a | sed 's!.*:(/.*/).*!\1!'}
18839734e7eSDavid du Colombier		if(! ~ $d $dd)
189a22b0629SDavid du Colombier			dd=($dd $d)
19039734e7eSDavid du Colombier	}
19139734e7eSDavid du Colombier	for(d in $dd){
19239734e7eSDavid du Colombier		{
19339734e7eSDavid du Colombier			for(a in $fmta){
19439734e7eSDavid du Colombier				i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
19539734e7eSDavid du Colombier				if(~ $i(2) $d){
19639734e7eSDavid du Colombier					echo $i(3) ...
19739734e7eSDavid du Colombier					venti/fmtarenas $i(1) $i(3) || echo bad >/tmp/fmt
19839734e7eSDavid du Colombier					echo done with $i(3)
19939734e7eSDavid du Colombier				}
20039734e7eSDavid du Colombier			}
20139734e7eSDavid du Colombier			for(a in $fmti){
20239734e7eSDavid du Colombier				i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
20339734e7eSDavid du Colombier				if(~ $i(2) $d){
20439734e7eSDavid du Colombier					echo $i(3) ...
205a22b0629SDavid du Colombier					venti/fmtisect $i(1) $i(3) || echo bad >/tmp/fmt
20639734e7eSDavid du Colombier					echo done with $i(3)
20739734e7eSDavid du Colombier				}
20839734e7eSDavid du Colombier			}
209*3cdeec5cSDavid du Colombier			for(a in $fmtb){
210*3cdeec5cSDavid du Colombier				i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
211*3cdeec5cSDavid du Colombier				pgsize=`{grep pagesize /dev/swap | sed 's/^([0-9]+) .*$/\1/'}
212*3cdeec5cSDavid du Colombier				userused=`{grep user /dev/swap | sed 's/^([0-9]+)\/([0-9]+) .*$/\1/'}
213*3cdeec5cSDavid du Colombier				userpgs=`{grep user /dev/swap | sed 's/^([0-9]+)\/([0-9]+) .*$/\2/'}
214*3cdeec5cSDavid du Colombier				userfree=`{hoc -e '('$userpgs-$userused')'*$pgsize}
215*3cdeec5cSDavid du Colombier				bloomsize=`{hoc -e 2'^(int(log('$userfree/1024/1024*20/100*1/3')/log(2)))'}
216*3cdeec5cSDavid du Colombier				partsize=`{ls -l $i(3) | awk '{print int($6/1024/1024)}' | hoc}
217*3cdeec5cSDavid du Colombier				if(test $bloomsize -gt $partsize)
218*3cdeec5cSDavid du Colombier					bloomsize=$partsize
219*3cdeec5cSDavid du Colombier				if(test $bloomsize -lt 1)
220*3cdeec5cSDavid du Colombier					bloomsize=1
221*3cdeec5cSDavid du Colombier				if(~ $i(2) $d){
222*3cdeec5cSDavid du Colombier					echo $i(3) ...
223*3cdeec5cSDavid du Colombier					venti/fmtbloom -s $bloomsize^m $i(3) || echo bad >/tmp/fmt
224*3cdeec5cSDavid du Colombier					echo done with $i(3)
225*3cdeec5cSDavid du Colombier				}
226*3cdeec5cSDavid du Colombier			}
22739734e7eSDavid du Colombier		} &
22839734e7eSDavid du Colombier	}
22939734e7eSDavid du Colombier	wait
23039734e7eSDavid du Colombier	if(~ bad `{cat /tmp/fmt}){
23139734e7eSDavid du Colombier		echo There were errors formatting the indices and arenas.
23239734e7eSDavid du Colombier		fmtventi=ready
23339734e7eSDavid du Colombier		export fmtventi
23439734e7eSDavid du Colombier		exit errors
23539734e7eSDavid du Colombier	}
23639734e7eSDavid du Colombier
23739734e7eSDavid du Colombier	echo Done formatting Venti arenas and indices.
23839734e7eSDavid du Colombier
23939734e7eSDavid du Colombier	v=$ventiarena(1)
24039734e7eSDavid du Colombier	echo Storing Venti config on $v...
24139734e7eSDavid du Colombier	{
24239734e7eSDavid du Colombier		echo index main
24339734e7eSDavid du Colombier		for(i in $ventiindex)
24439734e7eSDavid du Colombier			echo isect $i
245*3cdeec5cSDavid du Colombier		for(b in $ventibloom)
246*3cdeec5cSDavid du Colombier			echo bloom $b
24739734e7eSDavid du Colombier		for(a in $ventiarena)
248a22b0629SDavid du Colombier			echo arenas $a
24939734e7eSDavid du Colombier	} | venti/conf -w $v
25039734e7eSDavid du Colombier
25139734e7eSDavid du Colombier	echo Initializing index...
252a22b0629SDavid du Colombier	venti/fmtindex $v
25339734e7eSDavid du Colombier
25439734e7eSDavid du Colombier	echo Done with Venti!
25539734e7eSDavid du Colombier}
25639734e7eSDavid du Colombier
257