xref: /spdk/test/lvol/resize.sh (revision eb53c23236cccb6b698b7ca70ee783da1c574b5f)
15ff75ec2SDarek Stojaczyk#!/usr/bin/env bash
2*eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3*eb53c232Spaul luse#  Copyright (C) 2019 Intel Corporation
4*eb53c232Spaul luse#  All rights reserved.
5*eb53c232Spaul luse#
65ff75ec2SDarek Stojaczyktestdir=$(readlink -f $(dirname $0))
75ff75ec2SDarek Stojaczykrootdir=$(readlink -f $testdir/../..)
85ff75ec2SDarek Stojaczyksource $rootdir/test/common/autotest_common.sh
95ff75ec2SDarek Stojaczyksource $rootdir/test/lvol/common.sh
109d044f25SDarek Stojaczyksource $rootdir/test/bdev/nbd_common.sh
115ff75ec2SDarek Stojaczyk
125ff75ec2SDarek Stojaczyk# resize an lvol a few times
135ff75ec2SDarek Stojaczykfunction test_resize_lvol() {
145ff75ec2SDarek Stojaczyk	# create an lvol store
155ff75ec2SDarek Stojaczyk	malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS)
165ff75ec2SDarek Stojaczyk	lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test)
175ff75ec2SDarek Stojaczyk
185ff75ec2SDarek Stojaczyk	# calculate lvol size
195ff75ec2SDarek Stojaczyk	lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4)))
205ff75ec2SDarek Stojaczyk	lvol_size=$((lvol_size_mb * 1024 * 1024))
215ff75ec2SDarek Stojaczyk
225ff75ec2SDarek Stojaczyk	# create an lvol on top
235ff75ec2SDarek Stojaczyk	lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size_mb")
245ff75ec2SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
255ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
265ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
275ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test/lvol_test" ]
285ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ]
295ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
305ff75ec2SDarek Stojaczyk
315ff75ec2SDarek Stojaczyk	# resize the lvol to twice its original size
325ff75ec2SDarek Stojaczyk	lvol_size_mb=$((lvol_size_mb * 2))
335ff75ec2SDarek Stojaczyk	lvol_size=$((lvol_size_mb * 1024 * 1024))
345ff75ec2SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "$lvol_uuid" "$lvol_size_mb"
355ff75ec2SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
365ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
375ff75ec2SDarek Stojaczyk
38cf628b09SDarek Stojaczyk	# resize the lvol to four times its original size, use its name instead of uuid
395ff75ec2SDarek Stojaczyk	lvol_size_mb=$((lvol_size_mb * 2))
405ff75ec2SDarek Stojaczyk	lvol_size=$((lvol_size_mb * 1024 * 1024))
41cf628b09SDarek Stojaczyk	rpc_cmd bdev_lvol_resize lvs_test/lvol_test "$lvol_size_mb"
425ff75ec2SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
435ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
445ff75ec2SDarek Stojaczyk
455ff75ec2SDarek Stojaczyk	# resize the lvol to 0 using lvol bdev alias
465ff75ec2SDarek Stojaczyk	lvol_size_mb=0
475ff75ec2SDarek Stojaczyk	lvol_size=0
485ff75ec2SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "lvs_test/lvol_test" "$lvol_size_mb"
495ff75ec2SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
505ff75ec2SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
515ff75ec2SDarek Stojaczyk
525ff75ec2SDarek Stojaczyk	# clean up
535ff75ec2SDarek Stojaczyk	rpc_cmd bdev_lvol_delete "$lvol_uuid"
545ff75ec2SDarek Stojaczyk	rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false
555ff75ec2SDarek Stojaczyk	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
565ff75ec2SDarek Stojaczyk	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false
575ff75ec2SDarek Stojaczyk	rpc_cmd bdev_malloc_delete "$malloc_name"
585ff75ec2SDarek Stojaczyk}
595ff75ec2SDarek Stojaczyk
604c945d23SDarek Stojaczyk# negative test for resizing a logical volume
614c945d23SDarek Stojaczyk# call bdev_lvol_resize with logical volume which does not exist in configuration
624c945d23SDarek Stojaczyk# call bdev_lvol_resize with size argument bigger than size of base bdev
634c945d23SDarek Stojaczykfunction test_resize_lvol_negative() {
644c945d23SDarek Stojaczyk	# create an lvol store
654c945d23SDarek Stojaczyk	malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS)
664c945d23SDarek Stojaczyk	lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test)
674c945d23SDarek Stojaczyk
684c945d23SDarek Stojaczyk	# create an lvol on top
694c945d23SDarek Stojaczyk	lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$LVS_DEFAULT_CAPACITY_MB")
704c945d23SDarek Stojaczyk
714c945d23SDarek Stojaczyk	# try to resize another, inexistent lvol
724c945d23SDarek Stojaczyk	dummy_uuid="00000000-0000-0000-0000-000000000000"
734c945d23SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "$dummy_uuid" 0 && false
744c945d23SDarek Stojaczyk	# just make sure the size of the real lvol did not change
754c945d23SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
764c945d23SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CAPACITY / MALLOC_BS))" ]
774c945d23SDarek Stojaczyk
784c945d23SDarek Stojaczyk	# try to resize an lvol to a size bigger than lvs
794c945d23SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "$lvol_uuid" "$MALLOC_SIZE_MB" && false
804c945d23SDarek Stojaczyk	# just make sure the size of the real lvol did not change
814c945d23SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
824c945d23SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CAPACITY / MALLOC_BS))" ]
834c945d23SDarek Stojaczyk
844c945d23SDarek Stojaczyk	# clean up
854c945d23SDarek Stojaczyk	rpc_cmd bdev_lvol_delete "$lvol_uuid"
864c945d23SDarek Stojaczyk	rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false
874c945d23SDarek Stojaczyk	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
884c945d23SDarek Stojaczyk	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false
894c945d23SDarek Stojaczyk	rpc_cmd bdev_malloc_delete "$malloc_name"
904c945d23SDarek Stojaczyk}
914c945d23SDarek Stojaczyk
929d044f25SDarek Stojaczyk# resize an lvol a few times
939d044f25SDarek Stojaczykfunction test_resize_lvol_with_io_traffic() {
949d044f25SDarek Stojaczyk	# create an lvol store
959d044f25SDarek Stojaczyk	malloc_name=$(rpc_cmd bdev_malloc_create $MALLOC_SIZE_MB $MALLOC_BS)
969d044f25SDarek Stojaczyk	lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test)
979d044f25SDarek Stojaczyk
989d044f25SDarek Stojaczyk	# calculate lvol size
999d044f25SDarek Stojaczyk	lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 2)))
1009d044f25SDarek Stojaczyk	lvol_size=$((lvol_size_mb * 1024 * 1024))
1019d044f25SDarek Stojaczyk
1029d044f25SDarek Stojaczyk	# create an lvol on top
1039d044f25SDarek Stojaczyk	lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size_mb")
1049d044f25SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
1059d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
1069d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
1079d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test/lvol_test" ]
1089d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$MALLOC_BS" ]
1099d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
1109d044f25SDarek Stojaczyk
1119d044f25SDarek Stojaczyk	# prepare to do some I/O
1129d044f25SDarek Stojaczyk	trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT
1139d044f25SDarek Stojaczyk	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
1149d044f25SDarek Stojaczyk
1159d044f25SDarek Stojaczyk	# write to the entire lvol
1169d044f25SDarek Stojaczyk	count=$((lvol_size / LVS_DEFAULT_CLUSTER_SIZE))
1179d044f25SDarek Stojaczyk	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=$count
1189d044f25SDarek Stojaczyk
1199d044f25SDarek Stojaczyk	# writing beyond lvol size should fail
1209d044f25SDarek Stojaczyk	offset=$((lvol_size / LVS_DEFAULT_CLUSTER_SIZE + 1))
1219d044f25SDarek Stojaczyk	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1 && false
1229d044f25SDarek Stojaczyk
1239d044f25SDarek Stojaczyk	# resize the lvol to twice its original size
1249d044f25SDarek Stojaczyk	lvol_size_mb=$((lvol_size_mb * 2))
1259d044f25SDarek Stojaczyk	lvol_size=$((lvol_size_mb * 1024 * 1024))
1269d044f25SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "$lvol_uuid" "$lvol_size_mb"
1279d044f25SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
1289d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / MALLOC_BS))" ]
1299d044f25SDarek Stojaczyk
1309d044f25SDarek Stojaczyk	# writing beyond the original lvol size should now succeed, we need
1319d044f25SDarek Stojaczyk	# to restart NBD though as it may still use the old, cached size
1329d044f25SDarek Stojaczyk	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
1339d044f25SDarek Stojaczyk	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
1349d044f25SDarek Stojaczyk	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=$offset count=1
1359d044f25SDarek Stojaczyk
1369d044f25SDarek Stojaczyk	# lvol can't be downsized if they have any open descriptors, so close them now
1379d044f25SDarek Stojaczyk	trap - SIGINT SIGTERM EXIT
1389d044f25SDarek Stojaczyk	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
1399d044f25SDarek Stojaczyk
1409d044f25SDarek Stojaczyk	# resize lvol down to a single cluster
1419d044f25SDarek Stojaczyk	rpc_cmd bdev_lvol_resize "$lvol_uuid" "$LVS_DEFAULT_CLUSTER_SIZE_MB"
1429d044f25SDarek Stojaczyk	lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
1439d044f25SDarek Stojaczyk	[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((LVS_DEFAULT_CLUSTER_SIZE / MALLOC_BS))" ]
1449d044f25SDarek Stojaczyk
1459d044f25SDarek Stojaczyk	# make sure we can't write beyond the first cluster
1469d044f25SDarek Stojaczyk	trap 'nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0; exit 1' SIGINT SIGTERM EXIT
1479d044f25SDarek Stojaczyk	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
1489d044f25SDarek Stojaczyk	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" seek=1 count=1 && false
1499d044f25SDarek Stojaczyk
1509d044f25SDarek Stojaczyk	# clean up
1519d044f25SDarek Stojaczyk	trap - SIGINT SIGTERM EXIT
1529d044f25SDarek Stojaczyk	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
1539d044f25SDarek Stojaczyk	rpc_cmd bdev_lvol_delete "$lvol_uuid"
1549d044f25SDarek Stojaczyk	rpc_cmd bdev_get_bdevs -b "$lvol_uuid" && false
1559d044f25SDarek Stojaczyk	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
1569d044f25SDarek Stojaczyk	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false
1579d044f25SDarek Stojaczyk	rpc_cmd bdev_malloc_delete "$malloc_name"
1589d044f25SDarek Stojaczyk}
1599d044f25SDarek Stojaczyk
16012ded5afSMichal Berger# Positive test for destroying a logical_volume after resizing.
16112ded5afSMichal Berger# Call bdev_lvol_delete_lvstore with correct logical_volumes name.
16212ded5afSMichal Bergerfunction test_destroy_after_bdev_lvol_resize_positive() {
16312ded5afSMichal Berger	local malloc_dev
16412ded5afSMichal Berger	local lvstore_name=lvs_test lvstore_uuid
16512ded5afSMichal Berger	local lbd_name=lbd_test bdev_uuid bdev_size
16612ded5afSMichal Berger
16712ded5afSMichal Berger	malloc_dev=$(rpc_cmd bdev_malloc_create 256 "$MALLOC_BS")
16812ded5afSMichal Berger	lvstore_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_dev" "$lvstore_name")
16912ded5afSMichal Berger
17012ded5afSMichal Berger	get_lvs_jq bdev_lvol_get_lvstores -u "$lvstore_uuid"
17112ded5afSMichal Berger	[[ ${jq_out["uuid"]} == "$lvstore_uuid" ]]
17212ded5afSMichal Berger	[[ ${jq_out["name"]} == "$lvstore_name" ]]
17312ded5afSMichal Berger
17412ded5afSMichal Berger	bdev_size=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 4)))
17512ded5afSMichal Berger	bdev_uuid=$(rpc_cmd bdev_lvol_create -u "$lvstore_uuid" "$lbd_name" "$bdev_size")
17612ded5afSMichal Berger
17712ded5afSMichal Berger	# start resizing in the following fashion:
17812ded5afSMichal Berger	# - size is equal to one quarter of size malloc bdev plus 4 MB
17912ded5afSMichal Berger	# - size is equal half of size malloc bdev
18012ded5afSMichal Berger	# - size is equal to three quarters of size malloc bdev
18112ded5afSMichal Berger	# - size is equal to size if malloc bdev minus 4 MB
18212ded5afSMichal Berger	# - size is equal 0 MiB
18312ded5afSMichal Berger	local resize
18412ded5afSMichal Berger	for resize in \
18512ded5afSMichal Berger		"$bdev_size" \
18612ded5afSMichal Berger		$((bdev_size + 4)) \
18712ded5afSMichal Berger		$((bdev_size * 2)) \
18812ded5afSMichal Berger		$((bdev_size * 3)) \
18912ded5afSMichal Berger		$((bdev_size * 4 - 4)) \
19012ded5afSMichal Berger		0; do
19112ded5afSMichal Berger		resize=$(round_down $((resize / 4)))
19212ded5afSMichal Berger		rpc_cmd bdev_lvol_resize "$bdev_uuid" "$resize"
19312ded5afSMichal Berger
19412ded5afSMichal Berger		get_bdev_jq bdev_get_bdevs -b "$bdev_uuid"
19512ded5afSMichal Berger		[[ ${jq_out["name"]} == "$bdev_uuid" ]]
19612ded5afSMichal Berger		[[ ${jq_out["name"]} == "${jq_out["uuid"]}" ]]
19712ded5afSMichal Berger		((jq_out["block_size"] == MALLOC_BS))
19812ded5afSMichal Berger		((jq_out["num_blocks"] * jq_out["block_size"] == resize * 1024 ** 2))
19912ded5afSMichal Berger	done
20012ded5afSMichal Berger
20112ded5afSMichal Berger	# cleanup
20212ded5afSMichal Berger	rpc_cmd bdev_lvol_delete "$bdev_uuid"
20312ded5afSMichal Berger	rpc_cmd bdev_lvol_delete_lvstore -u "$lvstore_uuid"
20412ded5afSMichal Berger	rpc_cmd bdev_get_bdevs -b "$bdev_uuid" && false
20512ded5afSMichal Berger	rpc_cmd bdev_lvol_get_lvstores -u "$lvstore_uuid" && false
20612ded5afSMichal Berger	rpc_cmd bdev_malloc_delete "$malloc_dev"
20712ded5afSMichal Berger	check_leftover_devices
20812ded5afSMichal Berger}
20912ded5afSMichal Berger
2109d044f25SDarek Stojaczykmodprobe nbd
2116b9b448eSBen Walker$SPDK_BIN_DIR/spdk_tgt &
2125ff75ec2SDarek Stojaczykspdk_pid=$!
2135ff75ec2SDarek Stojaczyktrap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT
2145ff75ec2SDarek Stojaczykwaitforlisten $spdk_pid
2155ff75ec2SDarek Stojaczyk
2165ff75ec2SDarek Stojaczykrun_test "test_resize_lvol" test_resize_lvol
2174c945d23SDarek Stojaczykrun_test "test_resize_lvol_negative" test_resize_lvol_negative
2189d044f25SDarek Stojaczykrun_test "test_resize_lvol_with_io_traffic" test_resize_lvol_with_io_traffic
21912ded5afSMichal Bergerrun_test "test_destroy_after_bdev_lvol_resize_positive" test_destroy_after_bdev_lvol_resize_positive
2205ff75ec2SDarek Stojaczyk
2215ff75ec2SDarek Stojaczyktrap - SIGINT SIGTERM EXIT
2225ff75ec2SDarek Stojaczykkillprocess $spdk_pid
223