136 lines
3.1 KiB
Bash
Executable File
136 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Mount a gocryptfs filesystem somewhere on /tmp, then run two parallel
|
|
# infinite loops inside that do the following:
|
|
# 1) Extract linux-3.0.tar.gz
|
|
# 2) Verify the md5sums
|
|
# 3) Delete, go to (1)
|
|
#
|
|
# This test is good at discovering inode-related memory leaks because it creates
|
|
# huge numbers of files.
|
|
#
|
|
# See Documentation/extractloop.md for example output.
|
|
|
|
if [[ -z $TMPDIR ]]; then
|
|
TMPDIR=/var/tmp
|
|
export TMPDIR
|
|
fi
|
|
|
|
set -eu
|
|
|
|
# Run at low priority to not annoy the user too much
|
|
renice 19 $$
|
|
|
|
cd "$(dirname "$0")"
|
|
MD5="$PWD/linux-3.0.md5sums"
|
|
MYNAME=$(basename "$0")
|
|
source ../fuse-unmount.bash
|
|
|
|
# Setup dirs
|
|
../dl-linux-tarball.bash
|
|
cd "$TMPDIR"
|
|
EXTRACTLOOP_TMPDIR=$TMPDIR/extractloop_tmpdir
|
|
mkdir -p "$EXTRACTLOOP_TMPDIR"
|
|
CRYPT=$(mktemp -d "$EXTRACTLOOP_TMPDIR/XXX")
|
|
CSV=$CRYPT.csv
|
|
MNT=$CRYPT.mnt
|
|
mkdir "$MNT"
|
|
|
|
check_md5sums() {
|
|
if command -v md5sum > /dev/null ; then
|
|
md5sum --status -c "$1"
|
|
else
|
|
# MacOS / darwin which do not have the md5sum utility
|
|
# installed by default
|
|
echo "Skipping md5sum (not installed). Hint: brew install md5sha1sum"
|
|
fi
|
|
}
|
|
|
|
# Mount
|
|
FSPID=0
|
|
FS=""
|
|
if [ $# -eq 1 ] && [ "$1" == "-encfs" ]; then
|
|
FS=encfs
|
|
echo "Testing EncFS"
|
|
encfs --extpass="echo test" --standard "$CRYPT" "$MNT" > /dev/null
|
|
elif [ $# -eq 1 ] && [ "$1" == "-loopback" ]; then
|
|
FS=loopback
|
|
echo "Testing go-fuse loopback"
|
|
rm -f /tmp/loopback*.memprof
|
|
loopback -memprofile=/tmp/loopback "$MNT" "$CRYPT" &
|
|
FSPID=$(jobs -p)
|
|
disown
|
|
else
|
|
FS=gocryptfs
|
|
echo "Testing gocryptfs"
|
|
gocryptfs -q -init -extpass="echo test" -scryptn=10 "$CRYPT"
|
|
gocryptfs -q -extpass="echo test" -nosyslog -fg "$CRYPT" "$MNT" &
|
|
FSPID=$(jobs -p)
|
|
disown
|
|
#gocryptfs -q -extpass="echo test" -nosyslog -memprofile /tmp/extractloop-mem "$CRYPT" "$MNT"
|
|
fi
|
|
echo "Test dir: $CRYPT"
|
|
# Sleep to make sure the FS is already mounted on MNT
|
|
sleep 1
|
|
cd "$MNT"
|
|
|
|
ln -v -sTf "$CSV" /tmp/extractloop.csv 2> /dev/null || true # fails on MacOS, ignore
|
|
|
|
# Cleanup trap
|
|
# Note: gocryptfs may have already umounted itself because bash relays SIGINT
|
|
# Just ignore unmount errors.
|
|
trap cleanup_exit EXIT
|
|
|
|
cleanup_exit() {
|
|
if [[ $FS == loopback ]]; then
|
|
# SIGUSR1 causes loopback to write the memory profile to disk
|
|
kill -USR1 $FSPID
|
|
fi
|
|
cd /
|
|
rm -Rf "$CRYPT"
|
|
fuse-unmount -z "$MNT" || true
|
|
rmdir "$MNT"
|
|
}
|
|
|
|
loop() {
|
|
ID=$1
|
|
mkdir "$ID"
|
|
cd "$ID"
|
|
|
|
echo "[looper $ID] Starting"
|
|
|
|
N=1
|
|
RSS=0
|
|
while true
|
|
do
|
|
t1=$SECONDS
|
|
tar xf /tmp/linux-3.0.tar.gz --exclude linux-3.0/arch/microblaze/boot/dts/system.dts
|
|
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
# Exclude the one symlink in the tarball - causes problems on MacOS: "Can't set permissions to 0755"
|
|
check_md5sums "$MD5"
|
|
rm -R linux-3.0
|
|
t2=$SECONDS
|
|
delta=$((t2-t1))
|
|
if [[ $FSPID -gt 0 && -d /proc ]]; then
|
|
RSS=$(grep VmRSS /proc/$FSPID/status | tr -s ' ' | cut -f2 -d ' ')
|
|
echo "$N,$SECONDS,$RSS,$delta" >> "$CSV"
|
|
fi
|
|
echo "[looper $ID] Iteration $N done, $delta seconds, RSS $RSS kiB"
|
|
N=$((N+1))
|
|
done
|
|
}
|
|
|
|
memprof() {
|
|
while true; do
|
|
kill -USR1 $FSPID
|
|
sleep 60
|
|
done
|
|
}
|
|
|
|
loop 1 &
|
|
loop 2 &
|
|
if [[ $FS == loopback ]]; then
|
|
memprof &
|
|
fi
|
|
wait
|