[Ocfs2-test-devel] Check fsck directory compression
Goldwyn Rodrigues
rgoldwyn at gmail.com
Mon Aug 31 17:48:05 PDT 2009
After incorporating review comments from Tristan.
The test sequence is:
1. Create files under directories
2. Remove alternate files from the directories
3. Get recursive directory listing and store in listing1
4. Perform fsck -D
5. Get recursive directory listing and store in listing2
6. Compare listing1 and listing2 to check if any files are missing.
---
diff --git a/programs/fsck-tests/fsck-test.sh b/programs/fsck-tests/fsck-test.sh
index 2edbd7b..1bbf383 100755
--- a/programs/fsck-tests/fsck-test.sh
+++ b/programs/fsck-tests/fsck-test.sh
@@ -130,6 +130,8 @@ function internal_setup()
BASE_DIR=${O2TDIR}
TMP_DIR="/tmp/${0##*/}-$$"
mkdir -p "$TMP_DIR"
+ MOUNT_POINT="/tmp/mp.$$"
+ mkdir -p "$MOUNT_POINT"
check_exec_or_exit cat mktemp wc yes
}
@@ -148,6 +150,10 @@ function internal_cleanup()
rm -rf "$TMP_DIR"
unset TMP_DIR
fi
+ if [ -d "$MOUNT_POINT" ]; then
+ rm -rf "$MOUNT_POINT"
+ unset MOUNT_POINT
+ fi
}
#
@@ -169,6 +175,7 @@ function usage()
--with-fswreck=PROGRAM use the PROGRAM as fswreck
--with-mkfs=PROGRAM use the PROGRAM as mkfs.ocfs2
--with-corrupt=CORRUPTS use specified fswreck corrupt code
+ --with-mount=PROGRAM use the PROGRAM as mount.ocfs2
Examples:
@@ -185,6 +192,8 @@ DEVICE=""
MKFS_BIN=""
FSCK_BIN=""
FSWRECK_BIN=""
+MOUNT_BIN=""
+UMOUNT_BIN=""
declare -i NUM_OF_TESTS=0
declare -i NUM_OF_PASS=0
declare -i NUM_OF_FAIL=0
@@ -214,6 +223,12 @@ function ext_setup()
[ -z "$MKFS_BIN" ] && MKFS_BIN="$(which mkfs.ocfs2 2>/dev/null)"
[ -x "$MKFS_BIN" ]
exit_if_bad "$?" "Command \"mkfs.ocfs2\" not found"
+ [ -z "$MOUNT_BIN" ] && MOUNT_BIN="$(which mount.ocfs2 2>/dev/null)"
+ [ -x "$MOUNT_BIN" ]
+ exit_if_bad "$?" "Command \"mount.ocfs2\" not found"
+ [ -z "$UMOUNT_BIN" ] && UMOUNT_BIN="$(which umount 2>/dev/null)"
+ [ -x "$UMOUNT_BIN" ]
+ exit_if_bad "$?" "Command \"umount\" not found"
}
CURRENT_TEST=""
@@ -372,6 +387,160 @@ function gen_fs_features()
}
+# $1 number of directories
+# $2 number of files in each directory
+
+function create_files()
+{
+ local RETVAL=0
+ if [[ "$#" -ne "2" ]]; then
+ echo "Not enough arguments for create_files"
+ return 1
+ fi
+
+ local numdirs=$1
+ local numfiles=$2
+ for i in `seq 1 $numdirs`; do
+ mkdir $MOUNT_POINT/d.$i 2>"$STDERR"
+ RETVAL=$?
+ test_fail_if_bad "$RETVAL" "mkdir d.$i failed" || return $RETVAL
+
+ for j in `seq 1 $numfiles`; do
+ touch $MOUNT_POINT/d.$i/f.$j 2>"$STDERR"
+ RETVAL=$?
+ test_fail_if_bad "$RETVAL" "touch d.$i/f.$j failed" || return $RETVAL
+ done
+ done
+ return 0
+}
+
+# $1 interval for directories to delete, same interval used for files and
+# directoriss
+# $2 total number of directories
+function rm_files()
+{
+ local RETVAL=0
+ if [[ "$#" -ne "2" ]]; then
+ echo "Not enough arguments for create_files"
+ return 1
+ fi
+ local interval=$1
+ local numdirs=$2
+ for i in `seq 1 $interval $numdirs`; do
+ rm -Rf $MOUNT_POINT/d.$i 2>"$STDERR"
+ RETVAL=$?
+ test_fail_if_bad "$RETVAL" "dir d.$i rm failed" || return $RETVAL
+ done
+ for i in `ls -1 $MOUNT_POINT | grep -v "lost+found"`; do
+ for j in `seq 1 $interval $numdirs`; do
+ rm $MOUNT_POINT/$i/f.$j 2>"$STDERR"
+ RETVAL=$?
+ test_fail_if_bad "$RETVAL" "file rm $i/f.$j failed" || return $RETVAL
+ done
+ done
+ return 0
+}
+
+
+# $1 Disk size, should be ``small'', ``medium'' or ``large''.
+function compress_dirs_test()
+{
+ local disk_size="$1"
+
+ # Small disk
+ local -a mkfs_profile_small=(
+ 1024 # block size
+ 4096 # cluster size
+ 4 # number of node solts
+ "4M" # journal
+ 262144 # blocks count
+ );
+ # Medium disk
+ local -a mkfs_profile_medium=(
+ 4096 # block size
+ 4096 # cluster size
+ 4 # number of node solts
+ "16M" # journal
+ 1048576 # blocks count
+ );
+ # Large disk
+ local -a mkfs_profile_large=(
+ 4096 # block size
+ 131072 # cluster size
+ 4 # number of node solts
+ "64M" # journal
+ 16777216 # blocks count
+ );
+
+ local v="mkfs_profile_${disk_size}[@]"
+ local -a mkfs_profile=("${!v}")
+
+ test_setup "Compress dirs test"
+
+ if [ 0 -eq "${#mkfs_profile[@]}" ]
+ then
+ test_broken "Unknown disk size"
+ return
+ fi
+
+ dd if=/dev/zero of=$DEVICE bs=1M count=4 &>"$STDOUT"
+ test_info "dd if=/dev/zero of=$DEVICE bs=1M count=4"
+ test_fail_if_bad "$?" "dd failed" || return
+
+ test_info mkfs.ocfs2 ${FS_FEATURES_ARGS} -b "${mkfs_profile[0]}" -C "${mkfs_profile[1]}" \
+ -N "${mkfs_profile[2]}" -J "size=${mkfs_profile[3]}" \
+ "$DEVICE" "${mkfs_profile[4]}"
+ yes | "$MKFS_BIN" ${FS_FEATURES_ARGS} -b "${mkfs_profile[0]}" -C "${mkfs_profile[1]}" \
+ -N "${mkfs_profile[2]}" -J "size=${mkfs_profile[3]}" \
+ "$DEVICE" "${mkfs_profile[4]}" &>"$STDOUT"
+
+ test_info "mount $DEVICE $MOUNT_POINT"
+ "$MOUNT_BIN" $DEVICE $MOUNT_POINT &>"$STDOUT"
+ test_fail_if_bad "$?" "mount failed" || return
+
+ local num_dirs=20
+ local num_files=100
+ local interval=2
+ if [[ "disk_size" == "large" ]]; then
+ num_dirs=100
+ num_files=5000
+ elif [[ "$disk_size" == "medium" ]]; then
+ num_dirs=50
+ num_files=1000
+ fi
+ test_info "Creating files num_dirs=$num_dirs num_files=$num_files"
+ create_files $num_dirs $num_files
+ test_fail_if_bad "$?" "creating files failed" || return
+ test_info "Removing files num_dirs=$num_dirs interval=$interval"
+ rm_files $interval $num_dirs
+ test_fail_if_bad "$?" "removing files/dirs failed" || return
+
+
+ ls -R $MOUNT_POINT > $TMP_DIR/listing1
+
+ test_info "umount $DEVICE $MOUNT_POINT"
+ "$UMOUNT_BIN" $DEVICE &>"$STDOUT"
+ test_fail_if_bad "$?" "umount failed" || return
+
+ test_info "fsck.ocfs2 -Dfy $DEVICE"
+ "$FSCK_BIN" -fy "$DEVICE" >"$STDOUT"
+ test_fail_if_bad "$?" "fsck failed" || return
+
+ test_info "mount $DEVICE $MOUNT_POINT"
+ "$MOUNT_BIN" $DEVICE $MOUNT_POINT &>"$STDOUT"
+ test_fail_if_bad "$?" "mount failed" || return
+
+ ls -R $MOUNT_POINT > $TMP_DIR/listing2
+ cmp $TMP_DIR/listing1 $TMP_DIR/listing2 &>/dev/null
+ test_fail_if_bad "$?" "files are different" || return
+
+ test_info "umount $DEVICE $MOUNT_POINT"
+ "$UMOUNT_BIN" $DEVICE &>"$STDOUT"
+ test_fail_if_bad "$?" "umount failed" || return
+
+ test_pass
+}
+
# $2 Disk size, should be ``small'', ``medium'' or ``large''.
function corrupt_test()
{
@@ -530,6 +699,9 @@ do
"--with-corrupt="*)
CORRUPT="${1#--with-corrupt=}"
;;
+ "--with-mount="*)
+ MOUNT_BIN="${1#--with-mount=}"
+ ;;
*)
DEVICE="$1"
;;
@@ -540,14 +712,14 @@ done
if [ ! -d ${LOG_DIR} ]; then
mkdir -p ${LOG_DIR}
if [ $? -ne 0 ]; then
- echo -e "Failed to create directory ${LOG_DIR}\n";
- exit(1);
- fi;
-fi;
+ echo -e "Failed to create directory ${LOG_DIR}\n"
+ exit 1
+ fi
+fi
LOGFILE=${LOG_DIR}/fsck-test.log
if [ -f ${LOGFILE} ]; then
mv ${LOGFILE} `dirname ${LOGFILE}`/`date +%F-%H-%M-%S`-`basename ${LOGFILE}`
-fi;
+fi
#
if [ "" = "$CORRUPT" ]
then
@@ -561,5 +733,6 @@ check_root_or_exit
ext_setup
smoke_test
basic_test
+compress_dirs_test $DISK_SIZE
#corrupt_test 22
#corrupt_test 36
More information about the Ocfs2-test-devel
mailing list