2010-04-12 23:02:59 +04:00
#!/bin/bash
2010-05-12 14:08:35 +04:00
# check.sh: assert various things about volumes
# USAGE
# check linear VG LV
# check lv_on VG LV PV
# check mirror VG LV [LOGDEV|core]
# check mirror_nonredundant VG LV
# check mirror_legs VG LV N
# check mirror_images_on VG LV DEV [DEV...]
# ...
2010-04-12 23:02:59 +04:00
set -e -o pipefail
2010-05-12 09:55:08 +04:00
lvl( ) {
lvs -a --noheadings " $@ "
}
2010-04-12 23:02:59 +04:00
lvdevices( ) {
2010-05-12 09:55:08 +04:00
lvl -odevices " $@ " | sed 's/([^)]*)//g; s/,/ /g'
2010-04-12 23:02:59 +04:00
}
mirror_images_redundant( )
{
vg = $1
lv = $vg /$2
2010-05-12 14:08:35 +04:00
lvs -a $vg -o+devices
2010-04-12 23:02:59 +04:00
for i in ` lvdevices $lv ` ; do
echo " # $i : "
lvdevices $vg /$i | sort | uniq
done > check.tmp.all
( grep -v ^# check.tmp.all || true ) | sort | uniq -d > check.tmp
test "`cat check.tmp | wc -l`" -eq 0 || {
echo " mirror images of $lv expected redundant, but are not: "
cat check.tmp.all
exit 1
}
}
2010-04-12 23:33:58 +04:00
mirror_images_on( ) {
2010-05-12 14:08:35 +04:00
vg = $1
lv = $2
shift 2
2010-04-12 23:33:58 +04:00
for i in ` lvdevices $lv ` ; do
2010-05-12 14:08:35 +04:00
lv_on $vg $lv $1
2010-04-12 23:33:58 +04:00
shift
done
}
lv_on( )
{
2010-05-12 14:08:35 +04:00
lv = " $1 / $2 "
lvdevices $lv | grep -F " $3 " || {
echo " LV $lv expected on $3 but is not: " >& 2
2010-04-12 23:33:58 +04:00
lvdevices $lv >& 2
exit 1
}
2010-05-12 14:08:35 +04:00
test ` lvdevices $lv | grep -vF " $3 " | wc -l` -eq 0 || {
2010-04-12 23:33:58 +04:00
echo " LV $lv contains unexpected devices: " >& 2
lvdevices $lv >& 2
exit 1
}
}
2010-04-12 23:02:59 +04:00
mirror_log_on( )
{
2010-05-12 14:08:35 +04:00
vg = " $1 "
lv = " $2 "
where = " $3 "
if test " $where " = "core" ; then
lvl -omirror_log " $vg / $lv " | not grep mlog
else
lv_on $vg " ${ lv } _mlog " " $where "
fi
2010-04-12 23:02:59 +04:00
}
lv_is_contiguous( )
{
2010-05-12 09:55:08 +04:00
test ` lvl --segments $1 | wc -l` -eq 1 || {
2010-04-12 23:02:59 +04:00
echo " LV $1 expected to be contiguous, but is not: "
2010-05-12 09:55:08 +04:00
lvl --segments $1
2010-04-12 23:02:59 +04:00
exit 1
}
}
lv_is_clung( )
{
test ` lvdevices $1 | sort | uniq | wc -l` -eq 1 || {
echo " LV $1 expected to be clung, but is not: "
lvdevices $! | sort | uniq
exit 1
}
}
mirror_images_contiguous( )
{
for i in ` lvdevices $1 /$2 ` ; do
lv_is_contiguous $1 /$i
done
}
mirror_images_clung( )
{
for i in ` lvdevices $1 /$2 ` ; do
lv_is_clung $1 /$i
done
}
mirror( ) {
2010-05-12 14:08:35 +04:00
mirror_nonredundant " $@ "
mirror_images_redundant " $1 " " $2 "
}
mirror_nonredundant( ) {
2010-04-12 23:02:59 +04:00
lv = " $1 / $2 "
2010-05-12 14:08:35 +04:00
lvs -oattr " $lv " | grep -q " ^ *m..... $" || {
2010-04-12 23:02:59 +04:00
echo " $lv expected a mirror, but is not: "
2010-05-12 14:08:35 +04:00
lvs -a $lv
2010-04-12 23:02:59 +04:00
exit 1
}
2010-05-12 14:08:35 +04:00
if test -n " $3 " ; then mirror_log_on " $1 " " $2 " " $3 " ; fi
2010-04-12 23:02:59 +04:00
}
2010-05-06 23:01:26 +04:00
mirror_legs( ) {
lv = " $1 / $2 "
expect = " $3 "
lvdevices " $lv "
real = ` lvdevices " $lv " | wc -w`
test " $expect " = " $real "
}
2010-05-12 14:08:35 +04:00
mirror_no_temporaries( )
{
vg = $1
lv = $2
lvl -oname $vg | grep $lv | not grep "tmp" || {
echo " $lv has temporary mirror images unexpectedly: "
lvl $vg | grep $lv
exit 1
}
}
2010-04-12 23:02:59 +04:00
linear( ) {
lv = " $1 / $2 "
2010-05-12 09:55:08 +04:00
lvl -ostripes " $lv " | grep -q "1" || {
2010-04-12 23:02:59 +04:00
echo " $lv expected linear, but is not: "
2010-05-12 09:55:08 +04:00
lvl " $lv " -o+devices
exit 1
}
}
active( ) {
lv = " $1 / $2 "
lvl -oattr " $lv " 2> /dev/null | grep -q " ^ *....a. $" || {
echo " $lv expected active, but lvs says it's not: "
lvl " $lv " -o+devices 2>/dev/null
exit 1
}
dmsetup table | egrep -q " $1 - $2 : *[^ ]+ " || {
echo " $lv expected active, lvs thinks it is but there are no mappings! "
dmsetup table | grep $1 -$2 :
exit 1
}
}
inactive( ) {
lv = " $1 / $2 "
lvl -oattr " $lv " 2> /dev/null | grep -q '^ *....[-isd].$' || {
echo " $lv expected inactive, but lvs says it's not: "
lvl " $lv " -o+devices 2>/dev/null
exit 1
}
dmsetup table | not egrep -q " $1 - $2 : *[^ ]+ " || {
echo " $lv expected inactive, lvs thinks it is but there are mappings! "
dmsetup table | grep $1 -$2 :
2010-04-12 23:02:59 +04:00
exit 1
}
}
" $@ "