xref: /spdk/test/lvol/external_copy.sh (revision c69d837435b8443ffb3cf1d8925a1bb92fe6dcc8)
1#!/usr/bin/env bash
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2023 SUSE LLC.
4#  All rights reserved.
5#
6testdir=$(readlink -f $(dirname $0))
7rootdir=$(readlink -f $testdir/../..)
8source $rootdir/test/common/autotest_common.sh
9source $rootdir/test/lvol/common.sh
10source $rootdir/test/bdev/nbd_common.sh
11
12function test_shallow_copy_compare() {
13	# Create lvs
14	bs_malloc_name=$(rpc_cmd bdev_malloc_create 20 $MALLOC_BS)
15	lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$bs_malloc_name" lvs_test)
16
17	# Create lvol with 4 cluster
18	lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * 4))
19	lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t)
20
21	# Fill second and fourth cluster of lvol
22	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
23	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=1
24	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=3
25	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
26
27	# Create snapshots of lvol bdev
28	snapshot_uuid=$(rpc_cmd bdev_lvol_snapshot lvs_test/lvol_test lvol_snapshot)
29
30	# Fill first and third cluster of lvol
31	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
32	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1
33	dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=2
34	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
35
36	# Set lvol as read only to perform the copy
37	rpc_cmd bdev_lvol_set_read_only "$lvol_uuid"
38
39	# Create external bdev to make a shallow copy of lvol on
40	ext_malloc_name=$(rpc_cmd bdev_malloc_create "$lvol_size" $MALLOC_BS)
41
42	# Make a shallow copy of lvol over external bdev
43	shallow_copy=$(rpc_cmd bdev_lvol_start_shallow_copy "$lvol_uuid" "$ext_malloc_name")
44	operation_id=$(echo $shallow_copy | jq -r '.operation_id')
45
46	# Check status of operation
47	retry=0
48	while [[ $retry -lt 10 ]]; do
49		status=$(rpc_cmd bdev_lvol_check_shallow_copy $operation_id)
50		result=$(echo $status | jq -r '.state')
51		copied_clusters=$(echo $status | jq -r '.copied_clusters')
52		total_clusters=$(echo $status | jq -r '.total_clusters')
53
54		if [[ "$result" == "complete" ]]; then
55			[[ $copied_clusters == 2 ]]
56			[[ $total_clusters == 2 ]]
57			break
58		fi
59
60		retry=$((retry + 1))
61		sleep 1
62	done
63
64	[[ $retry -lt 10 ]]
65
66	# Create nbd devices of lvol and external bdev for comparison
67	nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0
68	nbd_start_disks "$DEFAULT_RPC_ADDR" "$ext_malloc_name" /dev/nbd1
69
70	# Compare lvol and external bdev in first and third cluster
71	cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd0 /dev/nbd1
72	cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd0 /dev/nbd1 "$((LVS_DEFAULT_CLUSTER_SIZE * 2))" "$((LVS_DEFAULT_CLUSTER_SIZE * 2))"
73
74	# Check that second and fourth cluster of external bdev are zero filled
75	cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd1 /dev/zero "$LVS_DEFAULT_CLUSTER_SIZE"
76	cmp -n "$LVS_DEFAULT_CLUSTER_SIZE" /dev/nbd1 /dev/zero "$((LVS_DEFAULT_CLUSTER_SIZE * 3))"
77
78	# Stop nbd devices
79	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd1
80	nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0
81
82	# Clean up
83	rpc_cmd bdev_malloc_delete "$ext_malloc_name"
84	rpc_cmd bdev_lvol_delete "$snapshot_uuid"
85	rpc_cmd bdev_lvol_delete "$lvol_uuid"
86	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
87	rpc_cmd bdev_malloc_delete "$bs_malloc_name"
88	check_leftover_devices
89}
90
91$SPDK_BIN_DIR/spdk_tgt &
92spdk_pid=$!
93trap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT
94waitforlisten $spdk_pid
95modprobe nbd
96
97run_test "test_shallow_copy_compare" test_shallow_copy_compare
98
99trap - SIGINT SIGTERM EXIT
100killprocess $spdk_pid
101