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