xref: /dflybsd-src/contrib/lvm2/dist/test/t-mirror-basic.sh (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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