All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] fstest: Crashmonkey rename tests ported to xfstest
@ 2020-04-24 16:51 Arvind Raghavan
  2020-04-26  7:29 ` Amir Goldstein
  0 siblings, 1 reply; 5+ messages in thread
From: Arvind Raghavan @ 2020-04-24 16:51 UTC (permalink / raw)
  To: fstests; +Cc: amir73il, jayashree2912, vijay, Arvind Raghavan

This patch aims to add tests to the xfstest suite to check whether
renamed files recover after a crash. These test cases were generated by
CrashMonkey, a crash-consistency testing framework built at the SASLab
at UT Austin.

This patch batches 37 tests into a single test, each of which creates a
file, renames it, syncs one of the files/parent directories, and ensures
that the synced file/dir is equivalent before and after a crash.

This test takes around 12-15 seconds to run locally and is thus placed
in the 'quick' group.

Signed-off-by: Arvind Raghavan <raghavan.arvind@gmail.com>
---
 tests/generic/484     | 179 ++++++++++++++++++++++++++++++++++++++++++
 tests/generic/484.out |   2 +
 tests/generic/group   |   1 +
 3 files changed, 182 insertions(+)
 create mode 100755 tests/generic/484
 create mode 100644 tests/generic/484.out

diff --git a/tests/generic/484 b/tests/generic/484
new file mode 100755
index 00000000..b27d828d
--- /dev/null
+++ b/tests/generic/484
@@ -0,0 +1,179 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 The University of Texas at Austin.  All Rights Reserved.
+#
+# FS QA Test 484
+#
+# Test case created by CrashMonkey
+#
+# Test if we create a rename a file and persist it that the
+# appropriate files exist.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	_cleanup_flakey
+	cd /
+	rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/dmflakey
+
+# 256MB in byte
+fssize=$((2**20 * 256))
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_scratch_nocheck
+_require_dm_target flakey
+
+# initialize scratch device
+_scratch_mkfs_sized $fssize >> $seqres.full 2>&1
+_require_metadata_journaling $SCRATCH_DEV
+_init_flakey
+
+stat_opt='-c  %n - blocks: %b size: %s inode: %i links: %h'
+
+# Usage: general_stat [--data-only] file1 [--data-only] [file2] ..
+# If the --data-only flag precedes a file, then only that file's
+# data will be printed. If a file is synced, then general_stat
+# should provide identical output before and after a crash.
+general_stat() {
+	local data_only="false"
+	while (( "$#" )); do
+		case $1 in
+			--data-only)
+				data_only="true"
+				;;
+			*)
+				local path="$1"
+				echo "-- $path --"
+				if [ ! -e "$path" ]; then
+					echo "Doesn't exist!"
+				elif [ "$data_only" = "true" ] && [ -d "$path" ]; then
+					echo "Directory Data"
+					[ -z "$(ls -A $path)" ] || ls -1 "$path" | sort
+				elif [ "$data_only" = "true" ]; then
+					echo "File Data"
+					od "$path"
+				elif [ -d "$path" ]; then
+					echo "Directory Metadata"
+					stat "$stat_opt" "$path"
+					echo "Directory Data"
+					[ -z "$(ls -A $path)" ] || ls -1 "$path" | sort
+				else
+					echo "File Metadata"
+					stat "$stat_opt" "$path"
+					echo "File Data"
+					od "$path"
+				fi
+				data_only="false"
+				;;
+		esac
+		shift
+	done
+}
+
+check_consistency()
+{
+	before=$(general_stat "$@")
+	_flakey_drop_and_remount
+	after=$(general_stat "$@")
+
+	if [ "$before" != "$after" ]; then
+		echo -e "Before:\n$before"
+		echo -e "After:\n$after"
+	fi
+
+	# Using _unmount_flakey nondeterministically fails here with
+	# "target is busy". Calling 'sync' doesn't fix the issue. Lazy
+	# unmount waits for lingering processes to exit.
+	$UMOUNT_PROG -l $SCRATCH_MNT
+	_check_scratch_fs $FLAKEY_DEV
+}
+
+clean_dir()
+{
+	_mount_flakey
+	rm -rf $(find $SCRATCH_MNT/* | grep -v "lost+found")
+	$UMOUNT_PROG -l $SCRATCH_MNT
+}
+
+do_fsync_check() {
+	local file="$1"
+	local sync_op="$2"
+
+	if [ $sync_op == "fdatasync" ]; then
+		$XFS_IO_PROG -c "fdatasync" $file
+		check_consistency --data-only $file
+	else
+		$XFS_IO_PROG -c "fsync" $file
+		check_consistency $file
+	fi
+}
+
+# Wraps mv, deletes dest dir if exists.
+rename() {
+	[ -d $1 ] && [ -d $2 ] && rm -rf $2
+	mv $1 $2
+}
+
+function rename_template() {
+	local file1="$1"
+	local file2="$2"
+	local fsync_file="$3"
+	local fsync_command="$4"
+
+	_mount_flakey
+	mkdir -p $(dirname $file1)
+	touch $file1
+	mkdir -p $(dirname $file2)
+	rename $file1 $file2
+	do_fsync_check $fsync_file $fsync_command
+	clean_dir
+}
+
+file1_options=(
+	"$SCRATCH_MNT/A/C/bar"
+	"$SCRATCH_MNT/A/bar"
+	"$SCRATCH_MNT/A/foo"
+	"$SCRATCH_MNT/foo"
+)
+file2_options=(
+	"$SCRATCH_MNT/A/C/bar"
+	"$SCRATCH_MNT/A/bar"
+	"$SCRATCH_MNT/bar"
+)
+
+for file1 in ${file1_options[@]}; do
+	for file2 in ${file2_options[@]}; do
+		[ "$file1" == "$file2" ] && continue
+		to_sync=("$(dirname $file1)" "$(dirname $file2)")
+		uniques=($(for v in ${to_sync[@]}; do echo $v; done | sort -u))
+		for fsync_file in ${uniques[@]}; do
+			for fsync_command in fsync fdatasync; do
+				rename_template $file1 $file2 $fsync_file $fsync_command
+			done
+		done
+	done
+done
+
+# Success, all done
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/generic/484.out b/tests/generic/484.out
new file mode 100644
index 00000000..94f2f0bd
--- /dev/null
+++ b/tests/generic/484.out
@@ -0,0 +1,2 @@
+QA output created by 484
+Silence is golden
diff --git a/tests/generic/group b/tests/generic/group
index 718575ba..987ad2a0 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -486,6 +486,7 @@
 481 auto quick log metadata
 482 auto metadata replay thin
 483 auto quick log metadata
+484 auto quick log metadata
 485 auto quick insert
 486 auto quick attr
 487 auto quick eio
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-04-28  2:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-24 16:51 [PATCH] fstest: Crashmonkey rename tests ported to xfstest Arvind Raghavan
2020-04-26  7:29 ` Amir Goldstein
2020-04-27 22:07   ` Arvind Raghavan
2020-04-27 23:06     ` Arvind Raghavan
2020-04-28  2:23       ` Amir Goldstein

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.