Whamcloud - gitweb
- landed b_hd_cray_merge3
[fs/lustre-release.git] / lustre / tests / sanity-fid.sh
1 #!/bin/bash
2 set -e
3
4 ONLY=${ONLY:-"$*"}
5 # bug number for skipped test: 
6 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
7 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
8
9 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
10
11 SRCDIR=`dirname $0`
12 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
13 export SECURITY=${SECURITY:-"null"}
14
15 TMP=${TMP:-/tmp}
16 FSTYPE=${FSTYPE:-ext3}
17
18 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
19 CREATETEST=${CREATETEST:-createtest}
20 LFS=${LFS:-lfs}
21 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
22 LFIND=${LFIND:-"$LFS find"}
23 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
24 LCTL=${LCTL:-lctl}
25 MCREATE=${MCREATE:-mcreate}
26 OPENFILE=${OPENFILE:-openfile}
27 OPENUNLINK=${OPENUNLINK:-openunlink}
28 TOEXCL=${TOEXCL:-toexcl}
29 TRUNCATE=${TRUNCATE:-truncate}
30 MUNLINK=${MUNLINK:-munlink}
31 SOCKETSERVER=${SOCKETSERVER:-socketserver}
32 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
33 IOPENTEST1=${IOPENTEST1:-iopentest1}
34 IOPENTEST2=${IOPENTEST2:-iopentest2}
35 PTLDEBUG=${PTLDEBUG:-0}
36 MODE=${MODE:mds}
37
38 . krb5_env.sh
39
40 if [ $UID -ne 0 ]; then
41         RUNAS_ID="$UID"
42         RUNAS=""
43 else
44         RUNAS_ID=${RUNAS_ID:-500}
45         RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
46 fi
47
48 if [ `using_krb5_sec $SECURITY` == 'y' ] ; then
49     start_krb5_kdc || exit 1
50     if [ $RUNAS_ID -ne $UID ]; then
51         $RUNAS ./krb5_refresh_cache.sh || exit 2
52     fi
53 fi
54
55 export NAME=${NAME:-local}
56
57 SAVE_PWD=$PWD
58
59 clean() {
60         echo -n "cln.."
61         sh llmountcleanup.sh > /dev/null || exit 20
62         I_MOUNTED=no
63 }
64 CLEAN=${CLEAN:-clean}
65
66 start() {
67         echo -n "mnt.."
68         sh llrmount.sh > /dev/null || exit 10
69         I_MOUNTED=yes
70         echo "done"
71 }
72 START=${START:-start}
73
74 log() {
75         echo "$*"
76         lctl mark "$*" 2> /dev/null || true
77 }
78
79 trace() {
80         log "STARTING: $*"
81         strace -o $TMP/$1.strace -ttt $*
82         RC=$?
83         log "FINISHED: $*: rc $RC"
84         return 1
85 }
86 TRACE=${TRACE:-""}
87
88 check_kernel_version() {
89         VERSION_FILE=/proc/fs/lustre/kernel_version
90         WANT_VER=$1
91         [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
92         GOT_VER=`cat $VERSION_FILE`
93         [ $GOT_VER -ge $WANT_VER ] && return 0
94         log "test needs at least kernel version $WANT_VER, running $GOT_VER"
95         return 1
96 }
97
98 run_one() {
99         if ! mount | grep -q $DIR; then
100                 $START
101         fi
102         echo $PTLDEBUG >/proc/sys/portals/debug 
103         log "== test $1: $2"
104         export TESTNAME=test_$1
105         test_$1 || error "test_$1: exit with rc=$?"
106         unset TESTNAME
107         pass
108         cd $SAVE_PWD
109         $CLEAN
110 }
111
112 build_test_filter() {
113         for O in $ONLY; do
114             eval ONLY_${O}=true
115         done
116         for E in $EXCEPT $ALWAYS_EXCEPT; do
117             eval EXCEPT_${E}=true
118         done
119 }
120
121 _basetest() {
122     echo $*
123 }
124
125 basetest() {
126     IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
127 }
128
129 run_test() {
130          base=`basetest $1`
131          if [ "$ONLY" ]; then
132                  testname=ONLY_$1
133                  if [ ${!testname}x != x ]; then
134                         run_one $1 "$2"
135                         return $?
136                  fi
137                  testname=ONLY_$base
138                  if [ ${!testname}x != x ]; then
139                          run_one $1 "$2"
140                          return $?
141                  fi
142                  echo -n "."
143                  return 0
144         fi
145         testname=EXCEPT_$1
146         if [ ${!testname}x != x ]; then
147                  echo "skipping excluded test $1"
148                  return 0
149         fi
150         testname=EXCEPT_$base
151         if [ ${!testname}x != x ]; then
152                  echo "skipping excluded test $1 (base $base)"
153                  return 0
154         fi
155         run_one $1 "$2"
156         return $?
157 }
158
159 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
160
161 error() { 
162         log "FAIL: $@"
163         if [ "$SANITYLOG" ]; then
164                 echo "FAIL: $TESTNAME $@" >> $SANITYLOG
165         else
166                 exit 1
167         fi
168 }
169
170 pass() { 
171         echo PASS
172 }
173
174 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
175 if [ -z "$MOUNT" ]; then
176         sh llmount.sh
177         MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
178         [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
179         I_MOUNTED=yes
180 fi
181
182 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
183
184 DIR=${DIR:-$MOUNT}
185 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
186
187 rm -rf $DIR/[Rdfs][1-9]*
188
189 build_test_filter
190
191 echo preparing for tests involving mounts
192 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
193 touch $EXT2_DEV
194 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
195
196 test_1a() {
197         rm -fr $DIR/1a0 > /dev/null
198         MDS=`find /proc/fs/lustre/mds/* -type d | head -n1 | sed 's/.*\///'`
199         [ -z "$MDS" ] && {
200             echo "no MDS available, skipping test"
201             return 0
202         }
203         count=`find /proc/fs/lustre/mds/* -type d | wc -l`
204         [ $count -gt 1 ] && {
205             echo "more than 1 MDS is found, skipping test"
206             return 0
207         }
208
209         mkdir $DIR/1a0 || error
210         old_last_fid=`cat /proc/fs/lustre/mds/$MDS/last_fid`
211         createmany -o $DIR/1a0/f 5000
212         new_last_fid=`cat /proc/fs/lustre/mds/$MDS/last_fid`
213         
214         diff=$(($new_last_fid-$old_last_fid))
215         [ $diff -ne 5000 ] && {
216             echo "invalid fid management on $MDS: \
217                 old $old_last_fid, new $new_last_fid"
218             error
219         }
220         rm -fr $DIR/1a0 || error
221 }
222 run_test 1a " fid managing correctness ============="
223
224 test_1b() {
225         rm -fr $DIR/1b0 > /dev/null
226         MDS=`find /proc/fs/lustre/mds/* -type d | head -n1 | sed 's/.*\///'`
227         [ -z "$MDS" ] && {
228             echo "no MDS available, skipping test"
229             return 0
230         }
231         count=`find /proc/fs/lustre/mds/* -type d | wc -l`
232         [ $count -gt 1 ] && {
233             echo "more than 1 MDS is found, skipping test"
234             return 0
235         }
236
237         mkdir $DIR/1b0 || error
238         createmany -o $DIR/1b0/f 5000
239         old_last_fid=`cat /proc/fs/lustre/mds/$MDS/last_fid`
240         rm -fr $DIR/1b0/f
241         new_last_fid=`cat /proc/fs/lustre/mds/$MDS/last_fid`
242         
243         [ $new_last_fid -ne $old_last_fid ] && {
244             echo "invalid fid management on $MDS: \
245                 old $old_last_fid, new $new_last_fid"
246             error
247         }
248         rm -fr $DIR/1b0 || error
249 }
250 run_test 1b " fid managing correctness ============="
251
252 TMPDIR=$OLDTMPDIR
253 TMP=$OLDTMP
254 HOME=$OLDHOME
255
256 log "cleanup: ========================================================"
257 if [ "`mount | grep ^$NAME`" ]; then
258         rm -rf $DIR/[Rdfs][1-9]*
259         if [ "$I_MOUNTED" = "yes" ]; then
260                 sh llmountcleanup.sh || error
261         fi
262 fi
263
264 echo "=========================== finished ============================"
265 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true