#
# Test case for check behavior when backend db is down in writing files
#
load "gfarm2fs::calc_checksum"
load "gfarm2fs::check_metadata_filesize"

#
# 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 network interface down
#
setup_pgsql_down_in_write()
{
	# define mount point
	MOUNT_POINT=mnt_$TEST_EXEC_ID

	# default parameter
	GFARM_HOME=${GFARM_HOME-"/"}
	FILE_SIZE=${FILE_SIZE-"100M"}
	SLEEP_SEC=${SLEEP_SEC-"3"}

	# miscellaneous parameters
	FILE_PATH=$MOUNT_POINT/$TEST_EXEC_ID

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

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

	# prepare: mount
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 mkdir $MOUNT_POINT
	$GFSERVICE mount client1 $MOUNT_POINT -o modules=subdir \
		-o subdir=$GFARM_HOME

	return $RESULT_PASS
}

test_pgsql_down_in_write()
{
	RESULT=$RESULT_PASS

	# step: make files in background
	$GFSERVICE systest::gfarm2fs::make_file client1 $FILE_PATH $FILE_SIZE &
	MAKE_PID=$!

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

	# step: stop backend-db
	$GFSERVICE stop-backend-db gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to stop backend db on gfmd1"
		return $RESULT_FATAL
	fi

	# step: stop backend-db
	$GFSERVICE stop-backend-db gfmd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to stop backend db on gfmd2"
		return $RESULT_FATAL
	fi

	wait $MAKE_PID
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to make a file"
		set_result RESULT $RESULT_FAIL
	fi

	# step: start backend-db
	$GFSERVICE start-backend-db gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to start backend db on gfmd1"
		return $RESULT_FATAL
	fi

	# step: start backend-db
	$GFSERVICE start-backend-db gfmd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to start backend db on gfmd2"
		return $RESULT_FATAL
	fi

	# step: compare check sum of spool file
	GFARM_FILE=$GFARM_HOME/$TEST_EXEC_ID
	SPOOL_PATH=`$GFSERVICE gfcmd client1 gfspoolpath $GFARM_FILE`
	if [ X$SPOOL_PATH = X ]; then
		log_warn "$TESTNAME: failed to get spool path"
		return $RESULT_FATAL
	fi

	for HOST in `$GFSERVICE gfcmd client1 gfwhere $GFARM_FILE`; do
		HOSTID=`$GFSERVICE systest::gfarm_v2::get_gfsd_hostid_by_name $HOST`
		CHECKSUM_ACTUAL=`$GFSERVICE systest::gfarm2fs::spool_file_checksum $HOSTID \
			 $SPOOL_PATH`
		if [ X$CHECKSUM_ACTUAL = X ]; then
			log_warn "$TESTNAME: fail to get checksum of a spool" \
				"file on $HOST"
			set_result RESULT $RESULT_FAIL
		fi

		if [ X$CHECKSUM_ACTUAL != X$CHECKSUM ]; then
			log_warn "$TESTNAME: checksum of file is different to" \
				"original one"
			set_result RESULT $RESULT_FAIL
		fi
	done

	# step: check metadata filesize
	check_metadata_filesize client1 $GFARM_FILE gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: file size of metadata is not same to" \
			"actual one"
		set_result RESULT $RESULT_FAIL
	fi

	# step: make files
	$GFSERVICE systest::gfarm2fs::make_file client1 $FILE_PATH $FILE_SIZE
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to make a files"
		set_result RESULT $RESULT_FAIL
	fi

	# step: compare check sum of spool file
	SPOOL_PATH=`$GFSERVICE gfcmd client1 gfspoolpath $GFARM_FILE`
	if [ X$SPOOL_PATH = X ]; then
		log_warn "$TESTNAME: failed to get spool path"
		return $RESULT_FATAL
	fi

	for HOST in `$GFSERVICE gfcmd client1 gfwhere $GFARM_FILE`; do
		HOSTID=`$GFSERVICE systest::gfarm_v2::get_gfsd_hostid_by_name $HOST`
		CHECKSUM_ACTUAL=`$GFSERVICE systest::gfarm2fs::spool_file_checksum $HOSTID \
			 $SPOOL_PATH`
		if [ X$CHECKSUM_ACTUAL = X ]; then
			log_warn "$TESTNAME: fail to get checksum of a spool" \
				"file on $HOST"
			set_result RESULT $RESULT_FAIL
		fi

		if [ X$CHECKSUM_ACTUAL != X$CHECKSUM ]; then
			log_warn "$TESTNAME: checksum of file is different to" \
				"original one"
			set_result RESULT $RESULT_FAIL
		fi
	done

	# step: check metadata filesize
	check_metadata_filesize client1 $GFARM_FILE gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: file size of metadata is not same to" \
			"actual one"
		set_result RESULT $RESULT_FAIL
	fi

	return $RESULT
}

teardown_pgsql_down_in_write()
{
	# cleanup: remove files
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 rm -f $FILE_PATH

	# cleanup: unmount
	$GFSERVICE umount client1 $MOUNT_POINT
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 rmdir $MOUNT_POINT

	return $RESULT_PASS
}
