Skip to content

Commit

Permalink
nvme-of: Remove/Add disk on discovery change event (#13780)
Browse files Browse the repository at this point in the history
  • Loading branch information
ixhamza authored Jun 17, 2024
1 parent eec815b commit 9b76876
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Service]
ExecStart=
ExecStart=/bin/sh -c "/usr/local/bin/nvmf-wrapper.sh `/bin/echo -e '${CONNECT_ARGS}'`"
50 changes: 50 additions & 0 deletions src/freenas/usr/local/bin/nvmf-connect.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/bin/bash

RECONNECT_TIMEOUT_SEC=5
discovery_dev=$(echo "$@" | grep -oP '(?<=--device=)\w+')
discovery_addr=$(</sys/class/nvme/${discovery_dev}/address)
queue="/var/run/${discovery_dev}-fabric-queue"

while [ -s $queue ]; do
truncate -s 0 $queue
local_nqns=""
disconnected=0
discovery_nqns=$(nvme discover $@ | grep subnqn: | awk '{gsub(/^subnqn: */,"")}1')

for nqn_f in /sys/class/nvme-fabrics/ctl/nvme*/subsysnqn; do
dev=$(basename "$(dirname "$nqn_f")")
nqn=$(<"$nqn_f")
addr=$(</sys/class/nvme/${dev}/address)

if [[ "$dev" == "$discovery_dev" || "$addr" != "$discovery_addr" ]]; then
continue
fi

if [[ "$discovery_nqns" != *"$nqn"* ]]; then
nvme disconnect -d $dev
disconnected=1
else
local_nqns+="$nqn"$'\n'
fi
done

if [ $disconnected -eq 0 ]; then
counter=0
local_nqns=$(echo -e "$local_nqns" | tr -s '\n' | sort)

while [ $counter -lt $RECONNECT_TIMEOUT_SEC ]; do
connect_nqns=$(nvme discover "$@" | grep subnqn: | awk '{gsub(/^subnqn: */,"")}1' \
| tr -s '\n' | sort)

if [ "$local_nqns" != "$connect_nqns" ]; then
break
fi

((counter++))
sleep 1
done
fi

connect_all=$(nvme connect-all $@)
done
echo "EXIT" > $queue
29 changes: 29 additions & 0 deletions src/freenas/usr/local/bin/nvmf-wrapper.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash

if [ "$#" -eq 0 ]; then
echo "Error: No arguments provided."
exit 1
fi

discovery_nqn="nqn.2014-08.org.nvmexpress.discovery"
discovery_dev=$(echo "$@" | grep -oP '(?<=--device=)\w+')

if [[ $(</sys/class/nvme/${discovery_dev}/subsysnqn) != $discovery_nqn ]]; then
echo "Error: Event not on discovery controller"
exit 1
fi

queue="/var/run/${discovery_dev}-fabric-queue"
echo "QUEUE" > $queue
systemd-run --unit=${discovery_dev}-of.service /bin/bash -c "/usr/local/bin/nvmf-connect.sh $*"

# If service is still active and queue reads EXIT, we have a race. Wait for small interval since
# we already know that nvmf-connect.sh is about to exit.
if [ $? != 0 ] && [ "EXIT" = $(<$queue) ]; then
sleep 0.1
systemd-run --unit=${discovery_dev}-of.service /bin/bash -c "/usr/local/bin/nvmf-connect.sh $*"

if [ $? != 0 ]; then
echo "Error: ${discovery_dev}-of.service failed to start after waiting for 100 milliseconds"
fi
fi

0 comments on commit 9b76876

Please sign in to comment.