1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/test/shell/writecache-cache-blocksize-2.sh
David Teigland a47e20a092 tests: skip tests that require blkid BLOCK_SIZE
Recent commit 84bd394cf9
  "writecache: use block size 4096 when no fs is found"

changed the default writecache block size from 512 to 4096
when no file system is detected.  The fs block size detection
requires the libblkid BLOCK_SIZE feature, so skip tests on
systems without this.  Otherwise, 4096 writecache added to
512 xfs leads fs io or mount failures.
2021-06-30 11:56:42 -05:00

241 lines
6.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 dm-writecache and dm-cache with different block size combinations
SKIP_WITH_LVMPOLLD=1
. lib/inittest
aux have_writecache 1 0 0 || skip
which mkfs.xfs || skip
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() {
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
}
# Check that the LBS ($1) and PBS ($2) are accurately reported.
_check_env() {
check sysfs "$(< SCSI_DEBUG_DEV)" queue/logical_block_size "$1"
check sysfs "$(< SCSI_DEBUG_DEV)" queue/physical_block_size "$2"
blockdev --getss "$dev1"
blockdev --getpbsz "$dev1"
blockdev --getss "$dev2"
blockdev --getpbsz "$dev2"
}
#
# _run_test $BD1 $BD2 $type $optname "..."
#
# $BD1: device to place the main LV on
# $BD2: device to place the cache on
# $type is cache or writecache to use in lvconvert --type $type
# $optname is either --cachevol or --cachepool to use in lvconvert
# "..." a sector size option to use in mkfs.xfs
#
_run_test() {
vgcreate $SHARED $vg "$1"
vgextend $vg "$2"
lvcreate -n $lv1 -l 8 -an $vg "$1"
lvcreate -n $lv2 -l 4 -an $vg "$2"
lvchange -ay $vg/$lv1
mkfs.xfs -f $5 "$DM_DEV_DIR/$vg/$lv1" |tee out
_add_new_data_to_mnt
lvconvert --yes --type $3 $4 $lv2 $vg/$lv1
# TODO: check expected LBS of LV1
# blockdev --getss "$DM_DEV_DIR/$vg/$lv1" |tee out
# grep "$N" out
# TODO: check expected PBS of LV1
# blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1" |tee out
# grep "$N" out
_add_more_data_to_mnt
_verify_data_on_mnt
lvconvert --splitcache $vg/$lv1
check lv_field $vg/$lv1 segtype linear
blockdev --getss "$DM_DEV_DIR/$vg/$lv1"
blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1"
_verify_data_on_mnt
_verify_more_data_on_mnt
umount $mnt
lvchange -an $vg/$lv1
lvchange -an $vg/$lv2
_verify_data_on_lv
lvremove $vg/$lv1
lvremove $vg/$lv2
vgremove $vg
}
# Setup: dev1 LBS 512, PBS 4096 (using scsi-debug)
# dev2 LBS 512, PBS 4096 (using scsi-debug)
# dev3 LBS 512, PBS 512 (using loop)
# dev4 LBS 512, PBS 512 (using loop)
#
aux prepare_scsi_debug_dev 256 sector_size=512 physblk_exp=3
aux prepare_devs 2 64
# Tests with fs block sizes require a libblkid version that shows BLOCK_SIZE
vgcreate $vg "$dev1"
lvcreate -n $lv1 -L50 $vg
mkfs.xfs -f "$DM_DEV_DIR/$vg/$lv1"
blkid -c /dev/null "$DM_DEV_DIR/$vg/$lv1" | grep BLOCK_SIZE || skip
lvchange -an $vg
vgremove -ff $vg
# loopa/loopb have LBS 512 PBS 512
which fallocate || skip
fallocate -l 64M loopa
fallocate -l 64M loopb
for i in {1..5}; do
LOOP1=$(losetup -f loopa --show || true)
test -n "$LOOP1" && break
done
for i in {1..5} ; do
LOOP2=$(losetup -f loopb --show || true)
test -n "$LOOP2" && break
done
# prepare devX mapping so it works for real & fake dev dir
d=3
for i in "$LOOP1" "$LOOP2"; do
echo "$i"
m=${i##*loop}
test -e "$DM_DEV_DIR/loop$m" || mknod "$DM_DEV_DIR/loop$m" b 7 "$m"
eval "dev$d=\"$DM_DEV_DIR/loop$m\""
d=$(( d + 1 ))
done
# verify dev1/dev2 have LBS 512 PBS 4096
_check_env "512" "4096"
# verify dev3/dev4 have LBS 512 PBS 512
blockdev --getss "$LOOP1" | grep 512
blockdev --getss "$LOOP2" | grep 512
blockdev --getpbsz "$LOOP1" | grep 512
blockdev --getpbsz "$LOOP2" | grep 512
aux extend_filter "a|$dev3|" "a|$dev4|"
# place main LV on dev1 with LBS 512, PBS 4096
# and the cache on dev3 with LBS 512, PBS 512
_run_test "$dev1" "$dev3" "writecache" "--cachevol" ""
_run_test "$dev1" "$dev3" "cache" "--cachevol" ""
_run_test "$dev1" "$dev3" "cache" "--cachepool" ""
# place main LV on dev3 with LBS 512, PBS 512
# and the cache on dev1 with LBS 512, PBS 4096
_run_test "$dev3" "$dev1" "writecache" "--cachevol" ""
_run_test "$dev3" "$dev1" "cache" "--cachevol" ""
_run_test "$dev3" "$dev1" "cache" "--cachepool" ""
# place main LV on dev1 with LBS 512, PBS 4096
# and the cache on dev3 with LBS 512, PBS 512
# and force xfs sectsz 512
_run_test "$dev1" "$dev3" "writecache" "--cachevol" "-s size=512"
_run_test "$dev1" "$dev3" "cache" "--cachevol" "-s size=512"
_run_test "$dev1" "$dev3" "cache" "--cachepool" "-s size=512"
# place main LV on dev3 with LBS 512, PBS 512
# and the cache on dev1 with LBS 512, PBS 4096
# and force xfs sectsz 4096
_run_test "$dev3" "$dev1" "writecache" "--cachevol" "-s size=4096"
_run_test "$dev3" "$dev1" "cache" "--cachevol" "-s size=4096"
_run_test "$dev3" "$dev1" "cache" "--cachepool" "-s size=4096"
losetup -d "$LOOP1" || true
losetup -d "$LOOP2" || true
rm loopa loopb
aux cleanup_scsi_debug_dev