#
# Test case for check behavior when replicated a file in gfmd failing over
#
load "gfarm2fs::calc_checksum"
load "gfarm_v2::generate_testdata"
load "gfarm_v2::check_replica_num"
load "gfarm_v2::check_journal_seqnum_max"
load "gfarm_v2::check_gfmd_connected"
load "gfarm_v2::check_gfmd_master"
load "gfarm_v2::failback"

#
# Test parameters
#
# GFARM_HOME:	A directory path of Gfarm which this test will be executed
# FILE_SIZE:	Size of a file to be created
# SLEEP_SEC:	Second to sleep before make gfmd fail over
# TIMEOUT:	  timeout sec for starting/stopping gfmd
# RETRY_COUNT:	  retry number to check master/slave
#
setup_rep_in_gfmd_failover()
{
	# default parameter
	GFARM_HOME=${GFARM_HOME-"/"}
	FILE_SIZE=${FILE_SIZE-"100M"}
	SLEEP_SEC=${SLEEP_SEC-"3"}
	TIMEOUT=${TIMEOUT-"10"}
	RETRY_COUNT=${RETRY_COUNT-"10"}
	RETRY_INTERVAL=${RETRY_COUNT-"5"}

	# miscellaneous parameters
	GFARM_FILE=$GFARM_HOME/$TEST_EXEC_ID

	# prepare: check whether required host is defined
	$GFSERVICE systest::gfarm_v2::check_hostids_defined - \
		"gfmd1 gfmd2 gfsd1 gfsd2 client1"
	[ $? -ne 0 ] && return $RESULT_UNSUPPORTED

	# prepare: make a file
	generate_testdata $FILE_SIZE | $GFSERVICE systest::gfarm_v2::read_and_register \
		client1 $GFARM_FILE gfmd1 gfsd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to write files"
		return $RESULT_FATAL
	fi

	# prepare: calc checksum
	CHECKSUM=`calc_checksum $FILE_SIZE`

	return $RESULT_PASS
}

test_rep_in_gfmd_failover()
{
	RESULT=$RESULT_PASS

	# step: stop gfmd on gfmd1
	$GFSERVICE stop-gfmd gfmd1
	[ $? -ne 0 ] && log_warn "$TESTNAME: failed to stop gfmd on gfmd1"

	# step: replicate file
	$GFSERVICE systest::gfarm2fs::replicate_file client1 $GFARM_FILE gfsd2 &
	REP_PID=$!

	# wait a bit for a process starts making files
	sleep $SLEEP_SEC

	# step: promote gfmd on gfmd2
	$GFSERVICE promote-gfmd gfmd2
	[ $? -ne 0 ] && log_warn "$TESTNAME: failed to promote gfmd on gfmd2"

	# step: set gfmd on gfmd1 to be slave
	$GFSERVICE -t $TIMEOUT start-gfmd-slave gfmd1
	[ $? -ne 0 ] && log_warn "$TESTNAME: failed to start gfmd on gfmd1" \
		"as slave"

	wait $REP_PID
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to replicate a file"
		set_result RESULT $RESULT_XFAIL
	fi

	# step: check whether slave gfmd is connected to master
	check_gfmd_connected gfmd1 client1 $RETRY_COUNT $RETRY_INTERVAL
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: gfmd1 is not connected to master"
		set_result RESULT $RESULT_FAIL
	fi

	# step: check number of replicas
	check_replica_num client1 $GFARM_FILE 2 $RETRY_COUNT
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: number of file replica is not enough"
		set_result RESULT $RESULT_XFAIL
	fi

	# step: compare check sum of spool file
	SPOOL_PATH=`$GFSERVICE gfcmd client1 gfspoolpath $GFARM_FILE`
	CHECKSUM_GFSD1=`$GFSERVICE systest::gfarm2fs::spool_file_checksum gfsd1 $SPOOL_PATH`
	if [ X$CHECKSUM_GFSD1 = X ]; then
		log_warn "$TESTNAME: fail to get checksum of a spool file" \
			"on gfsd1"
		set_result RESULT $RESULT_XFAIL
	fi

	CHECKSUM_GFSD2=`$GFSERVICE systest::gfarm2fs::spool_file_checksum gfsd2 $SPOOL_PATH`
	if [ X$CHECKSUM_GFSD2 = X ]; then
		log_warn "$TESTNAME: fail to get checksum of a spool file" \
			"on gfsd2"
		set_result RESULT $RESULT_XFAIL
	fi

	if [ X$CHECKSUM_GFSD1 != X$CHECKSUM ]; then
		log_warn "$TESTNAME: checksum of file is different to original"
		set_result RESULT $RESULT_XFAIL
	fi

	if [ X$CHECKSUM_GFSD2 != X$CHECKSUM ]; then
		log_warn "$TESTNAME: checksum of file is different to original"
		set_result RESULT $RESULT_XFAIL
	fi

	# step: check whether journal seqnum max is same
	check_journal_seqnum_max gfmd1 gfmd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: journal seqnum max is not same"
		set_result RESULT $RESULT_FAIL
	fi

	return $RESULT
}

teardown_rep_in_gfmd_failover()
{
	# cleanup: failback
	failback gfmd1 gfmd2 client1 $TIMEOUT $RETRY_COUNT
	[ $? -ne 0 ] && log_warn "$TESTNAME: failed to make gfmd on gfmd1" \
		"as master"

	# cleanup: remove files
	$GFSERVICE gfcmd client1 gfrm -f $GFARM_FILE

	return $RESULT_PASS
}
