Whamcloud - gitweb
current branches now use lnet from HEAD
[fs/lustre-release.git] / lustre / tests / sanity-lmv.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
7 set -e
8
9 ONLY=${ONLY:-"$*"}
10 # bug number for skipped test: 2108
11 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
12 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
13 #case `uname -r` in
14 #2.6.*) ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c 55" # bug 3117
15 #esac
16
17 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
18
19 SRCDIR=`dirname $0`
20 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
21 export SECURITY=${SECURITY:-"null"}
22
23 TMP=${TMP:-/tmp}
24 FSTYPE=${FSTYPE:-ext3}
25
26 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
27 CREATETEST=${CREATETEST:-createtest}
28 LFS=${LFS:-lfs}
29 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
30 LFIND=${LFIND:-"$LFS find"}
31 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
32 LCTL=${LCTL:-lctl}
33 MCREATE=${MCREATE:-mcreate}
34 OPENFILE=${OPENFILE:-openfile}
35 OPENUNLINK=${OPENUNLINK:-openunlink}
36 TOEXCL=${TOEXCL:-toexcl}
37 TRUNCATE=${TRUNCATE:-truncate}
38 MUNLINK=${MUNLINK:-munlink}
39 SOCKETSERVER=${SOCKETSERVER:-socketserver}
40 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
41 IOPENTEST1=${IOPENTEST1:-iopentest1}
42 IOPENTEST2=${IOPENTEST2:-iopentest2}
43 PTLDEBUG=${PTLDEBUG:-0}
44
45 . krb5_env.sh
46
47 export NAME=${NAME:-lmv}
48
49 SAVE_PWD=$PWD
50
51 clean() {
52         echo -n "cln.."
53         sh llmountcleanup.sh > /dev/null || exit 20
54         I_MOUNTED=no
55 }
56 CLEAN=${CLEAN:-clean}
57
58 start() {
59         echo -n "mnt.."
60         sh llrmount.sh > /dev/null || exit 10
61         I_MOUNTED=yes
62         echo "done"
63 }
64 START=${START:-start}
65
66 log() {
67         echo "$*"
68         lctl mark "$*" 2> /dev/null || true
69 }
70
71 trace() {
72         log "STARTING: $*"
73         strace -o $TMP/$1.strace -ttt $*
74         RC=$?
75         log "FINISHED: $*: rc $RC"
76         return 1
77 }
78 TRACE=${TRACE:-""}
79
80 check_kernel_version() {
81         VERSION_FILE=/proc/fs/lustre/kernel_version
82         WANT_VER=$1
83         [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
84         GOT_VER=`cat $VERSION_FILE`
85         [ $GOT_VER -ge $WANT_VER ] && return 0
86         log "test needs at least kernel version $WANT_VER, running $GOT_VER"
87         return 1
88 }
89
90 run_one() {
91         if ! cat /proc/mounts | grep -q $DIR; then
92                 $START
93         fi
94         echo $PTLDEBUG >/proc/sys/portals/debug 
95         log "== test $1: $2"
96         export TESTNAME=test_$1
97         test_$1 || error "test_$1: exit with rc=$?"
98         unset TESTNAME
99         pass
100         cd $SAVE_PWD
101         $CLEAN
102 }
103
104 build_test_filter() {
105         for O in $ONLY; do
106             eval ONLY_${O}=true
107         done
108         for E in $EXCEPT $ALWAYS_EXCEPT; do
109             eval EXCEPT_${E}=true
110         done
111 }
112
113 _basetest() {
114     echo $*
115 }
116
117 basetest() {
118     IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
119 }
120
121 run_test() {
122          base=`basetest $1`
123          if [ "$ONLY" ]; then
124                  testname=ONLY_$1
125                  if [ ${!testname}x != x ]; then
126                         run_one $1 "$2"
127                         return $?
128                  fi
129                  testname=ONLY_$base
130                  if [ ${!testname}x != x ]; then
131                          run_one $1 "$2"
132                          return $?
133                  fi
134                  echo -n "."
135                  return 0
136         fi
137         testname=EXCEPT_$1
138         if [ ${!testname}x != x ]; then
139                  echo "skipping excluded test $1"
140                  return 0
141         fi
142         testname=EXCEPT_$base
143         if [ ${!testname}x != x ]; then
144                  echo "skipping excluded test $1 (base $base)"
145                  return 0
146         fi
147         run_one $1 "$2"
148         return $?
149 }
150
151 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
152
153 error() { 
154         log "FAIL: $@"
155         if [ "$SANITYLOG" ]; then
156                 echo "FAIL: $TESTNAME $@" >> $SANITYLOG
157         else
158                 exit 1
159         fi
160 }
161
162 pass() { 
163         echo PASS
164 }
165
166 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
167 if [ -z "$MOUNT" ]; then
168         sh llmount.sh
169         MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
170         [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
171         I_MOUNTED=yes
172 fi
173
174 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
175
176 DIR=${DIR:-$MOUNT}
177 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
178
179 #LOVNAME=`cat /proc/fs/lustre/llite/fs0/lov/common_name`
180 #OSTCOUNT=`cat /proc/fs/lustre/lov/$LOVNAME/numobd`
181 #STRIPECOUNT=`cat /proc/fs/lustre/lov/$LOVNAME/stripecount`
182 #STRIPESIZE=`cat /proc/fs/lustre/lov/$LOVNAME/stripesize`
183
184 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
185 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
186 rm -rf $DIR/[Rdfs][1-9]*
187
188 build_test_filter
189
190 echo preparing for tests involving mounts
191 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
192 touch $EXT2_DEV
193 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
194
195 test_1a() {
196         mkdir $DIR/1a0 || error 
197         createmany -o $DIR/1a0/f 4000
198         rmdir $DIR/1a0 && error
199         rm -rf $DIR/1a0 || error
200 }
201 run_test 1a " remove splitted dir ============================="
202
203 test_1b() {
204         mkdir $DIR/1b0 || error
205         createmany -o $DIR/1b0/f 4000
206         find $DIR/1b0 -type f | xargs rm -f
207         NUM=`ls $DIR/1b0 | wc -l`
208         if [ $NUM -ne 0 ] ; then
209                 echo "dir must be empty"
210                 error
211         fi
212         touch $DIR/1b0/file0
213         touch $DIR/1b0/file1
214         touch $DIR/1b0/file2
215
216         echo "3 files left"
217         rmdir $DIR/1b0 && error
218         rm -f $DIR/1b0/file0
219
220         echo "2 files left"
221         rmdir $DIR/1b0 && error
222         rm -f $DIR/1b0/file1
223
224         echo "1 files left"
225         rmdir $DIR/1b0 && error
226         rm -f $DIR/1b0/file2
227
228         echo "0 files left"
229         rmdir $DIR/1b0 || error
230 }
231 run_test 1b " remove splitted dir ============================="
232
233 test_1c() {
234         mkdir $DIR/1b1 || error
235         createmany -o $DIR/1b1/f 4000
236         find $DIR/1b1 -type f | xargs rm -f
237         NUM=`ls $DIR/1b1 | wc -l`
238         if [ $NUM -ne 0 ] ; then
239                 echo "dir must be empty"
240                 error
241         fi
242         touch $DIR/1b1/file0
243         touch $DIR/1b1/file1
244         touch $DIR/1b1/file2
245
246         ls $DIR/1b1/
247         log "3 files left"
248         rmdir $DIR/1b1 && error
249         rm -f $DIR/1b1/file0
250
251         ls $DIR/1b1/
252         log "2 files left"
253         rmdir $DIR/1b1 && error
254         rm -f $DIR/1b1/file1
255
256         ls $DIR/1b1/
257         log "1 files left"
258         rmdir $DIR/1b1 && error
259         rm -f $DIR/1b1/file2
260
261         ls $DIR/1b1/
262         log "0 files left"
263         rmdir $DIR/1b1 || error
264 }
265 run_test 1c " remove splitted cross-node dir ============================="
266
267 test_2a() {
268         mkdir $DIR/2a0 || error 
269         createmany -o $DIR/2a0/f 5000
270         NUM=`ls $DIR/2a0 | wc -l`
271         echo "found $NUM files"
272         if [ $NUM -ne 5000 ]; then
273                 echo "wrong number of files: $NUM"
274                 error
275         fi
276         rm -rf $DIR/2a0 || error
277 }
278 run_test 2a " list splitted dir ============================="
279
280 test_2b() {
281         mkdir $DIR/2b1 || error 
282         createmany -o $DIR/2b1/f 5000
283         $CLEAN
284         $START
285         statmany -l $DIR/2b1/f 5000 5000 || error
286         statmany -s $DIR/2b1/f 5000 5000 || error
287         rm -rf $DIR/2b1 || error
288 }
289 run_test 2b " list splitted dir after remount ============================="
290
291 test_3a() {
292         mkdir $DIR/3a0 || error
293         for i in `seq 100`; do
294                 mkdir $DIR/3a0/d${i} || error
295         done
296         createmany -o $DIR/3a0/f 5000 || error
297         rm -rf $DIR/3a0 || error
298 }
299 run_test 3a " dir splitting with cross-ref ============================="
300
301 test_3b() {
302         mkdir $DIR/3b1 || error
303         createmany -m $DIR/3b1/f 5000 || error
304         rm -rf $DIR/3b1 || error
305 }
306 run_test 3b " dir splitting via createmany -m ============================="
307
308 test_3c() {
309         mkdir $DIR/3c1 || error
310         echo "MDS nodes: $MDSCOUNT"
311         for j in `seq 3`; do
312                 for i in `seq 10`; do
313                         $LFS dirstripe $DIR/3c1/d-${j}-${i} $j || error
314                         createmany -m $DIR/3c1/d-${j}-${i}/m 200 || error
315                         createmany -o $DIR/3c1/d-${j}-${i}/o 200 || error
316                 done
317         done
318         rm -rf $DIR/3c1 || error
319 }
320
321 run_test 3c " dir splitting via lfs stripe ============================="
322
323 test_4a() {
324         let rr=0
325         while let "rr < 33000"; do
326                 if let "rr % 2000 == 0"; then
327                         echo "$rr"
328                 fi
329                 mkdir $DIR/4a1 || error
330                 rm -rf $DIR/4a1
331                 let "rr = rr + 1"
332         done
333 }
334
335 ## this test is very time-consuming, don't run it by default
336 #run_test 4a " FIDS/ nlink overflow test  ============================="
337
338
339 TMPDIR=$OLDTMPDIR
340 TMP=$OLDTMP
341 HOME=$OLDHOME
342
343 log "cleanup: ======================================================"
344 if [ "`mount | grep ^$NAME`" ]; then
345         rm -rf $DIR/[Rdfs][1-9]*
346         if [ "$I_MOUNTED" = "yes" ]; then
347                 sh llmountcleanup.sh || error
348         fi
349 fi
350
351 echo '=========================== finished ==============================='
352 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true