#!/bin/bash
# SPDX-License-Identifier: MIT or GPL-2.0-only

. common/fio_common
. common/loop_common
. common/nbd_common

echo -e "\trun fio with dev recovery, type 1:"
echo -e "\t(1)kill all ubq_deamon, (2)recover with new ubq_daemon, (3)delete dev"

BS=4k
RW=rw
JOBS=4
QUEUES=2
RT=$TRUNTIME*2
LOOPS=1
URING_COMP=1
NEED_GET_DATA=1
RECOVERY=1
RECOVERY_REISSUE=0

ublk_run_recover_test()
{
	local type=$1
	local file=$2
	local cnt=$3
	local state=""

	if [ "$type" == "null" ]; then
		local backing=""
	elif [ "$type" == "nbd" ]; then
		local backing="--host 127.0.0.1"
	else
		local backing="-f $file"
	fi

	export T_TYPE_PARAMS="-t $type -q $QUEUES -u $URING_COMP -g $NEED_GET_DATA -r $RECOVERY -i $RECOVERY_REISSUE $backing"
	local dev=`__create_ublk_dev`
	echo -e "\trun fio with killing $dev(ublk add $T_TYPE_PARAMS) queue daemon $cnt"

	__run_fio_libaio $dev $BS $RW $JOBS $RT > /dev/null 2 >& 1 &
	sleep 2

	state=`__ublk_kill_daemon $dev "QUIESCED"`
	if [ "$state" == "QUIESCED" ]; then
		state=`recover_ublk_dev_and_wait $dev`
		if [ "$state" != "LIVE" ]; then
			echo "device isn't recovered($state)"
		fi
	else
		echo "device isn't changed to quiesced state($state)"
	fi

	RES=`__remove_ublk_dev_return $dev`
	if [ $RES -ne 0 ]; then
		echo -e "\tdelete $dev failed($RES)"
		break
	fi
	wait
}

for TGT in $ALL_TGTS; do
	for RECOVERY_REISSUE in `seq 0 1`; do
		TESTF=`_create_image $TGT "null" 256M`
		for CNT in `seq $LOOPS`; do
			ublk_run_recover_test $TGT $TESTF $CNT
		done
		_remove_image $TGT $TESTF
	done
done
