186d7f5d3SJohn Marino#!/bin/sh 286d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved. 386d7f5d3SJohn Marino# Copyright (C) 2007 NEC Corporation 486d7f5d3SJohn Marino# 586d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 686d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 786d7f5d3SJohn Marino# of the GNU General Public License v.2. 886d7f5d3SJohn Marino# 986d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 1086d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 1186d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1286d7f5d3SJohn Marino 1386d7f5d3SJohn Marinotest_description="ensure that basic operations on mirrored LV works" 1486d7f5d3SJohn Marino 1586d7f5d3SJohn Marino. ./test-utils.sh 1686d7f5d3SJohn Marino 1786d7f5d3SJohn Marinodmsetup_has_dm_devdir_support_ || exit 200 1886d7f5d3SJohn Marino 1986d7f5d3SJohn Marino# --------------------------------------------------------------------- 2086d7f5d3SJohn Marino# Utilities 2186d7f5d3SJohn Marino 2286d7f5d3SJohn Marinolvdev_() 2386d7f5d3SJohn Marino{ 2486d7f5d3SJohn Marino echo "$G_dev_/$1/$2" 2586d7f5d3SJohn Marino} 2686d7f5d3SJohn Marino 2786d7f5d3SJohn Marinomimages_are_redundant_ () 2886d7f5d3SJohn Marino{ 2986d7f5d3SJohn Marino local vg=$1 3086d7f5d3SJohn Marino local lv=$vg/$2 3186d7f5d3SJohn Marino local i 3286d7f5d3SJohn Marino 3386d7f5d3SJohn Marino rm -f out 3486d7f5d3SJohn Marino for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 3586d7f5d3SJohn Marino lvs -a -odevices --noheadings $vg/$i | sed 's/([^)]*)//g; s/,/ /g' | \ 3686d7f5d3SJohn Marino sort | uniq >> out 3786d7f5d3SJohn Marino done 3886d7f5d3SJohn Marino 3986d7f5d3SJohn Marino # if any duplication is found, it's not redundant 4086d7f5d3SJohn Marino sort out | uniq -d | grep . && return 1 4186d7f5d3SJohn Marino 4286d7f5d3SJohn Marino return 0 4386d7f5d3SJohn Marino} 4486d7f5d3SJohn Marino 4586d7f5d3SJohn Marinolv_is_contiguous_ () 4686d7f5d3SJohn Marino{ 4786d7f5d3SJohn Marino local lv=$1 4886d7f5d3SJohn Marino 4986d7f5d3SJohn Marino # if the lv has multiple segments, it's not contiguous 5086d7f5d3SJohn Marino [ $(lvs -a --segments --noheadings $lv | wc -l) -ne 1 ] && return 1 5186d7f5d3SJohn Marino 5286d7f5d3SJohn Marino return 0 5386d7f5d3SJohn Marino} 5486d7f5d3SJohn Marino 5586d7f5d3SJohn Marinolv_is_clung_ () 5686d7f5d3SJohn Marino{ 5786d7f5d3SJohn Marino local lv=$1 5886d7f5d3SJohn Marino 5986d7f5d3SJohn Marino # if any duplication is found, it's not redundant 6086d7f5d3SJohn Marino [ $(lvs -a -odevices --noheadings $lv | sed 's/([^)]*)//g' | \ 6186d7f5d3SJohn Marino sort | uniq | wc -l) -ne 1 ] && return 1 6286d7f5d3SJohn Marino 6386d7f5d3SJohn Marino return 0 6486d7f5d3SJohn Marino} 6586d7f5d3SJohn Marino 6686d7f5d3SJohn Marinomimages_are_contiguous_ () 6786d7f5d3SJohn Marino{ 6886d7f5d3SJohn Marino local vg=$1 6986d7f5d3SJohn Marino local lv=$vg/$2 7086d7f5d3SJohn Marino local i 7186d7f5d3SJohn Marino 7286d7f5d3SJohn Marino for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 7386d7f5d3SJohn Marino lv_is_contiguous_ $vg/$i || return 1 7486d7f5d3SJohn Marino done 7586d7f5d3SJohn Marino 7686d7f5d3SJohn Marino return 0 7786d7f5d3SJohn Marino} 7886d7f5d3SJohn Marino 7986d7f5d3SJohn Marinomimages_are_clung_ () 8086d7f5d3SJohn Marino{ 8186d7f5d3SJohn Marino local vg=$1 8286d7f5d3SJohn Marino local lv=$vg/$2 8386d7f5d3SJohn Marino local i 8486d7f5d3SJohn Marino 8586d7f5d3SJohn Marino for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do 8686d7f5d3SJohn Marino lv_is_clung_ $vg/$i || return 1 8786d7f5d3SJohn Marino done 8886d7f5d3SJohn Marino 8986d7f5d3SJohn Marino return 0 9086d7f5d3SJohn Marino} 9186d7f5d3SJohn Marino 9286d7f5d3SJohn Marinomirrorlog_is_on_() 9386d7f5d3SJohn Marino{ 9486d7f5d3SJohn Marino local lv="$1"_mlog 9586d7f5d3SJohn Marino shift 1 9686d7f5d3SJohn Marino lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out 9786d7f5d3SJohn Marino for d in $*; do grep "$d(" out; done 9886d7f5d3SJohn Marino for d in $*; do ! grep -v "$d(" out; done 9986d7f5d3SJohn Marino return 0 10086d7f5d3SJohn Marino} 10186d7f5d3SJohn Marino 10286d7f5d3SJohn Marinosave_dev_sum_() 10386d7f5d3SJohn Marino{ 10486d7f5d3SJohn Marino mkfs.ext3 $1 > /dev/null && 10586d7f5d3SJohn Marino md5sum $1 > md5.$(basename $1) 10686d7f5d3SJohn Marino} 10786d7f5d3SJohn Marino 10886d7f5d3SJohn Marinocheck_dev_sum_() 10986d7f5d3SJohn Marino{ 11086d7f5d3SJohn Marino md5sum $1 > md5.tmp && cmp md5.$(basename $1) md5.tmp 11186d7f5d3SJohn Marino} 11286d7f5d3SJohn Marino 11386d7f5d3SJohn Marino# --------------------------------------------------------------------- 11486d7f5d3SJohn Marino# Initialize PVs and VGs 11586d7f5d3SJohn Marino 11686d7f5d3SJohn Marinoaux prepare_vg 5 80 11786d7f5d3SJohn Marino 11886d7f5d3SJohn Marino# --------------------------------------------------------------------- 11986d7f5d3SJohn Marino# Common environment setup/cleanup for each sub testcases 12086d7f5d3SJohn Marino 12186d7f5d3SJohn Marinoprepare_lvs_() 12286d7f5d3SJohn Marino{ 12386d7f5d3SJohn Marino lvremove -ff $vg; 12486d7f5d3SJohn Marino if dmsetup table|grep $vg; then 12586d7f5d3SJohn Marino echo "ERROR: lvremove did leave some some mappings in DM behind!" 12686d7f5d3SJohn Marino return 1 12786d7f5d3SJohn Marino fi 12886d7f5d3SJohn Marino : 12986d7f5d3SJohn Marino} 13086d7f5d3SJohn Marino 13186d7f5d3SJohn Marinocheck_and_cleanup_lvs_() 13286d7f5d3SJohn Marino{ 13386d7f5d3SJohn Marino lvs -a -o+devices $vg 13486d7f5d3SJohn Marino lvremove -ff $vg 13586d7f5d3SJohn Marino if dmsetup table|grep $vg; then 13686d7f5d3SJohn Marino echo "ERROR: lvremove did leave some some mappings in DM behind!" 13786d7f5d3SJohn Marino return 1 13886d7f5d3SJohn Marino fi 13986d7f5d3SJohn Marino} 14086d7f5d3SJohn Marino 14186d7f5d3SJohn Marino#COMM "check environment setup/cleanup" 14286d7f5d3SJohn Marinoprepare_lvs_ 14386d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 14486d7f5d3SJohn Marino 14586d7f5d3SJohn Marino# --------------------------------------------------------------------- 14686d7f5d3SJohn Marino# mirrored LV tests 14786d7f5d3SJohn Marino 14886d7f5d3SJohn Marino# --- 14986d7f5d3SJohn Marino# create 15086d7f5d3SJohn Marino 15186d7f5d3SJohn Marino#COMM "create 2-way mirror with disklog from 3 PVs" 15286d7f5d3SJohn Marinoprepare_lvs_ 15386d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 15486d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 15586d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 15686d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 15786d7f5d3SJohn Marino 15886d7f5d3SJohn Marino#COMM "create 2-way mirror with corelog from 2 PVs" 15986d7f5d3SJohn Marinoprepare_lvs_ 16086d7f5d3SJohn Marinolvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 16186d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 16286d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 16386d7f5d3SJohn Marino 16486d7f5d3SJohn Marino#COMM "create 3-way mirror with disklog from 4 PVs" 16586d7f5d3SJohn Marinoprepare_lvs_ 16686d7f5d3SJohn Marinolvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0-1 16786d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 16886d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 16986d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 17086d7f5d3SJohn Marino 17186d7f5d3SJohn Marino#COMM "lvcreate --nosync is in 100% sync after creation (bz429342)" 17286d7f5d3SJohn Marinoprepare_lvs_ 17386d7f5d3SJohn Marinolvcreate -l2 -m1 --nosync -n $lv1 $vg $dev1 $dev2 $dev3:0-1 2>out 17486d7f5d3SJohn Marinogrep "New mirror won't be synchronised." out 17586d7f5d3SJohn Marinolvs -o copy_percent --noheadings $vg/$lv1 |grep 100.00 17686d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 17786d7f5d3SJohn Marino 17886d7f5d3SJohn Marino# --- 17986d7f5d3SJohn Marino# convert 18086d7f5d3SJohn Marino 18186d7f5d3SJohn Marino#COMM "convert from linear to 2-way mirror" 18286d7f5d3SJohn Marinoprepare_lvs_ 18386d7f5d3SJohn Marinolvcreate -l2 -n $lv1 $vg $dev1 18486d7f5d3SJohn Marinolvconvert -m+1 $vg/$lv1 $dev2 $dev3:0-1 18586d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 18686d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 18786d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 18886d7f5d3SJohn Marino 18986d7f5d3SJohn Marino#COMM "convert from 2-way mirror to linear" 19086d7f5d3SJohn Marinoprepare_lvs_ 19186d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 19286d7f5d3SJohn Marinolvconvert -m-1 $vg/$lv1 19386d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 19486d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 19586d7f5d3SJohn Marino 19686d7f5d3SJohn Marinofor status in active inactive; do 19786d7f5d3SJohn Marino# bz192865 lvconvert log of an inactive mirror lv 19886d7f5d3SJohn Marino#COMM "convert from disklog to corelog" 19986d7f5d3SJohn Marinoprepare_lvs_ 20086d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 20186d7f5d3SJohn Marino test $status = "inactive" && lvchange -an $vg/$lv1 20286d7f5d3SJohn Marino yes | lvconvert --mirrorlog core $vg/$lv1 20386d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 20486d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 20586d7f5d3SJohn Marino 20686d7f5d3SJohn Marino#COMM "convert from corelog to disklog" 20786d7f5d3SJohn Marinoprepare_lvs_ 20886d7f5d3SJohn Marinolvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2 20986d7f5d3SJohn Marino test $status = "inactive" && lvchange -an $vg/$lv1 21086d7f5d3SJohn Marinolvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1 21186d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 21286d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 21386d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 21486d7f5d3SJohn Marinodone 21586d7f5d3SJohn Marino 21686d7f5d3SJohn Marino# --- 21786d7f5d3SJohn Marino# resize 21886d7f5d3SJohn Marino 21986d7f5d3SJohn Marino#COMM "extend 2-way mirror" 22086d7f5d3SJohn Marinoprepare_lvs_ 22186d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 22286d7f5d3SJohn Marinolvchange -an $vg/$lv1 22386d7f5d3SJohn Marinolvextend -l+2 $vg/$lv1 22486d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 22586d7f5d3SJohn Marinomimages_are_contiguous_ $vg $lv1 22686d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 22786d7f5d3SJohn Marino 22886d7f5d3SJohn Marino#COMM "reduce 2-way mirror" 22986d7f5d3SJohn Marinoprepare_lvs_ 23086d7f5d3SJohn Marinolvcreate -l4 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 23186d7f5d3SJohn Marinolvchange -an $vg/$lv1 23286d7f5d3SJohn Marinolvreduce -l-2 $vg/$lv1 23386d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 23486d7f5d3SJohn Marino 23586d7f5d3SJohn Marino#COMM "extend 2-way mirror (cling if not contiguous)" 23686d7f5d3SJohn Marinoprepare_lvs_ 23786d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 23886d7f5d3SJohn Marinolvcreate -l1 -n $lv2 $vg $dev1 23986d7f5d3SJohn Marinolvcreate -l1 -n $lv3 $vg $dev2 24086d7f5d3SJohn Marinolvchange -an $vg/$lv1 24186d7f5d3SJohn Marinolvextend -l+2 $vg/$lv1 24286d7f5d3SJohn Marinomimages_are_redundant_ $vg $lv1 24386d7f5d3SJohn Marinomimages_are_clung_ $vg $lv1 24486d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 24586d7f5d3SJohn Marino 24686d7f5d3SJohn Marino# --- 24786d7f5d3SJohn Marino# failure cases 24886d7f5d3SJohn Marino 24986d7f5d3SJohn Marino#COMM "create 2-way mirror with disklog from 2 PVs" 25086d7f5d3SJohn Marinoprepare_lvs_ 25186d7f5d3SJohn Marinonot lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 25286d7f5d3SJohn Marino# "(cleanup previous test)" 25386d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 25486d7f5d3SJohn Marino 25586d7f5d3SJohn Marino#COMM "convert linear to 2-way mirror with 1 PV" 25686d7f5d3SJohn Marinoprepare_lvs_ 25786d7f5d3SJohn Marinolvcreate -l2 -n $lv1 $vg $dev1 25886d7f5d3SJohn Marinonot lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1 25986d7f5d3SJohn Marino# "(cleanup previous test)" 26086d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 26186d7f5d3SJohn Marino 26286d7f5d3SJohn Marino# --- 26386d7f5d3SJohn Marino# resync 26486d7f5d3SJohn Marino# FIXME: using dm-delay to properly check whether the resync really started 26586d7f5d3SJohn Marino 26686d7f5d3SJohn Marino#COMM "force resync 2-way active mirror" 26786d7f5d3SJohn Marinoprepare_lvs_ 26886d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 26986d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 27086d7f5d3SJohn Marinoyes | lvchange --resync $vg/$lv1 27186d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 27286d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 27386d7f5d3SJohn Marino 27486d7f5d3SJohn Marino#COMM "force resync 2-way inactive mirror" 27586d7f5d3SJohn Marinoprepare_lvs_ 27686d7f5d3SJohn Marinolvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1 27786d7f5d3SJohn Marinolvchange -an $vg/$lv1 27886d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 27986d7f5d3SJohn Marinolvchange --resync $vg/$lv1 28086d7f5d3SJohn Marinomirrorlog_is_on_ $vg/$lv1 $dev3 28186d7f5d3SJohn Marinocheck_and_cleanup_lvs_ 28286d7f5d3SJohn Marino 28386d7f5d3SJohn Marino# --------------------------------------------------------------------- 28486d7f5d3SJohn Marino 285