#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2017 Jens Axboe
#
# Threads doing IO to a device, while we switch schedulers

. tests/block/rc

DESCRIPTION="switch schedulers while doing IO"
TIMED=1
CAN_BE_ZONED=1

requires() {
	_have_fio
}

device_requires() {
	_require_test_dev_sysfs queue/scheduler
}

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

	# shellcheck disable=SC2207
	local scheds=($(_io_schedulers "$(basename "${TEST_DEV_SYSFS}")"))

	if _test_dev_is_rotational; then
		size="32m"
	else
		size="1g"
	fi

	# start fio job
	_run_fio_rand_io --filename="$TEST_DEV" --size="$size" &

	# while job is running, switch between schedulers
	# fio test may take too long time to complete read/write in special
	# size in some bad situations. Set a timeout here which does not block
	# overall test.
	start_time=$(date +%s)
	timeout=${TIMEOUT:=900}
	while kill -0 $! 2>/dev/null; do
		idx=$((RANDOM % ${#scheds[@]}))
		_test_dev_queue_set scheduler "${scheds[$idx]}"
		sleep .2
		end_time=$(date +%s)
		if (( end_time - start_time > timeout + 15 )); then
			echo "fio did not finish after $timeout seconds!"
			break
		fi
	done

	FIO_PERF_FIELDS=("read iops")
	_fio_perf_report

	echo "Test complete"
}
