From 9d044f25f1a590da1be715f135bdb381f511d05a Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Wed, 17 Jul 2019 09:51:00 +0200 Subject: [PATCH] test/lvol: test resize with ongoing I/O traffic Resize tests were extremely basic so far, extend them with a test case that actually tries to do some I/O before and after the resize. I would like to keep it as a separate test case, because it uses NBD which used to be quite buggy at some point. If the resize tests fail on this new test case, it means the previous very basic resize tests have passed and the lvol resize functionality itself doesn't show any failures - this might potentially simplify some root causing later on. Change-Id: I7ee45243ee4fc025fc71f6eee4c946211c07a78a Signed-off-by: Darek Stojaczyk Signed-off-by: Pawel Kaminski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/462187 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- test/lvol/resize.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/test/lvol/resize.sh b/test/lvol/resize.sh index 916cf2d10..de2510c32 100755 --- a/test/lvol/resize.sh +++ b/test/lvol/resize.sh @@ -4,6 +4,7 @@ testdir=$(readlink -f $(dirname $0)) rootdir=$(readlink -f $testdir/../..) source $rootdir/test/common/autotest_common.sh source $rootdir/test/lvol/common.sh +source $rootdir/test/bdev/nbd_common.sh # resize an lvol a few times function test_resize_lvol() { @@ -85,6 +86,75 @@ function test_resize_lvol_negative() { rpc_cmd bdev_malloc_delete "$malloc_name" } +# resize an lvol a few times +function test_resize_lvol_with_io_traffic() { + # create an lvol store + malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # calculate lvol size + lvol_size_mb=$( round_down $(( LVS_DEFAULT_CAPACITY_MB / 2 )) ) + lvol_size=$(( lvol_size_mb * 1024 * 1024 )) + + # create an lvol on top + lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size_mb") + lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") + [ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ] + [ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ] + [ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test/lvol_test" ] + [ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ] + [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$(( lvol_size / MALLOC_BS ))" ] + + # prepare to do some I/O + trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + + # write to the entire lvol + count=$(( lvol_size / LVS_DEFAULT_CLUSTER_SIZE )) + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=$count + + # writing beyond lvol size should fail + offset=$(( lvol_size / LVS_DEFAULT_CLUSTER_SIZE + 1 )) + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1 && false + + # resize the lvol to twice its original size + lvol_size_mb=$(( lvol_size_mb * 2 )) + lvol_size=$(( lvol_size_mb * 1024 * 1024 )) + rpc_cmd bdev_lvol_resize "$lvol_uuid" "$lvol_size_mb" + lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") + [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$(( lvol_size / MALLOC_BS ))" ] + + # writing beyond the original lvol size should now succeed, we need + # to restart NBD though as it may still use the old, cached size + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1 + + # lvol can't be downsized if they have any open descriptors, so close them now + trap - SIGINT SIGTERM EXIT + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + + # resize lvol down to a single cluster + rpc_cmd bdev_lvol_resize "$lvol_uuid" "$LVS_DEFAULT_CLUSTER_SIZE_MB" + lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid") + [ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$(( LVS_DEFAULT_CLUSTER_SIZE / MALLOC_BS ))" ] + + # make sure we can't write beyond the first cluster + trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=1 count=1 && false + + # clean up + trap - SIGINT SIGTERM EXIT + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + rpc_cmd bdev_lvol_delete "$lvol_uuid" + rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false + rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid" + rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false + rpc_cmd bdev_malloc_delete "$malloc_name" +} + +modprobe nbd $rootdir/app/spdk_tgt/spdk_tgt & spdk_pid=$! trap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT @@ -92,6 +162,7 @@ waitforlisten $spdk_pid run_test "test_resize_lvol" test_resize_lvol run_test "test_resize_lvol_negative" test_resize_lvol_negative +run_test "test_resize_lvol_with_io_traffic" test_resize_lvol_with_io_traffic trap - SIGINT SIGTERM EXIT killprocess $spdk_pid