xref: /netbsd-src/external/gpl2/lvm2/dist/test/t-mirror-basic.sh (revision 56a34939419542e88b386b2229be7565f4f45461)
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