#
# Perform failover when multiple clients read data from the same file on
# a Gfarm file system.
#
load "gfarm_v2::check_vars"
load "gfarm_v2::import_config_gfarm_params"
load "gfarm_v2::failover"

#
# Test parameters
#
# TEST_DIR_BASE:  Base directory to create directories
# NCLIENTS:       The number of clients.
#
setup_failover_in_mkdir()
{
	# default parameter
	TEST_DIR_BASE=${GFARM_TEST_FILE_DIR-"/tmp"}/failover_in_mkdir_$$
	NCLIENTS=${NCLIENTS-"100"}

	# prepare: check whether required host is defined.
	check_vars gfmd1 gfmd2 gfmd3 gfsd1 client1 \
		|| return $RESULT_UNSUPPORTED

	# prepare: try making a dirctory, at first.
	gfmkdir -p "$TEST_DIR_BASE/X" && gfrmdir "$TEST_DIR_BASE/X"
	if [ $? -ne 0 ]; then
		log_warn "$TEST_DIR_BASE/X: failed to gfmkdir"
		return $RESULT_FAIL
	fi
}

stop_jobs()
{
	[ "X$NCLIENTS" = X ] && return

	I=0
	while [ $I -lt $NCLIENTS ]; do
		JOB_PID=`eval echo \\$JOB$I\_PID`
		[ "X$JOB_PID" = X ] && break
		kill $JOB_PID
		log_debug "$TESTNAME: kill job #$I pid=$JOB_PID"
		I=`expr $I + 1`
	done
}

test_failover_in_mkdir()
{
	FAILOVER_DONE=false
	MAX_FAILOVER_RETRY_COUNT=5
	RETRY_COUNT=0

	while [ $RETRY_COUNT -lt $MAX_FAILOVER_RETRY_COUNT ]; do
		# step: create jobs which increases journal sequence number.
		I=0
		while [ $I -lt $NCLIENTS ]; do
			gfmkdir "$TEST_DIR_BASE/$I" &
			eval JOB"$I"_PID=$!
			log_debug "$TESTNAME: start job #$I" \
				"pid=`eval echo \\$JOB$I\_PID`"
			I=`expr $I + 1`

		done

		# step: perform failover.
		failover
		case $? in
		0)	FAILOVER_DONE=true
			break
			;;
		1)	log_warn "$TESTNAME: failed to perform failover"
			return $RESULT_FAIL
			;;
		2)	stop_jobs
			sleep 5
			cleanup_failover
			log_warn "$TESTNAME: master gfmd is unchanged"
			;;
		esac
	done

	if $FAILOVER_DONE; then
		return $RESULT_PASS
	fi

	log_warn "$TESTNAME: failover retry counter reaches" \
		"the max value $MAX_FAILOVER_RETRY_COUNT, give up"
	return $RESULT_FAIL
}

teardown_failover_in_mkdir()
{
	# cleanup: stop jobs.
	stop_jobs

	# cleanup: start gfmds.
	cleanup_failover

	# cleanup: delete test directories.
	[ "X$TEST_DIR_BASE" != X ] && gfrm -rf $TEST_DIR_BASE

	return $RESULT_PASS
}
