1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/test/t-snapshot-merge.sh
Mike Snitzer 234b12480e lvconvert --merge @tag support
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>
2010-02-05 22:44:37 +00:00

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"