diff --git a/test/lvol/fragmap.sh b/test/lvol/fragmap.sh index cc9212ab2..09ef5c8ea 100755 --- a/test/lvol/fragmap.sh +++ b/test/lvol/fragmap.sh @@ -9,44 +9,207 @@ source $rootdir/test/common/autotest_common.sh source $rootdir/test/lvol/common.sh source $rootdir/test/bdev/nbd_common.sh -function test_fragmap() { - # Create lvs - bs_malloc_name=$(rpc_cmd bdev_malloc_create 20 $MALLOC_BS) - lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$bs_malloc_name" lvs_test) +NUM_CLUSTERS=10 +LVS_DEFAULT_CLUSTER_SIZE_BTYE=$((LVS_DEFAULT_CLUSTER_SIZE_MB*1024*1024)) - # Create lvol with 4 cluster - lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * 4)) +function verify() { + local fragmap="$1" + local expected_cluster_size="$2" + local expected_num_clusters="$3" + local expected_num_allocated_clusters="$4" + local expected_fragmap="$5" + + [ "$(jq '.cluster_size' <<< "$fragmap")" == "$expected_cluster_size" ] + [ "$(jq '.num_clusters' <<< "$fragmap")" == "$expected_num_clusters" ] + [ "$(jq '.num_allocated_clusters' <<< "$fragmap")" == "$expected_num_allocated_clusters" ] + [ "$(jq -r '.fragmap' <<< "$fragmap")" == "$expected_fragmap" ] +} + +function test_fragmap_empty_lvol() { + # Create lvs + malloc_name=$(rpc_cmd bdev_malloc_create 80 $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # Create lvol with 10 cluster + lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * "$NUM_CLUSTERS")) lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) - # Fill second and fourth cluster of lvol nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 - dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=1 - dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=3 + + # Expected map: 00000000 00000000 + fragmap=$(rpc_cmd bdev_lvol_get_fragmap $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "$NUM_CLUSTERS" 0 "AAA=" + + # Stop nbd device nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 - # Create snapshots of lvol bdev - snapshot_uuid=$(rpc_cmd bdev_lvol_snapshot lvs_test/lvol_test lvol_snapshot) - - # Fill first and third cluster of lvol - nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 - dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 - dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs="$LVS_DEFAULT_CLUSTER_SIZE" count=1 seek=2 - nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 - - - - # Stop nbd devices - nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd1 - nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + 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" + check_leftover_devices } +function test_fragmap_data_hole() { + # Create lvs + malloc_name=$(rpc_cmd bdev_malloc_create 80 $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # Create lvol with 10 cluster + lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * "$NUM_CLUSTERS")) + lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) + + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + + # Expected map: 00000001 00000000 (1st cluster is wriiten) + + # Read entire fragmap + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs=4096 count=1 + fragmap=$(rpc_cmd bdev_lvol_get_fragmap $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "$NUM_CLUSTERS" "1" "AQA=" + + # Read fragmap [0, 5) clusters + size=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset 0 --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "1" "AQ==" + + # Read fragmap [5, 10) clusters + offset=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset $offset --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "0" "AA==" + + # Stop nbd device + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + + 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" + check_leftover_devices +} + +function test_fragmap_hole_data() { + # Create lvs + malloc_name=$(rpc_cmd bdev_malloc_create 80 $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # Create lvol with 10 cluster + lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * "$NUM_CLUSTERS")) + lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) + + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + + # Expected map: 00000000 00000010 (10th cluster is wriiten) + + # Read entire fragmap + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs=4096 count=1 seek=9216 + fragmap=$(rpc_cmd bdev_lvol_get_fragmap $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "$NUM_CLUSTERS" "1" "AAI=" + + # Read fragmap [0, 5) clusters + size=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset 0 --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "0" "AA==" + + # Read fragmap [5, 10) clusters + offset=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset $offset --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "1" "EA==" + + # Stop nbd device + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + + 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" + check_leftover_devices +} + +function test_fragmap_hole_data_hole() { + # Create lvs + malloc_name=$(rpc_cmd bdev_malloc_create 80 $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # Create lvol with 10 cluster + lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * "$NUM_CLUSTERS")) + lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) + + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + + # Expected map: 01100000 00000000 + + # Read entire fragmap + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs=4096 count=2048 seek=5120 + fragmap=$(rpc_cmd bdev_lvol_get_fragmap $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "$NUM_CLUSTERS" "2" "YAA=" + + # Read fragmap [0, 5) clusters + size=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset 0 --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "0" "AA==" + + # Read fragmap [5, 10) clusters + offset=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset $offset --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "2" "Aw==" + + # Stop nbd device + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + + 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" + check_leftover_devices +} + +function test_fragmap_data_hole_data() { + # Create lvs + malloc_name=$(rpc_cmd bdev_malloc_create 80 $MALLOC_BS) + lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$malloc_name" lvs_test) + + # Create lvol with 10 cluster + lvol_size=$((LVS_DEFAULT_CLUSTER_SIZE_MB * "$NUM_CLUSTERS")) + lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid" lvol_test "$lvol_size" -t) + + nbd_start_disks "$DEFAULT_RPC_ADDR" "$lvol_uuid" /dev/nbd0 + + # Expected map: 10000111 00000011 + + # Read entire fragmap + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs=4096 count=3072 seek=0 + dd if=/dev/urandom of=/dev/nbd0 oflag=direct bs=4096 count=3072 seek=7168 + fragmap=$(rpc_cmd bdev_lvol_get_fragmap $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "$NUM_CLUSTERS" "6" "hwM=" + + # Read fragmap [0, 5) clusters + size=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset 0 --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "3" "Bw==" + + # Read fragmap [5, 10) clusters + offset=$((LVS_DEFAULT_CLUSTER_SIZE_BTYE*5)) + fragmap=$(rpc_cmd bdev_lvol_get_fragmap --offset $offset --size $size $lvol_uuid) + verify "$fragmap" "$LVS_DEFAULT_CLUSTER_SIZE_BTYE" "5" "3" "HA==" + + # Stop nbd device + nbd_stop_disks "$DEFAULT_RPC_ADDR" /dev/nbd0 + + 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" + check_leftover_devices +} + + $SPDK_BIN_DIR/spdk_tgt & spdk_pid=$! trap 'killprocess "$spdk_pid"; exit 1' SIGINT SIGTERM EXIT waitforlisten $spdk_pid modprobe nbd -run_test "test_shallow_copy_compare" test_shallow_copy_compare +run_test "test_fragmap_empty_lvol" test_fragmap_empty_lvol +run_test "test_fragmap_data_hole" test_fragmap_data_hole +run_test "test_fragmap_hole_data" test_fragmap_hole_data +rrun_test "test_fragmap_hole_data_hole" test_fragmap_hole_data_hole +run_test "test_fragmap_data_hole_data" test_fragmap_data_hole_data trap - SIGINT SIGTERM EXIT -killprocess $spdk_pid +killprocess $spdk_pid \ No newline at end of file diff --git a/test/lvol/lvol.sh b/test/lvol/lvol.sh index 7264c48c1..47396ad9a 100755 --- a/test/lvol/lvol.sh +++ b/test/lvol/lvol.sh @@ -21,6 +21,7 @@ run_test "lvol_provisioning" $rootdir/test/lvol/thin_provisioning.sh run_test "lvol_esnap" $rootdir/test/lvol/esnap/esnap run_test "lvol_external_snapshot" $rootdir/test/lvol/external_snapshot.sh run_test "lvol_external_copy" $rootdir/test/lvol/external_copy.sh +run_test "lvol_fragmap" $rootdir/test/lvol/fragmap.sh timing_exit basic timing_exit lvol