mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-09 01:18:39 +03:00
cac4a9743a
If a single, standard LV is specified as the cache, use it directly instead of converting it into a cache-pool object with two separate LVs (for data and metadata). With a single LV as the cache, lvm will use blocks at the beginning for metadata, and the rest for data. Separate dm linear devices are set up to point at the metadata and data areas of the LV. These dm devs are given to the dm-cache target to use. The single LV cache cannot be resized without recreating it. If the --poolmetadata option is used to specify an LV for metadata, then a cache pool will be created (with separate LVs for data and metadata.) Usage: $ lvcreate -n main -L 128M vg /dev/loop0 $ lvcreate -n fast -L 64M vg /dev/loop1 $ lvs -a vg LV VG Attr LSize Type Devices main vg -wi-a----- 128.00m linear /dev/loop0(0) fast vg -wi-a----- 64.00m linear /dev/loop1(0) $ lvconvert --type cache --cachepool fast vg/main $ lvs -a vg LV VG Attr LSize Origin Pool Type Devices [fast] vg Cwi---C--- 64.00m linear /dev/loop1(0) main vg Cwi---C--- 128.00m [main_corig] [fast] cache main_corig(0) [main_corig] vg owi---C--- 128.00m linear /dev/loop0(0) $ lvchange -ay vg/main $ dmsetup ls vg-fast_cdata (253:4) vg-fast_cmeta (253:5) vg-main_corig (253:6) vg-main (253:24) vg-fast (253:3) $ dmsetup table vg-fast_cdata: 0 98304 linear 253:3 32768 vg-fast_cmeta: 0 32768 linear 253:3 0 vg-main_corig: 0 262144 linear 7:0 2048 vg-main: 0 262144 cache 253:5 253:4 253:6 128 2 metadata2 writethrough mq 0 vg-fast: 0 131072 linear 7:1 2048 $ lvchange -an vg/min $ lvconvert --splitcache vg/main $ lvs -a vg LV VG Attr LSize Type Devices fast vg -wi------- 64.00m linear /dev/loop1(0) main vg -wi------- 128.00m linear /dev/loop0(0)
270 lines
5.9 KiB
Bash
270 lines
5.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (C) 2017 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 single lv cache options
|
|
|
|
SKIP_WITH_LVMPOLLD=1
|
|
|
|
. lib/inittest
|
|
|
|
mount_dir="mnt"
|
|
mkdir -p $mount_dir
|
|
|
|
# generate random data
|
|
dmesg > pattern1
|
|
ps aux >> pattern1
|
|
|
|
aux prepare_devs 5 64
|
|
|
|
vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
|
|
|
|
lvcreate -n $lv1 -l 8 -an $vg "$dev1"
|
|
lvcreate -n $lv2 -l 4 -an $vg "$dev2"
|
|
lvcreate -n $lv3 -l 4 -an $vg "$dev3"
|
|
lvcreate -n $lv4 -l 4 -an $vg "$dev4"
|
|
lvcreate -n $lv5 -l 8 -an $vg "$dev5"
|
|
|
|
mkfs_mount_umount()
|
|
{
|
|
lvt=$1
|
|
|
|
lvchange -ay $vg/$lvt
|
|
|
|
mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lvt"
|
|
mount "$DM_DEV_DIR/$vg/$lvt" $mount_dir
|
|
cp pattern1 $mount_dir/pattern1
|
|
dd if=/dev/zero of=$mount_dir/zeros2M bs=1M count=2 oflag=sync
|
|
umount $mount_dir
|
|
|
|
lvchange -an $vg/$lvt
|
|
}
|
|
|
|
mount_umount()
|
|
{
|
|
lvt=$1
|
|
|
|
lvchange -ay $vg/$lvt
|
|
|
|
mount "$DM_DEV_DIR/$vg/$lvt" $mount_dir
|
|
diff pattern1 $mount_dir/pattern1
|
|
dd if=$mount_dir/zeros2M of=/dev/null bs=1M count=2
|
|
umount $mount_dir
|
|
|
|
lvchange -an $vg/$lvt
|
|
}
|
|
|
|
#
|
|
# Test --cachemetadataformat
|
|
#
|
|
|
|
# 1 shouldn't be used any longer
|
|
not lvconvert --cachemetadataformat 1 -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
# 3 doesn't exist
|
|
not lvconvert --cachemetadataformat 3 -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
# 2 is used by default
|
|
lvconvert -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemetadataformat "2"
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
|
|
# 2 can be set explicitly
|
|
lvconvert --cachemetadataformat 2 -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemetadataformat "2"
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
|
|
# "auto" means 2
|
|
lvconvert --cachemetadataformat auto -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemetadataformat "2"
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test --poolmetadatasize
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 --poolmetadatasize 4m $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 lv_metadata_size "4.00m"
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test --chunksize
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 --chunksize 32k $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 chunksize "32.00k"
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test --cachemode
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 --cachemode writethrough $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemode "writethrough"
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
# FIXME: kernel errors for other cache modes
|
|
|
|
#lvconvert -y --type cache --cachepool $lv2 --cachemode passthrough $vg/$lv1
|
|
|
|
#check lv_field $vg/$lv1 cachemode "passthrough"
|
|
|
|
#mkfs_mount_umount $lv1
|
|
|
|
#lvconvert --splitcache $vg/$lv1
|
|
#check lv_field $vg/$lv1 segtype linear
|
|
#check lv_field $vg/$lv2 segtype linear
|
|
#mount_umount $lv1
|
|
|
|
|
|
#lvconvert -y --type cache --cachepool $lv2 --cachemode writeback $vg/$lv1
|
|
|
|
#check lv_field $vg/$lv1 cachemode "writeback"
|
|
|
|
#mkfs_mount_umount $lv1
|
|
|
|
#lvconvert --splitcache $vg/$lv1
|
|
#check lv_field $vg/$lv1 segtype linear
|
|
#check lv_field $vg/$lv2 segtype linear
|
|
#mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test --cachepolicy
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 --cachepolicy smq $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachepolicy "smq"
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
# FIXME: lvchange_cachepolicy sets wrong lv
|
|
#lvchange --cachepolicy cleaner $vg/$lv1
|
|
#lvchange -ay $vg/$lv1
|
|
#check lv_field $vg/$lv1 cachepolicy "cleaner"
|
|
#lvchange -an $vg/$lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test --cachesettings
|
|
# (only for mq policy, no settings for smq)
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 --cachemode writethrough --cachepolicy mq --cachesettings 'migration_threshold = 233 sequential_threshold=13 random_threshold =1' $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemode "writethrough"
|
|
check lv_field $vg/$lv1 cachepolicy "mq"
|
|
|
|
lvs -o cachesettings $vg/$lv1 > settings
|
|
grep "migration_threshold=233" settings
|
|
grep "sequential_threshold=13" settings
|
|
grep "random_threshold=1" settings
|
|
|
|
mkfs_mount_umount $lv1
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
check lv_field $vg/$lv1 segtype linear
|
|
check lv_field $vg/$lv2 segtype linear
|
|
mount_umount $lv1
|
|
|
|
|
|
#
|
|
# Test lvchange of --cachemode, --cachepolicy, --cachesettings
|
|
#
|
|
|
|
lvconvert -y --type cache --cachepool $lv2 $vg/$lv1
|
|
|
|
lvchange -ay $vg/$lv1
|
|
|
|
lvchange --cachemode writeback $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemode "writeback"
|
|
|
|
lvchange --cachemode writethrough $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachemode "writethrough"
|
|
|
|
lvchange -an $vg/$lv1
|
|
|
|
lvchange --cachepolicy mq --cachesettings 'migration_threshold=100' $vg/$lv1
|
|
|
|
check lv_field $vg/$lv1 cachepolicy "mq"
|
|
check lv_field $vg/$lv1 cachesettings "migration_threshold=100"
|
|
|
|
lvconvert --splitcache $vg/$lv1
|
|
|
|
|
|
#
|
|
# Test --poolmetadata
|
|
#
|
|
|
|
# causes a cache-pool type LV to be created
|
|
lvconvert -y --type cache --cachepool $lv3 --poolmetadata $lv4 $vg/$lv5
|
|
|
|
lvs -a -o+segtype $vg
|
|
|
|
check lv_field $vg/$lv5 segtype cache
|
|
|
|
# check lv_field doesn't work for hidden lvs
|
|
lvs -a -o segtype $vg/$lv3 > segtype
|
|
grep cache-pool segtype
|
|
|
|
lvconvert --splitcache $vg/$lv5
|
|
check lv_field $vg/$lv5 segtype linear
|
|
check lv_field $vg/$lv3 segtype cache-pool
|
|
|
|
|
|
vgremove -ff $vg
|
|
|