--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+create(){
+ echo "asdf" > "$DIR/$file/$file/$file"
+ #echo -n "d"
+}
+
+cleanup() {
+ echo "mkdir $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ mkdir -p "$DIR/$file/$file/" 2> /dev/null
+ create 2> /dev/null
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 1000 ]; then
+ echo "mkdir $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+concat(){
+ cat "$DIR/$file" >> "$DIR/$new_file"
+ cat "$DIR/$file/$file/$file" >> "$DIR/$new_file"
+ #echo -n "C"
+}
+
+cleanup() {
+ echo "concat $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ new_file=$((RANDOM % MAX_FILES))
+ concat 2> /dev/null
+ COUNT=$((COUNT + 2))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 1000 ]; then
+ echo "concat $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+SIZE=${SIZE:-$((256 * 1024))}
+
+NUM_CREATED=0
+
+create() {
+ CHUNKSIZE=$(((RANDOM % 8) + 16))
+ CHUNKS=$((RANDOM * SIZE / 32768 / $CHUNKSIZE))
+ NUM_CREATED=$((NUM_CREATED + 1))
+ dd if=/dev/zero of="$DIR/$file" bs=$CHUNKSIZE count=$CHUNKS
+ #echo -n "f"
+}
+
+cleanup() {
+ echo "write $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ create 2> /dev/null
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 100 ]; then
+ echo "write $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+cleanup() {
+ echo "link $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ new_file=$((RANDOM % MAX_FILES))
+ ln $file "$DIR/$new_file" 2> /dev/null
+ #echo -n "l"
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 1000 ]; then
+ echo "link $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+cleanup() {
+ echo "ls -R $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ ls -R "$DIR/" > /dev/null 2> /dev/null &
+ #echo -n "L"
+
+ wait
+ sleep 1
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 20 ]; then
+ echo "ls -R $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+cleanup() {
+ echo "rename $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ new_file=$((RANDOM % MAX_FILES))
+ mv "$DIR/$file" "$DIR/$new_file" 2> /dev/null
+ #echo -n "n"
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 1000 ]; then
+ echo "rename $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+cleanup() {
+ echo "rm -r $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ rm -rf "$DIR/$file" 2> /dev/null
+ #echo -n "u"
+ sleep 1
+ COUNT=$((COUNT + 1))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 20 ]; then
+ echo "rm -r $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+PRT_INTVL=${PRT_INTVL:-10}
+
+DIR=$1
+MAX_FILES=$2
+
+cleanup() {
+ echo "symlink $COUNT ops"
+}
+
+trap cleanup EXIT
+
+LAST_TIME=$SECONDS
+COUNT=0
+LAST_COUNT=0
+while /bin/true ; do
+ file=$((RANDOM % MAX_FILES))
+ new_file=$((RANDOM % MAX_FILES))
+ ln -s $file "$DIR/$new_file" 2> /dev/null
+ ln -s $file/$file/$file "$DIR/$new_file" 2> /dev/null
+ #echo -n "s"
+ COUNT=$((COUNT + 2))
+ if [ $((SECONDS - LAST_TIME)) -gt $PRT_INTVL -o $LAST_COUNT -gt 1000 ]; then
+ echo "symlink $COUNT ops"
+ LAST_COUNT=0
+ LAST_TIME=$SECONDS
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+MAX_FILES=${MAX_FILES:-20}
+DIR=${DIR:-$1}
+CLEANUP_WAIT=${CLEANUP_WAIT:-100}
+CHECK_INTVL=${CHECK_INTVL:-5}
+
+DURATION=${DURATION:-$2}
+DURATION=${DURATION:-$((60*5))}
+export PRT_INTVL=${PRT_INTVL:-10}
+
+NUM_THREADS=${NUM_THREADS:-$3}
+NUM_CPUS=$(grep -c '^processor' /proc/cpuinfo)
+[ $NUM_CPUS -lt 1 ] && NUM_CPUS=1
+NUM_THREADS=${NUM_THREADS:-$((NUM_CPUS * 2))}
+
+PROGNAME=`basename $0`
+
+if [ -z "$DIR" ]; then
+ echo "usage: $PROGNAME {dir} [duration] [num_threads]" 1>&2
+ exit 1
+fi
+
+if [ -e "$DIR" -a ! -d "$DIR" ]; then
+ echo "$0: '$DIR' and '`basename $DIR`' are not directories"
+ exit 1
+fi
+
+if [ ! -d "$DIR" ] && ! mkdir "$DIR"; then
+ echo "$PROGNAME: FAIL: error creating '$DIR'"
+ exit 1
+fi
+
+PROGLIST="file_create.sh dir_create.sh file_rm.sh file_rename.sh file_link.sh \
+ file_symlink.sh file_list.sh file_concat.sh"
+
+# problems: rename + dir_create: ebusy umount lower
+# problems: rename + create/concat: oops umount lower
+# problems: rename + dir_create + concat: ebuzy umount lower
+
+# when all are on, we get dozens of extra BC refs; use rwsem=write in rename
+
+PROGLIST=""
+PROGLIST="$PROGLIST file_rename.sh"
+PROGLIST="$PROGLIST file_rm.sh"
+PROGLIST="$PROGLIST file_list.sh"
+PROGLIST="$PROGLIST file_create.sh"
+PROGLIST="$PROGLIST file_concat.sh"
+PROGLIST="$PROGLIST dir_create.sh"
+PROGLIST="$PROGLIST file_symlink.sh"
+PROGLIST="$PROGLIST file_link.sh"
+
+
+echo PROGLIST:$PROGLIST;sleep 1
+
+racer_running()
+{
+ RUNNING=1
+ if [ "$1" = "-r" ]; then # report if running
+ SHOW_RUNNING=echo
+ SHOW_STOPPED=:
+ shift
+ else
+ SHOW_RUNNING=:
+ SHOW_STOPPED=echo
+ fi
+
+ for PROG in $PROGLIST; do
+ killall -0 -q $PROG && RUNNING=0 &&
+ $SHOW_RUNNING "$PROGNAME: $PROG still running" || \
+ $SHOW_STOPPED "$PROGNAME: $PROG no longer running"
+ done
+
+ return $RUNNING
+}
+
+racer_cleanup()
+{
+ echo "$PROGNAME: cleaning up"
+ for PROG in $PROGLIST; do
+ killall -q $PROG
+ done
+ trap 0
+}
+
+echo "$PROGNAME: run for ${DURATION}s with $NUM_THREADS threads. CTRL-C to exit"
+trap racer_cleanup 2
+
+cd `dirname $0`
+for N in `seq 1 $NUM_THREADS`; do
+ for PROG in $PROGLIST; do
+ eval ./$PROG "$DIR" $MAX_FILES $N 2>/dev/null &
+ done
+done
+
+RAN=0
+while racer_running && [ $RAN -lt $DURATION ]; do
+ sleep $CHECK_INTVL
+ RAN=$((RAN + CHECK_INTVL))
+ echo "$PROGNAME: running ${RAN}s (of ${DURATION}s) at `date` (`date +%s`)"
+done
+racer_cleanup
+
+# Check our to see whether our test DIR is still available.
+df "$DIR"
+RC=$?
+if [ $RC -eq 0 ]; then
+ echo "$PROGNAME: we survived for $RAN seconds."
+else
+ echo "$PROGNAME: FAIL: 'df $DIR' failed with $RC."
+ exit $RC
+fi
+
+WAITED=0
+while racer_running -r && [ $WAITED -lt $CLEANUP_WAIT ]; do
+ sleep $CHECK_INTVL
+ WAITED=$((WAITED + CHECK_INTVL))
+done
+if [ $WAITED -ge $CLEANUP_WAIT ]; then
+ echo "$PROGNAME: FAIL: processes still running after ${CLEANUP_WAIT}s"
+ exit 2
+fi
+/bin/rm -f /var/tmp/s.out
+STRACE="strace -e file -o /var/tmp/s.out.$$"
+$STRACE rm -rf "$DIR"
+RC=$?
+if [ $RC -eq 0 ]; then
+ echo "$PROGNAME: we cleaned up '$DIR' successfully."
+else
+ echo "$PROGNAME: FAIL: 'rm -rf $DIR' failed with $RC.\a"
+ exit $RC
+ sync
+ echo "SLEEP 10... then try again...\a"
+ sleep 10
+ sync
+ rm -rf "$DIR"
+ RC=$?
+ echo RC=$RC
+fi
+
+exit $RC
--- /dev/null
+#!/bin/bash
+
+MAX_FILES=${MAX_FILES:-20}
+DIR=${DIR:-$1}
+CLEANUP_WAIT=${CLEANUP_WAIT:-100}
+CHECK_INTVL=${CHECK_INTVL:-5}
+
+DURATION=${DURATION:-$2}
+DURATION=${DURATION:-$((60*5))}
+export PRT_INTVL=${PRT_INTVL:-10}
+
+NUM_THREADS=${NUM_THREADS:-$3}
+NUM_CPUS=$(grep -c '^processor' /proc/cpuinfo)
+[ $NUM_CPUS -lt 1 ] && NUM_CPUS=1
+NUM_THREADS=${NUM_THREADS:-$((NUM_CPUS * 2))}
+
+PROGNAME=`basename $0`
+
+if [ -z "$DIR" ]; then
+ echo "usage: $PROGNAME {dir} [duration] [num_threads]" 1>&2
+ exit 1
+fi
+
+if [ -e "$DIR" -a ! -d "$DIR" ]; then
+ echo "$0: '$DIR' and '`basename $DIR`' are not directories"
+ exit 1
+fi
+
+if [ ! -d "$DIR" ] && ! mkdir "$DIR"; then
+ echo "$PROGNAME: FAIL: error creating '$DIR'"
+ exit 1
+fi
+
+PROGLIST="file_create.sh dir_create.sh file_rm.sh file_rename.sh file_link.sh \
+ file_symlink.sh file_list.sh file_concat.sh"
+
+racer_running()
+{
+ RUNNING=1
+ if [ "$1" = "-r" ]; then # report if running
+ SHOW_RUNNING=echo
+ SHOW_STOPPED=:
+ shift
+ else
+ SHOW_RUNNING=:
+ SHOW_STOPPED=echo
+ fi
+
+ for PROG in $PROGLIST; do
+ killall -0 -q $PROG && RUNNING=0 &&
+ $SHOW_RUNNING "$PROGNAME: $PROG still running" || \
+ $SHOW_STOPPED "$PROGNAME: $PROG no longer running"
+ done
+
+ return $RUNNING
+}
+
+racer_cleanup()
+{
+ echo "$PROGNAME: cleaning up"
+ for PROG in $PROGLIST; do
+ killall -q $PROG
+ done
+ trap 0
+}
+
+echo "$PROGNAME: run for ${DURATION}s with $NUM_THREADS threads. CTRL-C to exit"
+trap racer_cleanup 2
+
+cd `dirname $0`
+for N in `seq 1 $NUM_THREADS`; do
+ for PROG in $PROGLIST; do
+ eval ./$PROG "$DIR" $MAX_FILES $N 2>/dev/null &
+ done
+done
+
+RAN=0
+while racer_running && [ $RAN -lt $DURATION ]; do
+ sleep $CHECK_INTVL
+ RAN=$((RAN + CHECK_INTVL))
+ echo "$PROGNAME: running ${RAN}s at `date` (`date +%s`)"
+done
+racer_cleanup
+
+# Check our to see whether our test DIR is still available.
+df "$DIR"
+RC=$?
+if [ $RC -eq 0 ]; then
+ echo "$PROGNAME: we survived for $RAN seconds."
+else
+ echo "$PROGNAME: FAIL: 'df $DIR' failed with $RC."
+ exit $RC
+fi
+
+WAITED=0
+while racer_running -r && [ $WAITED -lt $CLEANUP_WAIT ]; do
+ sleep $CHECK_INTVL
+ WAITED=$((WAITED + CHECK_INTVL))
+done
+if [ $WAITED -ge $CLEANUP_WAIT ]; then
+ echo "$PROGNAME: FAIL: processes still running after ${CLEANUP_WAIT}s"
+ exit 2
+fi
+
+rm -rf "$DIR"
+RC=$?
+if [ $RC -eq 0 ]; then
+ echo "$PROGNAME: we cleaned up '$DIR' successfully."
+else
+ echo "$PROGNAME: FAIL: 'rm -rf $DIR' failed with $RC."
+fi
+exit $RC