mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
234b12480e
Switch lvconvert's --merge code over to using process_each_lv(). Doing so adds support for a single 'lvconvert --merge' to start merging multiple LVs (which includes @tag expansion). Add 'lvconvert --merge @tag' testing to test/t-snapshot-merge.sh Adjust man/lvconvert.8.in to reflect these expanded capabilities. The lvconvert.c implementation requires rereading the VG each iteration of process_each_lv(). Otherwise a stale VG instance associated with the LV passed to lvconvert_single_merge() would result in stale VG metadata being written back out to disk. This overwrote new metadata that was written when a previous snapshot LV finished merging (via lvconvert_poll). This is only an issue when merging multiple LVs that share the same VG (a single VG is typical for most LVM configurations on system disks). In the end this new support is very useful for performing a "system rollback" that requires multiple snapshot LVs be merged to their respective origin LV. The yum-utils 'fs-snapshot' plugin tags all snapshot LVs that it creates with a common 'snapshot_tag' that is unique to the yum transaction. Rolling back a yum transaction, that created LVM snapshots with the tag 'yum_20100129133223', is as simple as: lvconvert --merge @yum_20100129133223 Signed-off-by: Mike Snitzer <snitzer@redhat.com>
103 lines
2.7 KiB
Bash
Executable File
103 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
set -xv
|
|
|
|
which mkfs.ext3 || exit 200
|
|
|
|
. ./test-utils.sh
|
|
|
|
lvdev_()
|
|
{
|
|
echo "$G_dev_/$1/$2"
|
|
}
|
|
|
|
snap_lv_name_() {
|
|
echo ${1}_snap
|
|
}
|
|
|
|
setup_merge() {
|
|
local VG_NAME=$1
|
|
local LV_NAME=$2
|
|
local NUM_EXTRA_SNAPS="$3"
|
|
test -z "$NUM_EXTRA_SNAPS" && NUM_EXTRA_SNAPS=0
|
|
local BASE_SNAP_LV_NAME=$(snap_lv_name_ $LV_NAME)
|
|
|
|
lvcreate -n $LV_NAME -l 50%FREE $VG_NAME
|
|
lvcreate -s -n $BASE_SNAP_LV_NAME -l 20%FREE ${VG_NAME}/${LV_NAME}
|
|
mkfs.ext3 $(lvdev_ $VG_NAME $LV_NAME)
|
|
|
|
if [ $NUM_EXTRA_SNAPS -gt 0 ]; then
|
|
for i in `seq 1 $NUM_EXTRA_SNAPS`; do
|
|
lvcreate -s -n ${BASE_SNAP_LV_NAME}_${i} -l 20%FREE ${VG_NAME}/${LV_NAME}
|
|
done
|
|
fi
|
|
}
|
|
|
|
aux prepare_vg 1 100
|
|
|
|
|
|
# full merge of a single LV
|
|
setup_merge $vg $lv1
|
|
|
|
# now that snapshot LV is created: test if snapshot-merge target is available
|
|
$(dmsetup targets | grep -q snapshot-merge) || exit 200
|
|
|
|
lvs -a
|
|
lvconvert --merge $vg/$(snap_lv_name_ $lv1)
|
|
lvremove -f $vg/$lv1
|
|
|
|
|
|
# "onactivate merge" test -- refresh LV while FS is still mounted;
|
|
# verify snapshot-origin target is still being used
|
|
setup_merge $vg $lv1
|
|
lvs -a
|
|
mkdir test_mnt
|
|
mount $(lvdev_ $vg $lv1) test_mnt
|
|
lvconvert --merge $vg/$(snap_lv_name_ $lv1)
|
|
lvchange --refresh $vg/$lv1
|
|
umount test_mnt
|
|
rm -r test_mnt
|
|
# an active merge uses the "snapshot-merge" target
|
|
dmsetup table ${vg}-${lv1} | grep -q " snapshot-origin "
|
|
test $? = 0
|
|
lvremove -f $vg/$lv1
|
|
|
|
|
|
# test multiple snapshot merge; tests copy out that is driven by merge
|
|
setup_merge $vg $lv1 1
|
|
lvs -a
|
|
lvconvert --merge $vg/$(snap_lv_name_ $lv1)
|
|
lvremove -f $vg/$lv1
|
|
|
|
# test merging multiple snapshots that share the same tag
|
|
setup_merge $vg $lv1
|
|
setup_merge $vg $lv2
|
|
lvs -a
|
|
lvchange --addtag this_is_a_test $vg/$(snap_lv_name_ $lv1)
|
|
lvchange --addtag this_is_a_test $vg/$(snap_lv_name_ $lv2)
|
|
lvconvert --merge @this_is_a_test
|
|
lvs | not grep $(snap_lv_name_ $lv1)
|
|
lvs | not grep $(snap_lv_name_ $lv2)
|
|
lvremove -f $vg/$lv1
|
|
lvremove -f $vg/$lv2
|
|
|
|
# FIXME following tests would need to poll merge progress, via periodic lvs?
|
|
# Background processes don't lend themselves to lvm testsuite...
|
|
|
|
# test: onactivate merge of a single lv
|
|
|
|
# test: do onactivate, deactivate the origin LV, reactivate the LV, merge should resume
|
|
|
|
# test: multiple onactivate merge
|
|
|
|
|
|
vgremove -f "$vg"
|