1# Copyright (C) 2008 Red Hat, Inc. All rights reserved. 2# Copyright (C) 2007 NEC Corporation 3# 4# This copyrighted material is made available to anyone wishing to use, 5# modify, copy, or redistribute it subject to the terms and conditions 6# of the GNU General Public License v.2. 7# 8# You should have received a copy of the GNU General Public License 9# along with this program; if not, write to the Free Software Foundation, 10# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 11 12. ./test-utils.sh 13 14dmsetup_has_dm_devdir_support_ || exit 200 15 16mimages_are_redundant_ () 17{ 18 local vg=$1 19 local lv=$vg/$2 20 local i 21 22 rm -f out 23 for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 24 lvs -a -odevices --noheadings $vg/$i | sed 's/([^)]*)//g; s/,/ /g' | \ 25 sort | uniq >> out 26 done 27 28 # if any duplication is found, it's not redundant 29 sort out | uniq -d | grep . && return 1 30 31 return 0 32} 33 34lv_is_contiguous_ () 35{ 36 local lv=$1 37 38 # if the lv has multiple segments, it's not contiguous 39 [ $(lvs -a --segments --noheadings $lv | wc -l) -ne 1 ] && return 1 40 41 return 0 42} 43 44mimages_are_contiguous_ () 45{ 46 local vg=$1 47 local lv=$vg/$2 48 local i 49 50 for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 51 lv_is_contiguous_ $vg/$i || return 1 52 done 53 54 return 0 55} 56 57mirrorlog_is_on_() 58{ 59 local lv="$1"_mlog 60 shift 1 61 lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out 62 for d in $*; do grep "$d(" out || return 1; done 63 for d in $*; do grep -v "$d(" out > out2 || true; mv out2 out; done 64 grep . out && return 1 65 return 0 66} 67 68save_dev_sum_() 69{ 70 mkfs.ext3 $1 > /dev/null && 71 md5sum $1 > md5.$(basename $1) 72} 73 74check_dev_sum_() 75{ 76 md5sum $1 > md5.tmp && cmp md5.$(basename $1) md5.tmp 77} 78 79check_mirror_count_() 80{ 81 local lv=$1 82 local mirrors=$2 83 [ "$mirrors" -eq "$(lvs --noheadings -ostripes $lv)" ] 84} 85 86check_mirror_log_() 87{ 88 local lv=$1 89 local mlog=$(lvs --noheadings -omirror_log $lv | sed -e 's/ //g') 90 [ "$(basename $lv)_mlog" = "$mlog" ] 91} 92 93wait_conversion_() 94{ 95 local lv=$1 96 while (lvs --noheadings -oattr "$lv" | grep -q '^ *c'); do sleep 1; done 97} 98 99check_no_tmplvs_() 100{ 101 local lv=$1 102 lvs -a --noheadings -oname $(dirname $lv) > out 103 ! grep tmp out 104} 105 106aux prepare_vg 5 107 108# --------------------------------------------------------------------- 109# Common environment setup/cleanup for each sub testcases 110 111prepare_lvs_() 112{ 113 lvremove -ff $vg 114 if dmsetup table|grep $vg; then 115 echo "ERROR: lvremove did leave some some mappings in DM behind!" 116 return 1 117 fi 118 : 119} 120 121check_and_cleanup_lvs_() 122{ 123 lvs -a -o+devices $vg 124 lvremove -ff $vg 125 if dmsetup table|grep $vg; then 126 echo "ERROR: lvremove did leave some some mappings in DM behind!" 127 return 1 128 fi 129} 130 131prepare_lvs_ 132check_and_cleanup_lvs_ 133 134# --------------------------------------------------------------------- 135# mirrored LV tests 136 137# --- 138# add mirror to mirror 139 140# add 1 mirror 141prepare_lvs_ 142lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 143check_mirror_count_ $vg/$lv1 2 144check_mirror_log_ $vg/$lv1 145lvconvert -m+1 -i1 $vg/$lv1 $dev4 146check_no_tmplvs_ $vg/$lv1 147check_mirror_count_ $vg/$lv1 3 148mimages_are_redundant_ $vg $lv1 149mirrorlog_is_on_ $vg/$lv1 $dev3 150check_and_cleanup_lvs_ 151 152# add 2 mirrors 153prepare_lvs_ 154lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 155check_mirror_count_ $vg/$lv1 2 156check_mirror_log_ $vg/$lv1 157lvconvert -m+2 -i1 $vg/$lv1 $dev4 $dev5 158check_no_tmplvs_ $vg/$lv1 159check_mirror_count_ $vg/$lv1 4 160mimages_are_redundant_ $vg $lv1 161mirrorlog_is_on_ $vg/$lv1 $dev3 162check_and_cleanup_lvs_ 163 164# add 1 mirror to core log mirror 165prepare_lvs_ 166lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 167check_mirror_count_ $vg/$lv1 2 168not check_mirror_log_ $vg/$lv1 169lvconvert -m+1 -i1 --mirrorlog core $vg/$lv1 $dev4 170check_no_tmplvs_ $vg/$lv1 171check_mirror_count_ $vg/$lv1 3 172not check_mirror_log_ $vg/$lv1 173mimages_are_redundant_ $vg $lv1 174check_and_cleanup_lvs_ 175 176# add 2 mirrors to core log mirror" 177prepare_lvs_ 178lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 179check_mirror_count_ $vg/$lv1 2 180not check_mirror_log_ $vg/$lv1 181lvconvert -m+2 -i1 --mirrorlog core $vg/$lv1 $dev4 $dev5 182check_no_tmplvs_ $vg/$lv1 183check_mirror_count_ $vg/$lv1 4 184not check_mirror_log_ $vg/$lv1 185mimages_are_redundant_ $vg $lv1 186check_and_cleanup_lvs_ 187 188# --- 189# add to converting mirror 190 191# add 1 mirror then add 1 more mirror during conversion 192prepare_lvs_ 193lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 194check_mirror_count_ $vg/$lv1 2 195check_mirror_log_ $vg/$lv1 196lvconvert -m+1 -b $vg/$lv1 $dev4 197lvconvert -m+1 -i3 $vg/$lv1 $dev5 198check_no_tmplvs_ $vg/$lv1 199check_mirror_count_ $vg/$lv1 4 200mimages_are_redundant_ $vg $lv1 201mirrorlog_is_on_ $vg/$lv1 $dev3 202check_and_cleanup_lvs_ 203 204# --- 205# add mirror and disk log 206 207# "add 1 mirror and disk log" 208prepare_lvs_ 209lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 210check_mirror_count_ $vg/$lv1 2 211not check_mirror_log_ $vg/$lv1 212lvconvert -m+1 --mirrorlog disk -i1 $vg/$lv1 $dev4 $dev3:0-1 213check_no_tmplvs_ $vg/$lv1 214check_mirror_count_ $vg/$lv1 3 215check_mirror_log_ $vg/$lv1 216mimages_are_redundant_ $vg $lv1 217mirrorlog_is_on_ $vg/$lv1 $dev3 218check_and_cleanup_lvs_ 219 220# --- 221# check polldaemon restarts 222 223# convert inactive mirror and start polling 224prepare_lvs_ 225lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 226check_mirror_count_ $vg/$lv1 2 227lvchange -an $vg/$lv1 228lvconvert -m+1 $vg/$lv1 $dev4 229lvchange -ay $vg/$lv1 230wait_conversion_ $vg/$lv1 231lvs -a 232check_no_tmplvs_ $vg/$lv1 233check_and_cleanup_lvs_ 234 235# --------------------------------------------------------------------- 236# removal during conversion 237 238# "remove newly added mirror" 239prepare_lvs_ 240lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 241check_mirror_count_ $vg/$lv1 2 242check_mirror_log_ $vg/$lv1 243lvconvert -m+1 -b $vg/$lv1 $dev4 244lvconvert -m-1 $vg/$lv1 $dev4 245wait_conversion_ $vg/$lv1 246check_no_tmplvs_ $vg/$lv1 247check_mirror_count_ $vg/$lv1 2 248mimages_are_redundant_ $vg $lv1 249mirrorlog_is_on_ $vg/$lv1 $dev3 250check_and_cleanup_lvs_ 251 252# "remove one of newly added mirrors" 253prepare_lvs_ 254lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 255check_mirror_count_ $vg/$lv1 2 256check_mirror_log_ $vg/$lv1 257lvconvert -m+2 -b $vg/$lv1 $dev4 $dev5 258lvconvert -m-1 $vg/$lv1 $dev4 259lvconvert -i1 $vg/$lv1 260wait_conversion_ $vg/$lv1 261check_no_tmplvs_ $vg/$lv1 262check_mirror_count_ $vg/$lv1 3 263mimages_are_redundant_ $vg $lv1 264mirrorlog_is_on_ $vg/$lv1 $dev3 265check_and_cleanup_lvs_ 266 267# "remove from original mirror (the original is still mirror)" 268prepare_lvs_ 269lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev5 $dev3:0-1 270check_mirror_count_ $vg/$lv1 3 271check_mirror_log_ $vg/$lv1 272lvconvert -m+1 -b $vg/$lv1 $dev4 273lvconvert -m-1 $vg/$lv1 $dev2 274lvconvert -i1 $vg/$lv1 275wait_conversion_ $vg/$lv1 276check_no_tmplvs_ $vg/$lv1 277check_mirror_count_ $vg/$lv1 3 278mimages_are_redundant_ $vg $lv1 279mirrorlog_is_on_ $vg/$lv1 $dev3 280check_and_cleanup_lvs_ 281 282# "remove from original mirror (the original becomes linear)" 283prepare_lvs_ 284lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 285check_mirror_count_ $vg/$lv1 2 286check_mirror_log_ $vg/$lv1 287lvconvert -m+1 -b $vg/$lv1 $dev4 288lvconvert -m-1 $vg/$lv1 $dev2 289lvconvert -i1 $vg/$lv1 290wait_conversion_ $vg/$lv1 291check_no_tmplvs_ $vg/$lv1 292check_mirror_count_ $vg/$lv1 2 293mimages_are_redundant_ $vg $lv1 294mirrorlog_is_on_ $vg/$lv1 $dev3 295check_and_cleanup_lvs_ 296 297# --------------------------------------------------------------------- 298 299# "rhbz440405: lvconvert -m0 incorrectly fails if all PEs allocated" 300prepare_lvs_ 301lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0 302check_mirror_count_ $vg/$lv1 2 303check_mirror_log_ $vg/$lv1 304lvconvert -m0 $vg/$lv1 $dev1 305check_no_tmplvs_ $vg/$lv1 306check_mirror_count_ $vg/$lv1 1 307check_and_cleanup_lvs_ 308 309# "rhbz264241: lvm mirror doesn't lose it's "M" --nosync attribute after being down and the up converted" 310prepare_lvs_ 311lvcreate -l2 -m1 -n$lv1 --nosync $vg 312lvconvert -m0 $vg/$lv1 313lvconvert -m1 $vg/$lv1 314lvs --noheadings -o attr $vg/$lv1 | grep '^ *m' 315check_and_cleanup_lvs_ 316 317# lvconvert from linear (on multiple PVs) to mirror 318prepare_lvs_ 319lvcreate -l 8 -n $lv1 $vg $dev1:0-3 $dev2:0-3 320lvconvert -m1 $vg/$lv1 321check_mirror_count_ $vg/$lv1 2 322check_mirror_log_ $vg/$lv1 323check_and_cleanup_lvs_ 324 325# BZ 463272: disk log mirror convert option is lost if downconvert option is also given 326prepare_lvs_ 327lvcreate -l1 -m2 --corelog -n $lv1 $vg 328lvconvert -m1 --mirrorlog disk $vg/$lv1 329check_mirror_log_ $vg/$lv1 330