Skip to content

Commit

Permalink
test/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]>
  • Loading branch information
hreinecke committed Oct 9, 2024
1 parent 8f1232c commit 906c9ec
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 0 deletions.
10 changes: 10 additions & 0 deletions common/nvme
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,16 @@ _create_nvmet_ns() {
echo "${uuid}"
}

_get_nvmet_ns_blkdev() {
local nvmet_subsystem="$1"
local nsid="$2"
local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
local ns_path="${subsys_path}/namespaces/${nsid}"

blkdev="$(cat ${ns_path}/device_path)"
echo "${blkdev}"
}

_setup_nvmet_ns_ana() {
local nvmet_subsystem="$1"
local nsid="$2"
Expand Down
114 changes: 114 additions & 0 deletions tests/nvme/055
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#!/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
_have_fio
_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
}

_remap_ns() {
local subsysnqn="${def_subsysnqn}"
local grpid="$1"
local nsid="${2:-1}"
local new_uuid="$(uuidgen)"
local blkdev

blkdev=$(_get_nvmet_ns_blkdev "${subsysnqn}" "${nsid}")
_remove_nvmet_ns "${subsysnqn}" "${nsid}"
_create_nvmet_ns --subsysnqn "${subsysnqn}" --nsid "${nsid}" \
--blkdev "${blkdev}" --uuid "${new_uuid}" \
--grpid "${grpid}" > /dev/null
}

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

_setup_nvmet

local d
local i
local -a ports
local ctrls

_nvmet_target_setup --ports 6 --blkdev none

for d in $(seq 1 3); 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

read -ra ports < <(_get_nvmet_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 in $(seq 0 10); do
echo "Remap namespace #${i}"
grpid=$(( (i % 3) + 1 ))
for n in $(seq 1 3 | shuf); do
_remap_ns "${grpid}" "${n}"
done
done

_nvme_disconnect_subsys
_nvmet_target_cleanup

echo "Test complete"
}
14 changes: 14 additions & 0 deletions tests/nvme/055.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Running nvme/055
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

0 comments on commit 906c9ec

Please sign in to comment.