Skip to content

Commit

Permalink
nvme: add test for rapid namespace remapping
Browse files Browse the repository at this point in the history
Add a test for rapid namespace remapping to simulate short-lived
namespaces being created and deleted in rapid succession with a
cluster.

Signed-off-by: Hannes Reinecke <[email protected]>
[Shin'ichiro: used for loop instead of seq per style guideline]
[Shin'ichiro: renumbered the test case from 055 to 058]
Reviewed-by: Chaitanya Kulkarni <[email protected]>
Signed-off-by: Shin'ichiro Kawasaki <[email protected]>
  • Loading branch information
hreinecke authored and kawasaki committed Dec 11, 2024
1 parent 4cf8b7a commit bc851ac
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 0 deletions.
105 changes: 105 additions & 0 deletions tests/nvme/058
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2024 Hannes Reinecke (SUSE) <[email protected]>
#
# Test rapid remapping of namespaces

. tests/nvme/rc

DESCRIPTION="test rapid namespace remapping"

requires() {
_nvme_requires
_have_loop
_require_nvme_trtype_is_fabrics
}

set_conditions() {
_set_nvme_trtype "$@"
}

_setup_ana() {
local portno=0

for port in "$@"; do
if (( portno == 0 )); then
_setup_nvmet_port_ana "${port}" 1 "optimized"
_setup_nvmet_port_ana "${port}" 2 "inaccessible"
_setup_nvmet_port_ana "${port}" 3 "inaccessible"
elif (( portno == 1 )); then
_setup_nvmet_port_ana "${port}" 1 "non-optimized"
_setup_nvmet_port_ana "${port}" 2 "inaccessible"
_setup_nvmet_port_ana "${port}" 3 "inaccessible"
elif (( portno == 2 )); then
_setup_nvmet_port_ana "${port}" 1 "inaccessible"
_setup_nvmet_port_ana "${port}" 2 "optimized"
_setup_nvmet_port_ana "${port}" 3 "inaccessible"
elif (( portno == 3 )); then
_setup_nvmet_port_ana "${port}" 1 "inaccessible"
_setup_nvmet_port_ana "${port}" 2 "non-optimized"
_setup_nvmet_port_ana "${port}" 3 "inaccessible"
elif (( portno == 4 )); then
_setup_nvmet_port_ana "${port}" 1 "inaccessible"
_setup_nvmet_port_ana "${port}" 2 "inaccessible"
_setup_nvmet_port_ana "${port}" 3 "optimized"
else
_setup_nvmet_port_ana "${port}" 1 "inaccessible"
_setup_nvmet_port_ana "${port}" 2 "inaccessible"
_setup_nvmet_port_ana "${port}" 3 "non-optimized"
fi
portno=$(( portno + 1 ))
done
}

test() {
echo "Running ${TEST_NAME}"

_setup_nvmet

local d i n port
local -a ports
local num_namespaces=3

_nvmet_target_setup --ports 6 --blkdev none

for ((d = 1; d <= num_namespaces; d++)); do
local file_path
local blkdev
local uuid

file_path="${TMPDIR}/img${d}"
truncate -s "${NVME_IMG_SIZE}" "${file_path}"
blkdev="$(losetup -f --show "${file_path}")"
uuid="$(uuidgen)"
_create_nvmet_ns --nsid "${d}" --blkdev "${blkdev}" \
--uuid "${uuid}" --grpid "${d}" > /dev/null
done

_get_nvmet_ports "${def_subsysnqn}" ports
_setup_ana "${ports[@]}"

for port in "${ports[@]}"; do
_nvme_connect_subsys --port "${port}"
done

# Simulate unmap on one cluster node and remap to anther one
for ((i = 0; i <= 10; i++)); do
echo "Remap namespace #${i}"
grpid=$(( (i % 3) + 1 ))
for n in $(seq 1 "${num_namespaces}" | shuf); do
_disable_nvmet_ns "${n}"
done
for n in $(seq 1 "${num_namespaces}" | shuf); do
local uuid

uuid=$(uuidgen)
_set_nvmet_ns_uuid "${n}" "${uuid}"
_enable_nvmet_ns "${n}"
done
done

_nvme_disconnect_subsys
_nvmet_target_cleanup

echo "Test complete"
}
14 changes: 14 additions & 0 deletions tests/nvme/058.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Running nvme/058
Remap namespace #0
Remap namespace #1
Remap namespace #2
Remap namespace #3
Remap namespace #4
Remap namespace #5
Remap namespace #6
Remap namespace #7
Remap namespace #8
Remap namespace #9
Remap namespace #10
disconnected 6 controller(s)
Test complete
31 changes: 31 additions & 0 deletions tests/nvme/rc
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,37 @@ _set_nvmet_dhgroup() {
"${cfs_path}/dhchap_dhgroup"
}

_enable_nvmet_ns() {
local subsysnqn="${def_subsysnqn}"
local nsid="${1:-1}"

cfs_path="${NVMET_CFS}/subsystems/${subsysnqn}"
ns_path="${cfs_path}/namespaces/${nsid}"

echo 1 > "${ns_path}/enable"
}

_disable_nvmet_ns() {
local subsysnqn="${def_subsysnqn}"
local nsid="${1:-1}"

cfs_path="${NVMET_CFS}/subsystems/${subsysnqn}"
ns_path="${cfs_path}/namespaces/${nsid}"

echo 0 > "${ns_path}/enable"
}

_set_nvmet_ns_uuid() {
local subsysnqn="${def_subsysnqn}"
local nsid="${1:-1}"
local uuid="${2:-$(uuidgen)}"

cfs_path="${NVMET_CFS}/subsystems/${subsysnqn}"
ns_path="${cfs_path}/namespaces/${nsid}"

printf "%s" "${uuid}" > "${ns_path}/device_uuid"
}

_find_nvme_passthru_loop_dev() {
local subsys=$1
local nsid
Expand Down

0 comments on commit bc851ac

Please sign in to comment.