mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
93597bcbdc
Missed synchronization with udev may lead to error on vgcreate, if previous vgremove was not handled fast enough by udev.
235 lines
6.3 KiB
Bash
235 lines
6.3 KiB
Bash
#!/bin/bash
|
|
# Copyright (C) 2013 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
|
|
|
|
# no automatic extensions please
|
|
|
|
. lib/inittest
|
|
|
|
MKFS=mkfs.ext2
|
|
which $MKFS || skip
|
|
|
|
fill() {
|
|
dd if=/dev/zero of="$DM_DEV_DIR/${2:-$vg1/lvol0}" bs=$1 count=1 oflag=direct || \
|
|
die "Snapshot does not fit $1"
|
|
}
|
|
|
|
# Wait until device is opened
|
|
wait_for_open_() {
|
|
for i in $(seq 1 50) ; do
|
|
test $(dmsetup info --noheadings -c -o open $1) -ne 0 && return
|
|
sleep 0.1
|
|
done
|
|
|
|
die "$1 expected to be openned, but it's not!"
|
|
}
|
|
|
|
cleanup_tail()
|
|
{
|
|
test -z "$SLEEP_PID" || kill $SLEEP_PID || true
|
|
wait
|
|
vgremove -ff $vg1 || true
|
|
vgremove -ff $vg
|
|
aux teardown
|
|
}
|
|
|
|
TSIZE=15P
|
|
aux can_use_16T || TSIZE=15T
|
|
|
|
# With different snapshot target driver we may obtain different results.
|
|
# Older targets have metadata leak bug which needs extra compenstion.
|
|
# Ancient targets do not even provide separate info for metadata.
|
|
EXPECT1="16.00k"
|
|
EXPECT2="512.00k"
|
|
EXPECT3="32.00k"
|
|
EXPECT4="66.67"
|
|
if aux target_at_least dm-snapshot 1 10 0 ; then
|
|
# Extra metadata size
|
|
EXPECT4="0.00"
|
|
|
|
if aux target_at_least dm-snapshot 1 12 0 ; then
|
|
# When fixed leak, expect smaller sizes
|
|
EXPECT1="12.00k"
|
|
EXPECT2="384.00k"
|
|
EXPECT3="28.00k"
|
|
fi
|
|
fi
|
|
|
|
aux prepare_pvs 1
|
|
vgcreate -s 4M $vg $(cat DEVICES)
|
|
|
|
# Play with 1 extent
|
|
lvcreate -aey -l1 -n $lv $vg
|
|
# 100%LV is not supported for snapshot
|
|
fail lvcreate -s -l 100%LV -n snap $vg/$lv |& tee out
|
|
grep 'Please express size as %ORIGIN, %VG, %PVS, or %FREE' out
|
|
# 100%ORIGIN needs to have enough space for all data and needs to round-up
|
|
lvcreate -s -l 100%ORIGIN -n $lv1 $vg/$lv
|
|
# everything needs to fit
|
|
fill 4M $vg/$lv1
|
|
lvremove -f $vg
|
|
|
|
|
|
# Automatically activates exclusively in cluster
|
|
lvcreate -s -l 100%FREE -n $lv $vg --virtualsize $TSIZE
|
|
|
|
aux extend_filter_LVMTEST
|
|
aux lvmconf "activation/snapshot_autoextend_percent = 20" \
|
|
"activation/snapshot_autoextend_threshold = 50"
|
|
|
|
# Check usability with smallest (1k) extent size ($lv has 15P)
|
|
pvcreate --setphysicalvolumesize 4T "$DM_DEV_DIR/$vg/$lv"
|
|
trap 'cleanup_tail' EXIT
|
|
vgcreate -s 1K $vg1 "$DM_DEV_DIR/$vg/$lv"
|
|
|
|
|
|
# Play with small 1k 128 extents
|
|
lvcreate -aey -L128K -n $lv $vg1
|
|
# 100%ORIGIN needs to have enough space for all data
|
|
lvcreate -s -l 100%ORIGIN -n snap100 $vg1/$lv
|
|
# everything needs to fit
|
|
fill 128k $vg1/snap100
|
|
|
|
# 50%ORIGIN needs to have enough space for 50% of data
|
|
lvcreate -s -l 50%ORIGIN -n snap50 $vg1/$lv
|
|
fill 64k $vg1/snap50
|
|
|
|
lvcreate -s -l 25%ORIGIN -n snap25 $vg1/$lv
|
|
fill 32k $vg1/snap25
|
|
|
|
# Check we do not provide too much extra space
|
|
not fill 33k $vg1/snap25
|
|
|
|
lvs -a $vg1
|
|
lvremove -f $vg1
|
|
|
|
# Test virtual snapshot over /dev/zero
|
|
lvcreate -V50 -L10 -n $lv1 -s $vg1
|
|
CHECK_ACTIVE="active"
|
|
test ! -e LOCAL_CLVMD || CHECK_ACTIVE="local exclusive"
|
|
check lv_field $vg1/$lv1 lv_active "$CHECK_ACTIVE"
|
|
lvchange -an $vg1
|
|
|
|
# On cluster snapshot gets exclusive activation
|
|
lvchange -ay $vg1
|
|
check lv_field $vg1/$lv1 lv_active "$CHECK_ACTIVE"
|
|
|
|
# Test removal of opened (but unmounted) snapshot (device busy) for a while
|
|
sleep 120 < "$DM_DEV_DIR/$vg1/$lv1" &
|
|
SLEEP_PID=$!
|
|
|
|
wait_for_open_ "$vg1-$lv1"
|
|
|
|
# Opened virtual snapshot device is not removable
|
|
# it should retry device removal for a few seconds
|
|
not lvremove -f $vg1/$lv1
|
|
|
|
kill $SLEEP_PID
|
|
SLEEP_PID=
|
|
# Wait for killed task, so there is no device holder
|
|
wait
|
|
|
|
lvremove -f $vg1/$lv1
|
|
check lv_not_exists $vg1 $lv1
|
|
|
|
# Check border size
|
|
lvcreate -aey -L4095G $vg1
|
|
lvcreate -s -L100K $vg1/lvol0
|
|
fill 1K
|
|
check lv_field $vg1/lvol1 data_percent "12.00"
|
|
|
|
lvremove -ff $vg1
|
|
|
|
# Create 1KB snapshot, does not need to be active here
|
|
lvcreate -an -Zn -l1 -n $lv1 $vg1
|
|
not lvcreate -s -l1 $vg1/$lv1
|
|
not lvcreate -s -l3 $vg1/$lv1
|
|
lvcreate -s -l30 -n $lv2 $vg1/$lv1
|
|
check lv_field $vg1/$lv2 size "$EXPECT1"
|
|
|
|
not lvcreate -s -c512 -l512 $vg1/$lv1
|
|
lvcreate -s -c128 -l1700 -n $lv3 $vg1/$lv1
|
|
# 3 * 128
|
|
check lv_field $vg1/$lv3 size "$EXPECT2"
|
|
lvremove -ff $vg1
|
|
|
|
lvcreate -aey -l20 $vg1
|
|
lvcreate -s -l12 $vg1/lvol0
|
|
|
|
# Fill 1KB -> 100% snapshot (1x 4KB chunk)
|
|
fill 1K
|
|
check lv_field $vg1/lvol1 data_percent "100.00"
|
|
|
|
# Check it resizes 100% full valid snapshot
|
|
lvextend --use-policies $vg1/lvol1
|
|
check lv_field $vg1/lvol1 data_percent "80.00"
|
|
|
|
fill 4K
|
|
lvextend --use-policies $vg1/lvol1
|
|
check lv_field $vg1/lvol1 size "18.00k"
|
|
|
|
lvextend -l+33 $vg1/lvol1
|
|
check lv_field $vg1/lvol1 size "$EXPECT3"
|
|
|
|
fill 20K
|
|
|
|
lvremove -f $vg1
|
|
|
|
# Check snapshot really deletes COW header for read-only snapshot
|
|
# Test needs special relation between chunk size and extent size
|
|
# This test expects extent size 1K
|
|
aux lvmconf "allocation/wipe_signatures_when_zeroing_new_lvs = 1"
|
|
lvcreate -aey -L4 -n $lv $vg1
|
|
lvcreate -c 8 -s -L1 -n snap $vg1/$lv
|
|
# Populate snapshot
|
|
#dd if=/dev/urandom of="$DM_DEV_DIR/$vg1/$lv" bs=4096 count=10
|
|
$MKFS "$DM_DEV_DIR/$vg1/$lv"
|
|
lvremove -f $vg1/snap
|
|
|
|
# Undeleted header would trigger attempt to access
|
|
# beyond end of COW device
|
|
# Fails to create when chunk size is different
|
|
lvcreate -s -pr -l12 -n snap $vg1/$lv
|
|
|
|
# When header is undelete, fails to read snapshot without read errors
|
|
#dd if="$DM_DEV_DIR/$vg1/snap" of=/dev/null bs=1M count=2
|
|
fsck -n "$DM_DEV_DIR/$vg1/snap"
|
|
|
|
# This test would trigger read of weird percentage for undeleted header
|
|
# And since older snapshot target counts with metadata sectors
|
|
# we have 2 valid results (unsure about correct version number)
|
|
check lv_field $vg1/snap data_percent "$EXPECT4"
|
|
|
|
vgremove -ff $vg1
|
|
|
|
|
|
# Can't test >= 16T devices on 32bit
|
|
test "$TSIZE" = 15P || exit 0
|
|
|
|
# synchronize with udev activity
|
|
# FIXME - otherwise sequence of vgremove followed by vgcreate may fail...
|
|
# as there could be still remaing links in /dev
|
|
# Unusure if 'vgcreate' should do this type of detection in udev mode.
|
|
aux udev_wait
|
|
|
|
# Check usability with largest extent size
|
|
pvcreate "$DM_DEV_DIR/$vg/$lv"
|
|
vgcreate -s 4G $vg1 "$DM_DEV_DIR/$vg/$lv"
|
|
|
|
lvcreate -an -Zn -l50%FREE -n $lv1 $vg1
|
|
lvcreate -s -l100%FREE -n $lv2 $vg1/$lv1
|
|
check lv_field $vg1/$lv2 size "7.50p"
|
|
lvremove -ff $vg1
|
|
|
|
lvcreate -V15E -l1 -n $lv1 -s $vg1
|
|
check lv_field $vg1/$lv1 origin_size "15.00e"
|
|
|
|
vgremove -ff $vg1
|