Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / tests / oos.sh
index 8519dad..b34727e 100755 (executable)
 #!/bin/bash
 
-export NAME=${NAME:-local}
-export OSTSIZE=10000
+set -e
+#set -vx
 
+LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
+. $LUSTRE/tests/test-framework.sh
+
+export PATH=`dirname $0`/../utils:$PATH
+LFS=${LFS:-lfs}
+LCTL=${LCTL:-lctl}
+MOUNT=${MOUNT:-$1}
 MOUNT=${MOUNT:-/mnt/lustre}
+OOS=$MOUNT/oosfile
 TMP=${TMP:-/tmp}
-
-echo "mnt.."
-sh llmount.sh
-echo "done"
+LOG=$TMP/$(basename $0 .sh).log
 
 SUCCESS=1
 
-FREESPACE=`df |grep $MOUNT|tr -s ' '|cut -d ' ' -f4`
+rm -f $OOS $LOG
+
+sync; sleep 1; sync    # to ensure we get up-to-date statfs info
+
+#$LCTL set_param -n debug=-1
+#$LCTL set_param -n subsystem_debug=0x40a8
 
-rm -f $TMP/oosfile
-dd if=/dev/zero of=$MOUNT/oosfile count=$[$FREESPACE + 1] bs=1k 2>$TMP/oosfile
+#$LCTL clear
+#$LCTL debug_daemon start /r/tmp/debug 1024
 
-RECORDSOUT=`grep "records out" $TMP/oosfile|cut -d + -f1`
+STRIPECOUNT=`$LCTL get_param -n lov.*.activeobd | head -n 1`
+ORIGFREE=`$LCTL get_param -n llite.*.kbytesavail | head -n 1`
+MAXFREE=${MAXFREE:-$((400000 * $STRIPECOUNT))}
+echo STRIPECOUNT=$STRIPECOUNT ORIGFREE=$ORIGFREE MAXFREE=$MAXFREE
+if [ $ORIGFREE -gt $MAXFREE ]; then
+       skip "$0: ${ORIGFREE}kB free gt MAXFREE ${MAXFREE}kB, increase $MAXFREE (or reduce test fs size) to proceed"
+       exit 0
+fi
 
-[ -z "`grep "No space left on device" $TMP/oosfile`" ] && \
-        echo "failed:dd not return ENOSPC" && SUCCESS=0
+export LANG=C LC_LANG=C # for "No space left on device" message
+
+[ -f $LOG ] && error "log file wasn't removed?"
+
+echo BEFORE dd started
+for OSC in `$LCTL get_param -N osc.*-osc-*.kbytesavail | cut -d"." -f1-2`; do
+       AVAIL=`$LCTL get_param -n $OSC.kbytesavail`
+       GRANT=$((`$LCTL get_param -n $OSC.cur_grant_bytes` / 1024))
+       echo -n "$(echo $OSC | cut -d"." -f2) avl=$AVAIL grnt=$GRANT diff=$(($AVAIL - $GRANT))"
+       echo " "
+done
+
+# make sure we stripe over all OSTs to avoid OOS on only a subset of OSTs
+$LFS setstripe $OOS -c $STRIPECOUNT
+if dd if=/dev/zero of=$OOS count=$(($ORIGFREE + 100)) bs=1k 2> $LOG; then
+       echo "ERROR: dd did not fail"
+       SUCCESS=0
+fi
 
-REMAINEDFREE=`df |grep $MOUNT|tr -s ' '|cut -d ' ' -f4`
-[ $[$FREESPACE - $REMAINEDFREE ] -lt $RECORDSOUT ] && \
-        echo "failed:the space written by dd not equal to available space" && \
-        SUCCESS=0 && echo "$FREESPACE - $REMAINEDFREE $RECORDSOUT"
+[ ! -s "$LOG" ] && error "LOG file is empty!"
 
-[ $REMAINEDFREE -gt 100 ] && \
-       echo "failed:too many space left $REMAINEDFREE and -ENOSPC returned" &&\
+if [ "`grep -c 'No space left on device' $LOG`" -ne 1 ]; then
+       echo "ERROR: dd not return ENOSPC"
+       sed "s/^/LOG: /" $LOG
+       SUCCESS=0
+fi
+
+# flush cache to OST(s) so avail numbers are correct
+sync; sleep 1 ; sync
+
+echo AFTER dd
+for OSC in `$LCTL get_param -N osc.*-osc-*.kbytesavail | cut -d"." -f1-2`; do
+       AVAIL=`$LCTL get_param -n $OSC.kbytesavail`
+       GRANT=$((`$LCTL get_param -n $OSC.cur_grant_bytes` / 1024))
+       echo -n "$(echo $OSC | cut -d"." -f2) avl=$AVAIL grnt=$GRANT diff=$(($AVAIL - $GRANT))"
+       [ $(($AVAIL - $GRANT)) -lt 400 ] && OSCFULL=full && echo -n " FULL"
+       echo " "
+done
+
+if [ -z "$OSCFULL" ]; then
+       echo "no OSTs are close to full"
+       $LCTL get_param "osc.*-osc-*.kbytesavail"
+       $LCTL get_param "osc.*-osc-*.cur*"
+       SUCCESS=0
+fi
+
+RECORDSOUT=`grep "records out" $LOG | cut -d + -f1`
+FILESIZE=`ls -l $OOS | awk '{ print $5 }'`
+if [ -z "$RECORDSOUT" ]; then
+       echo "ERROR: no blocks written by dd?"
+       sed "s/^/LOG: /" $LOG
+       SUCCESS=0
+elif [ "$RECORDSOUT" -ne $((FILESIZE / 1024)) ]; then
+       echo "ERROR: blocks written by dd not equal to the size of file"
        SUCCESS=0
+fi
 
-FILESIZE=`ls -l $MOUNT/oosfile|tr -s ' '|cut -d ' ' -f5`
-[ $RECORDSOUT -ne $[$FILESIZE/1024] ] && \
-        echo "failed:the space written by dd not equal to the size of file" && \
-        SUCCESS=0
+#$LCTL debug_daemon stop
 
-[ $SUCCESS -eq 1 ] && echo "Success!"
+echo LOG file
+cat $LOG
+rm -f $OOS
+sync; sleep 1; sync
 
-rm -f $MOUNT/oosfile*
-rm -f $TMP/oosfile
+sync; sleep 3; sync
 
-echo ""
-echo "cln.."
-sh llmountcleanup.sh
+if [ $SUCCESS -eq 1 ]; then
+       echo "Success!"
+       rm -f $LOG
+else
+       exit 1
+fi