1*56a34939Shaad#!/bin/sh 2*56a34939Shaad# Copyright (C) 2008 Red Hat, Inc. All rights reserved. 3*56a34939Shaad# Copyright (C) 2007 NEC Corporation 4*56a34939Shaad# 5*56a34939Shaad# This copyrighted material is made available to anyone wishing to use, 6*56a34939Shaad# modify, copy, or redistribute it subject to the terms and conditions 7*56a34939Shaad# of the GNU General Public License v.2. 8*56a34939Shaad# 9*56a34939Shaad# You should have received a copy of the GNU General Public License 10*56a34939Shaad# along with this program; if not, write to the Free Software Foundation, 11*56a34939Shaad# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 12*56a34939Shaad 13*56a34939Shaadtest_description="ensure that basic operations on mirrored LV works" 14*56a34939Shaad 15*56a34939Shaad. ./test-utils.sh 16*56a34939Shaad 17*56a34939Shaaddmsetup_has_dm_devdir_support_ || exit 200 18*56a34939Shaad 19*56a34939Shaad# --------------------------------------------------------------------- 20*56a34939Shaad# Utilities 21*56a34939Shaad 22*56a34939Shaadlvdev_() 23*56a34939Shaad{ 24*56a34939Shaad echo "$G_dev_/$1/$2" 25*56a34939Shaad} 26*56a34939Shaad 27*56a34939Shaadmimages_are_redundant_ () 28*56a34939Shaad{ 29*56a34939Shaad local vg=$1 30*56a34939Shaad local lv=$vg/$2 31*56a34939Shaad local i 32*56a34939Shaad 33*56a34939Shaad rm -f out 34*56a34939Shaad for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 35*56a34939Shaad lvs -a -odevices --noheadings $vg/$i | sed 's/([^)]*)//g; s/,/ /g' | \ 36*56a34939Shaad sort | uniq >> out 37*56a34939Shaad done 38*56a34939Shaad 39*56a34939Shaad # if any duplication is found, it's not redundant 40*56a34939Shaad sort out | uniq -d | grep . && return 1 41*56a34939Shaad 42*56a34939Shaad return 0 43*56a34939Shaad} 44*56a34939Shaad 45*56a34939Shaadlv_is_contiguous_ () 46*56a34939Shaad{ 47*56a34939Shaad local lv=$1 48*56a34939Shaad 49*56a34939Shaad # if the lv has multiple segments, it's not contiguous 50*56a34939Shaad [ $(lvs -a --segments --noheadings $lv | wc -l) -ne 1 ] && return 1 51*56a34939Shaad 52*56a34939Shaad return 0 53*56a34939Shaad} 54*56a34939Shaad 55*56a34939Shaadlv_is_clung_ () 56*56a34939Shaad{ 57*56a34939Shaad local lv=$1 58*56a34939Shaad 59*56a34939Shaad # if any duplication is found, it's not redundant 60*56a34939Shaad [ $(lvs -a -odevices --noheadings $lv | sed 's/([^)]*)//g' | \ 61*56a34939Shaad sort | uniq | wc -l) -ne 1 ] && return 1 62*56a34939Shaad 63*56a34939Shaad return 0 64*56a34939Shaad} 65*56a34939Shaad 66*56a34939Shaadmimages_are_contiguous_ () 67*56a34939Shaad{ 68*56a34939Shaad local vg=$1 69*56a34939Shaad local lv=$vg/$2 70*56a34939Shaad local i 71*56a34939Shaad 72*56a34939Shaad for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 73*56a34939Shaad lv_is_contiguous_ $vg/$i || return 1 74*56a34939Shaad done 75*56a34939Shaad 76*56a34939Shaad return 0 77*56a34939Shaad} 78*56a34939Shaad 79*56a34939Shaadmimages_are_clung_ () 80*56a34939Shaad{ 81*56a34939Shaad local vg=$1 82*56a34939Shaad local lv=$vg/$2 83*56a34939Shaad local i 84*56a34939Shaad 85*56a34939Shaad for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 86*56a34939Shaad lv_is_clung_ $vg/$i || return 1 87*56a34939Shaad done 88*56a34939Shaad 89*56a34939Shaad return 0 90*56a34939Shaad} 91*56a34939Shaad 92*56a34939Shaadmirrorlog_is_on_() 93*56a34939Shaad{ 94*56a34939Shaad local lv="$1"_mlog 95*56a34939Shaad shift 1 96*56a34939Shaad lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out 97*56a34939Shaad for d in $*; do grep "$d(" out; done 98*56a34939Shaad for d in $*; do ! grep -v "$d(" out; done 99*56a34939Shaad return 0 100*56a34939Shaad} 101*56a34939Shaad 102*56a34939Shaadsave_dev_sum_() 103*56a34939Shaad{ 104*56a34939Shaad mkfs.ext3 $1 > /dev/null && 105*56a34939Shaad md5sum $1 > md5.$(basename $1) 106*56a34939Shaad} 107*56a34939Shaad 108*56a34939Shaadcheck_dev_sum_() 109*56a34939Shaad{ 110*56a34939Shaad md5sum $1 > md5.tmp && cmp md5.$(basename $1) md5.tmp 111*56a34939Shaad} 112*56a34939Shaad 113*56a34939Shaad# --------------------------------------------------------------------- 114*56a34939Shaad# Initialize PVs and VGs 115*56a34939Shaad 116*56a34939Shaadaux prepare_vg 5 80 117*56a34939Shaad 118*56a34939Shaad# --------------------------------------------------------------------- 119*56a34939Shaad# Common environment setup/cleanup for each sub testcases 120*56a34939Shaad 121*56a34939Shaadprepare_lvs_() 122*56a34939Shaad{ 123*56a34939Shaad lvremove -ff $vg; 124*56a34939Shaad if dmsetup table|grep $vg; then 125*56a34939Shaad echo "ERROR: lvremove did leave some some mappings in DM behind!" 126*56a34939Shaad return 1 127*56a34939Shaad fi 128*56a34939Shaad : 129*56a34939Shaad} 130*56a34939Shaad 131*56a34939Shaadcheck_and_cleanup_lvs_() 132*56a34939Shaad{ 133*56a34939Shaad lvs -a -o+devices $vg 134*56a34939Shaad lvremove -ff $vg 135*56a34939Shaad if dmsetup table|grep $vg; then 136*56a34939Shaad echo "ERROR: lvremove did leave some some mappings in DM behind!" 137*56a34939Shaad return 1 138*56a34939Shaad fi 139*56a34939Shaad} 140*56a34939Shaad 141*56a34939Shaad#COMM "check environment setup/cleanup" 142*56a34939Shaadprepare_lvs_ 143*56a34939Shaadcheck_and_cleanup_lvs_ 144*56a34939Shaad 145*56a34939Shaad# --------------------------------------------------------------------- 146*56a34939Shaad# mirrored LV tests 147*56a34939Shaad 148*56a34939Shaad# --- 149*56a34939Shaad# create 150*56a34939Shaad 151*56a34939Shaad#COMM "create 2-way mirror with disklog from 3 PVs" 152*56a34939Shaadprepare_lvs_ 153*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 154*56a34939Shaadmimages_are_redundant_ $vg $lv1 155*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 156*56a34939Shaadcheck_and_cleanup_lvs_ 157*56a34939Shaad 158*56a34939Shaad#COMM "create 2-way mirror with corelog from 2 PVs" 159*56a34939Shaadprepare_lvs_ 160*56a34939Shaadlvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 161*56a34939Shaadmimages_are_redundant_ $vg $lv1 162*56a34939Shaadcheck_and_cleanup_lvs_ 163*56a34939Shaad 164*56a34939Shaad#COMM "create 3-way mirror with disklog from 4 PVs" 165*56a34939Shaadprepare_lvs_ 166*56a34939Shaadlvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0-1 167*56a34939Shaadmimages_are_redundant_ $vg $lv1 168*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 169*56a34939Shaadcheck_and_cleanup_lvs_ 170*56a34939Shaad 171*56a34939Shaad#COMM "lvcreate --nosync is in 100% sync after creation (bz429342)" 172*56a34939Shaadprepare_lvs_ 173*56a34939Shaadlvcreate -l2 -m1 --nosync -n $lv1 $vg $dev1 $dev2 $dev3:0-1 2>out 174*56a34939Shaadgrep "New mirror won't be synchronised." out 175*56a34939Shaadlvs -o copy_percent --noheadings $vg/$lv1 |grep 100.00 176*56a34939Shaadcheck_and_cleanup_lvs_ 177*56a34939Shaad 178*56a34939Shaad# --- 179*56a34939Shaad# convert 180*56a34939Shaad 181*56a34939Shaad#COMM "convert from linear to 2-way mirror" 182*56a34939Shaadprepare_lvs_ 183*56a34939Shaadlvcreate -l2 -n $lv1 $vg $dev1 184*56a34939Shaadlvconvert -m+1 $vg/$lv1 $dev2 $dev3:0-1 185*56a34939Shaadmimages_are_redundant_ $vg $lv1 186*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 187*56a34939Shaadcheck_and_cleanup_lvs_ 188*56a34939Shaad 189*56a34939Shaad#COMM "convert from 2-way mirror to linear" 190*56a34939Shaadprepare_lvs_ 191*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 192*56a34939Shaadlvconvert -m-1 $vg/$lv1 193*56a34939Shaadmimages_are_redundant_ $vg $lv1 194*56a34939Shaadcheck_and_cleanup_lvs_ 195*56a34939Shaad 196*56a34939Shaadfor status in active inactive; do 197*56a34939Shaad# bz192865 lvconvert log of an inactive mirror lv 198*56a34939Shaad#COMM "convert from disklog to corelog" 199*56a34939Shaadprepare_lvs_ 200*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 201*56a34939Shaad test $status = "inactive" && lvchange -an $vg/$lv1 202*56a34939Shaad yes | lvconvert --mirrorlog core $vg/$lv1 203*56a34939Shaadmimages_are_redundant_ $vg $lv1 204*56a34939Shaadcheck_and_cleanup_lvs_ 205*56a34939Shaad 206*56a34939Shaad#COMM "convert from corelog to disklog" 207*56a34939Shaadprepare_lvs_ 208*56a34939Shaadlvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 209*56a34939Shaad test $status = "inactive" && lvchange -an $vg/$lv1 210*56a34939Shaadlvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1 211*56a34939Shaadmimages_are_redundant_ $vg $lv1 212*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 213*56a34939Shaadcheck_and_cleanup_lvs_ 214*56a34939Shaaddone 215*56a34939Shaad 216*56a34939Shaad# --- 217*56a34939Shaad# resize 218*56a34939Shaad 219*56a34939Shaad#COMM "extend 2-way mirror" 220*56a34939Shaadprepare_lvs_ 221*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 222*56a34939Shaadlvchange -an $vg/$lv1 223*56a34939Shaadlvextend -l+2 $vg/$lv1 224*56a34939Shaadmimages_are_redundant_ $vg $lv1 225*56a34939Shaadmimages_are_contiguous_ $vg $lv1 226*56a34939Shaadcheck_and_cleanup_lvs_ 227*56a34939Shaad 228*56a34939Shaad#COMM "reduce 2-way mirror" 229*56a34939Shaadprepare_lvs_ 230*56a34939Shaadlvcreate -l4 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 231*56a34939Shaadlvchange -an $vg/$lv1 232*56a34939Shaadlvreduce -l-2 $vg/$lv1 233*56a34939Shaadcheck_and_cleanup_lvs_ 234*56a34939Shaad 235*56a34939Shaad#COMM "extend 2-way mirror (cling if not contiguous)" 236*56a34939Shaadprepare_lvs_ 237*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 238*56a34939Shaadlvcreate -l1 -n $lv2 $vg $dev1 239*56a34939Shaadlvcreate -l1 -n $lv3 $vg $dev2 240*56a34939Shaadlvchange -an $vg/$lv1 241*56a34939Shaadlvextend -l+2 $vg/$lv1 242*56a34939Shaadmimages_are_redundant_ $vg $lv1 243*56a34939Shaadmimages_are_clung_ $vg $lv1 244*56a34939Shaadcheck_and_cleanup_lvs_ 245*56a34939Shaad 246*56a34939Shaad# --- 247*56a34939Shaad# failure cases 248*56a34939Shaad 249*56a34939Shaad#COMM "create 2-way mirror with disklog from 2 PVs" 250*56a34939Shaadprepare_lvs_ 251*56a34939Shaadnot lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 252*56a34939Shaad# "(cleanup previous test)" 253*56a34939Shaadcheck_and_cleanup_lvs_ 254*56a34939Shaad 255*56a34939Shaad#COMM "convert linear to 2-way mirror with 1 PV" 256*56a34939Shaadprepare_lvs_ 257*56a34939Shaadlvcreate -l2 -n $lv1 $vg $dev1 258*56a34939Shaadnot lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1 259*56a34939Shaad# "(cleanup previous test)" 260*56a34939Shaadcheck_and_cleanup_lvs_ 261*56a34939Shaad 262*56a34939Shaad# --- 263*56a34939Shaad# resync 264*56a34939Shaad# FIXME: using dm-delay to properly check whether the resync really started 265*56a34939Shaad 266*56a34939Shaad#COMM "force resync 2-way active mirror" 267*56a34939Shaadprepare_lvs_ 268*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 269*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 270*56a34939Shaadyes | lvchange --resync $vg/$lv1 271*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 272*56a34939Shaadcheck_and_cleanup_lvs_ 273*56a34939Shaad 274*56a34939Shaad#COMM "force resync 2-way inactive mirror" 275*56a34939Shaadprepare_lvs_ 276*56a34939Shaadlvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 277*56a34939Shaadlvchange -an $vg/$lv1 278*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 279*56a34939Shaadlvchange --resync $vg/$lv1 280*56a34939Shaadmirrorlog_is_on_ $vg/$lv1 $dev3 281*56a34939Shaadcheck_and_cleanup_lvs_ 282*56a34939Shaad 283*56a34939Shaad# --------------------------------------------------------------------- 284*56a34939Shaad 285