1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/test/shell/writecache-large.sh
David Teigland 5dbe2fdd9d writecache: fix uncache for two step detach
Fix the two-step writecache detach in commit c32d7fed4f.
In the case of uncache, the cachevol is removed after
detaching the writecache.  When the detach is finished
in the second step, the remove must wait until then.
2020-12-10 15:42:01 -06:00

183 lines
4.1 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) 2018 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# Test writecache usage
SKIP_WITH_LVMPOLLD=1
. lib/inittest
aux have_writecache 1 0 0 || skip
which mkfs.xfs || skip
# scsi_debug devices with 512 LBS 512 PBS
aux prepare_scsi_debug_dev 1200
check sysfs "$(< SCSI_DEBUG_DEV)" queue/logical_block_size "512"
check sysfs "$(< SCSI_DEBUG_DEV)" queue/physical_block_size "512"
aux prepare_devs 2 600
blockdev --getss "$dev1"
blockdev --getpbsz "$dev1"
blockdev --getss "$dev2"
blockdev --getpbsz "$dev2"
mnt="mnt"
mkdir -p $mnt
awk 'BEGIN { while (z++ < 16384) printf "A" }' > fileA
awk 'BEGIN { while (z++ < 16384) printf "B" }' > fileB
awk 'BEGIN { while (z++ < 16384) printf "C" }' > fileC
# generate random data
dd if=/dev/urandom of=randA bs=512K count=2
dd if=/dev/urandom of=randB bs=512K count=3
dd if=/dev/urandom of=randC bs=512K count=4
_add_new_data_to_mnt() {
mkfs.xfs -f "$DM_DEV_DIR/$vg/$lv1"
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
# add original data
cp randA $mnt
cp randB $mnt
cp randC $mnt
mkdir $mnt/1
cp fileA $mnt/1
cp fileB $mnt/1
cp fileC $mnt/1
mkdir $mnt/2
cp fileA $mnt/2
cp fileB $mnt/2
cp fileC $mnt/2
sync
}
_add_more_data_to_mnt() {
mkdir $mnt/more
cp fileA $mnt/more
cp fileB $mnt/more
cp fileC $mnt/more
cp randA $mnt/more
cp randB $mnt/more
cp randC $mnt/more
sync
}
_verify_data_on_mnt() {
diff randA $mnt/randA
diff randB $mnt/randB
diff randC $mnt/randC
diff fileA $mnt/1/fileA
diff fileB $mnt/1/fileB
diff fileC $mnt/1/fileC
diff fileA $mnt/2/fileA
diff fileB $mnt/2/fileB
diff fileC $mnt/2/fileC
}
_verify_more_data_on_mnt() {
diff randA $mnt/more/randA
diff randB $mnt/more/randB
diff randC $mnt/more/randC
diff fileA $mnt/more/fileA
diff fileB $mnt/more/fileB
diff fileC $mnt/more/fileC
}
_verify_data_on_lv() {
lvchange -ay $vg/$lv1
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
_verify_data_on_mnt
rm $mnt/randA
rm $mnt/randB
rm $mnt/randC
rm -rf $mnt/1
rm -rf $mnt/2
umount $mnt
lvchange -an $vg/$lv1
}
vgcreate $SHARED $vg "$dev1"
vgextend $vg "$dev2"
# Use a large enough size so that the cleaner will not
# finish immediately when detaching, and will require
# a secondary check from command top level.
lvcreate -n $lv1 -L 560M -an $vg "$dev1"
lvcreate -n $lv2 -L 500M -an $vg "$dev2"
lvchange -ay $vg/$lv1
blockdev --getss "$DM_DEV_DIR/$vg/$lv1"
blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1"
lvconvert --yes --type writecache --cachevol $lv2 $vg/$lv1
dmsetup table $vg-$lv1
blockdev --getss "$DM_DEV_DIR/$vg/$lv1"
blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1"
_add_new_data_to_mnt
_add_more_data_to_mnt
_verify_data_on_mnt
dd if=/dev/zero of=$mnt/big1 bs=1M count=100 oflag=sync
dd if=/dev/zero of=$mnt/big2 bs=1M count=100 oflag=sync
dd if=/dev/zero of=$mnt/big3 bs=1M count=100 oflag=sync
dd if=/dev/zero of=$mnt/big4 bs=1M count=100 oflag=sync
lvconvert --splitcache $vg/$lv1
check lv_field $vg/$lv1 segtype linear
check lv_field $vg/$lv2 segtype linear
dmsetup table $vg-$lv1
_verify_data_on_mnt
_verify_more_data_on_mnt
dd if=$mnt/big4 of=/dev/null bs=1M count=100
umount $mnt
lvchange -an $vg/$lv1
_verify_data_on_lv
lvchange -an $vg/$lv2
lvremove $vg/$lv1
lvremove $vg/$lv2
# Repeat similar using uncache
lvcreate -n $lv1 -L 560M -an $vg "$dev1"
lvcreate -n $lv2 -L 500M -an $vg "$dev2"
lvchange -ay $vg/$lv1
lvconvert --yes --type writecache --cachevol $lv2 $vg/$lv1
_add_new_data_to_mnt
_add_more_data_to_mnt
dd if=/dev/zero of=$mnt/big1 bs=1M count=100 oflag=sync
umount $mnt
lvchange -an $vg/$lv1
lvconvert --uncache $vg/$lv1
check lv_field $vg/$lv1 segtype linear
not lvs $vg/$lv2
lvchange -ay $vg/$lv1
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
_verify_data_on_mnt
_verify_more_data_on_mnt
umount $mnt
lvchange -an $vg/$lv1
vgremove -ff $vg