libgocryptfs/tests/stress_tests/fsstress-gocryptfs.bash

112 lines
2.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Mount a go-fuse loopback filesystem in /tmp and run fsstress against it
# in an infinite loop, only exiting on errors.
#
# When called as "fsstress-gocryptfs.bash", a gocryptfs filesystem is tested
# instead.
#
# This test used to fail on older go-fuse versions after a few iterations with
# errors like this:
# "rm: cannot remove /tmp/b/fsstress.2/pd/d1XXX/f4a: No such file or directory"
#
# Nowadays it should pass an indefinite number of iterations.
set -eu
# Init variables to default values if unset or empty
export TMPDIR=${TMPDIR:-/var/tmp}
DEBUG=${DEBUG:-0}
cd "$(dirname "$0")"
MYNAME=$(basename "$0")
source ../fuse-unmount.bash
# fsstress binary
FSSTRESS=/opt/fuse-xfstests/ltp/fsstress
if [[ ! -x $FSSTRESS ]]
then
echo "$MYNAME: fsstress binary not found at $FSSTRESS"
echo "Please clone and compile https://github.com/rfjakob/fuse-xfstests"
exit 1
fi
# Backing directory
DIR=$(mktemp -d "$TMPDIR/$MYNAME.XXX")
# Mountpoint
MNT="$DIR.mnt"
mkdir "$MNT"
# Set the GOPATH variable to the default if it is empty
GOPATH=$(go env GOPATH)
# Clean up old mounts
for i in $(mount | cut -d" " -f3 | grep "$TMPDIR/$MYNAME") ; do
fusermount -u "$i"
done
# FS-specific compile and mount
if [[ $MYNAME = fsstress-loopback.bash ]]; then
echo -n "Recompile go-fuse loopback: "
cd "$GOPATH/src/github.com/hanwen/go-fuse/example/loopback"
git describe
go build && go install
OPTS="-q"
if [[ $DEBUG -eq 1 ]]; then
OPTS="-debug"
fi
$GOPATH/bin/loopback $OPTS "$MNT" "$DIR" &
disown
elif [[ $MYNAME = fsstress-gocryptfs.bash ]]; then
echo "Recompile gocryptfs"
cd "$GOPATH/src/github.com/rfjakob/gocryptfs"
./build.bash # also prints the version
$GOPATH/bin/gocryptfs -q -init -extpass "echo test" -scryptn=10 "$DIR"
$GOPATH/bin/gocryptfs -q -extpass "echo test" -nosyslog -fusedebug="$DEBUG" "$DIR" "$MNT"
elif [[ $MYNAME = fsstress-encfs.bash ]]; then
encfs --extpass "echo test" --standard "$DIR" "$MNT"
else
echo "Unknown mode: $MYNAME"
exit 1
fi
sleep 0.5
echo -n "Waiting for mount: "
while ! grep "$(basename "$MNT") fuse" /proc/self/mounts > /dev/null
do
sleep 1
echo -n x
done
echo " ok: $MNT"
# Cleanup trap
trap "kill %1 ; cd / ; fuse-unmount -z $MNT ; rm -rf $DIR $MNT" EXIT
echo "Starting fsstress loop"
N=1
while true
do
echo "$N ................................. $(date)"
mkdir "$MNT/fsstress.1"
echo -n " fsstress.1 "
$FSSTRESS -r -m 8 -n 1000 -d "$MNT/fsstress.1" &
wait
mkdir "$MNT/fsstress.2"
echo -n " fsstress.2 "
$FSSTRESS -p 20 -r -m 8 -n 1000 -d "$MNT/fsstress.2" &
wait
mkdir "$MNT/fsstress.3"
echo -n " fsstress.3 "
$FSSTRESS -p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \
-f rename=30 -f stat=30 -f unlink=30 -f truncate=20 -m 8 \
-n 1000 -d "$MNT/fsstress.3" &
wait
echo " rm"
rm -Rf "$MNT"/*
N=$((N+1))
done