Whamcloud - gitweb
LU-3738 tests: improve posix.sh to support BASELINE_FS=zfs
[fs/lustre-release.git] / lustre / tests / sanity-lfsck.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
7 set -e
8
9 ONLY=${ONLY:-"$*"}
10 ALWAYS_EXCEPT="$SANITY_LFSCK_EXCEPT"
11 [ "$SLOW" = "no" ] && EXCEPT_SLOW=""
12 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
13
14 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
15 . $LUSTRE/tests/test-framework.sh
16 init_test_env $@
17 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
18 init_logging
19
20 [ $(facet_fstype $SINGLEMDS) != ldiskfs ] &&
21         skip "test LFSCK only for ldiskfs" && exit 0
22 require_dsh_mds || exit 0
23
24 MCREATE=${MCREATE:-mcreate}
25 SAVED_MDSSIZE=${MDSSIZE}
26 SAVED_OSTSIZE=${OSTSIZE}
27 # use small MDS + OST size to speed formatting time
28 # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size
29 MDSSIZE=100000
30 OSTSIZE=100000
31
32 check_and_setup_lustre
33
34 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.60) ]] &&
35         skip "Need MDS version at least 2.3.60" && check_and_cleanup_lustre &&
36         exit 0
37
38 build_test_filter
39
40 $LCTL set_param debug=+lfsck > /dev/null || true
41
42 MDT_DEV="${FSNAME}-MDT0000"
43 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
44 START_NAMESPACE="do_facet $SINGLEMDS \
45                 $LCTL lfsck_start -M ${MDT_DEV} -t namespace"
46 STOP_LFSCK="do_facet $SINGLEMDS $LCTL lfsck_stop -M ${MDT_DEV}"
47 SHOW_NAMESPACE="do_facet $SINGLEMDS \
48                 $LCTL get_param -n mdd.${MDT_DEV}.lfsck_namespace"
49 MOUNT_OPTS_SCRUB="-o user_xattr"
50 MOUNT_OPTS_NOSCRUB="-o user_xattr,noscrub"
51
52 lfsck_prep() {
53         local ndirs=$1
54         local nfiles=$2
55         local igif=$3
56
57         echo "formatall"
58         formatall > /dev/null
59
60         echo "setupall"
61         setupall > /dev/null
62
63         if [ ! -z $igif ]; then
64                 #define OBD_FAIL_FID_IGIF       0x1504
65                 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1504
66         fi
67
68         echo "preparing... ${nfiles} * ${ndirs} files will be created."
69         mkdir -p $DIR/$tdir
70         cp $LUSTRE/tests/*.sh $DIR/
71         for ((i=0; i<${ndirs}; i++)); do
72                 mkdir $DIR/$tdir/d${i}
73                 touch $DIR/$tdir/f${i}
74                 for ((j=0; j<${nfiles}; j++)); do
75                         touch $DIR/$tdir/d${i}/f${j}
76                 done
77                 mkdir $DIR/$tdir/e${i}
78         done
79
80         if [ ! -z $igif ]; then
81                 touch $DIR/$tdir/dummy
82                 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
83         fi
84
85         echo "prepared."
86         cleanup_mount $MOUNT > /dev/null || error "Fail to stop client!"
87         echo "stop $SINGLEMDS"
88         stop $SINGLEMDS > /dev/null || error "Fail to stop MDS!"
89 }
90
91 test_0() {
92         lfsck_prep 10 10
93         echo "start $SINGLEMDS"
94         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
95                 error "(1) Fail to start MDS!"
96
97         #define OBD_FAIL_LFSCK_DELAY1           0x1600
98         do_facet $SINGLEMDS $LCTL set_param fail_val=3
99         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
100         $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
101
102         $SHOW_NAMESPACE || error "Fail to monitor LFSCK (3)"
103
104         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
105         [ "$STATUS" == "scanning-phase1" ] ||
106                 error "(4) Expect 'scanning-phase1', but got '$STATUS'"
107
108         $STOP_LFSCK || error "(5) Fail to stop LFSCK!"
109
110         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
111         [ "$STATUS" == "stopped" ] ||
112                 error "(6) Expect 'stopped', but got '$STATUS'"
113
114         $START_NAMESPACE || error "(7) Fail to start LFSCK for namespace!"
115
116         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
117         [ "$STATUS" == "scanning-phase1" ] ||
118                 error "(8) Expect 'scanning-phase1', but got '$STATUS'"
119
120         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
121         do_facet $SINGLEMDS $LCTL set_param fail_val=0
122         sleep 3
123         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
124         [ "$STATUS" == "completed" ] ||
125                 error "(9) Expect 'completed', but got '$STATUS'"
126
127         local repaired=$($SHOW_NAMESPACE |
128                          awk '/^updated_phase1/ { print $2 }')
129         [ $repaired -eq 0 ] ||
130                 error "(10) Expect nothing to be repaired, but got: $repaired"
131
132         local scanned1=$($SHOW_NAMESPACE | awk '/^success_count/ { print $2 }')
133         $START_NAMESPACE -r || error "(11) Fail to reset LFSCK!"
134         sleep 3
135
136         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
137         [ "$STATUS" == "completed" ] ||
138                 error "(12) Expect 'completed', but got '$STATUS'"
139
140         local scanned2=$($SHOW_NAMESPACE | awk '/^success_count/ { print $2 }')
141         [ $((scanned1 + 1)) -eq $scanned2 ] ||
142                 error "(13) Expect success $((scanned1 + 1)), but got $scanned2"
143
144         echo "stopall, should NOT crash LU-3649"
145         stopall > /dev/null
146 }
147 run_test 0 "Control LFSCK manually"
148
149 test_1a() {
150         lfsck_prep 1 1
151         echo "start $SINGLEMDS"
152         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
153                 error "(1) Fail to start MDS!"
154
155         mount_client $MOUNT || error "(2) Fail to start client!"
156
157         #define OBD_FAIL_FID_INDIR      0x1501
158         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1501
159         touch $DIR/$tdir/dummy
160
161         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
162         umount_client $MOUNT
163         $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
164
165         sleep 3
166         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
167         [ "$STATUS" == "completed" ] ||
168                 error "(4) Expect 'completed', but got '$STATUS'"
169
170         local repaired=$($SHOW_NAMESPACE |
171                          awk '/^updated_phase1/ { print $2 }')
172         [ $repaired -eq 1 ] ||
173                 error "(5) Fail to repair crashed FID-in-dirent: $repaired"
174
175         mount_client $MOUNT || error "(6) Fail to start client!"
176
177         #define OBD_FAIL_FID_LOOKUP     0x1505
178         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
179         ls $DIR/$tdir/ > /dev/null || error "(7) no FID-in-dirent."
180
181         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
182 }
183 run_test 1a "LFSCK can find out and repair crashed FID-in-dirent"
184
185 test_1b()
186 {
187         lfsck_prep 1 1
188         echo "start $SINGLEMDS"
189         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
190                 error "(1) Fail to start MDS!"
191
192         mount_client $MOUNT || error "(2) Fail to start client!"
193
194         #define OBD_FAIL_FID_INLMA      0x1502
195         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1502
196         touch $DIR/$tdir/dummy
197
198         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
199         umount_client $MOUNT
200         #define OBD_FAIL_FID_NOLMA      0x1506
201         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1506
202         $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
203
204         sleep 3
205         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
206         [ "$STATUS" == "completed" ] ||
207                 error "(4) Expect 'completed', but got '$STATUS'"
208
209         local repaired=$($SHOW_NAMESPACE |
210                          awk '/^updated_phase1/ { print $2 }')
211         [ $repaired -eq 1 ] ||
212                 error "(5) Fail to repair missed FID-in-LMA: $repaired"
213
214         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
215         mount_client $MOUNT || error "(6) Fail to start client!"
216
217         #define OBD_FAIL_FID_LOOKUP     0x1505
218         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
219         stat $DIR/$tdir/dummy > /dev/null || error "(7) no FID-in-LMA."
220
221         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
222 }
223 run_test 1b "LFSCK can find out and repair missed FID-in-LMA"
224
225 test_2a() {
226         lfsck_prep 1 1
227         echo "start $SINGLEMDS"
228         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
229                 error "(1) Fail to start MDS!"
230
231         mount_client $MOUNT || error "(2) Fail to start client!"
232
233         #define OBD_FAIL_LFSCK_LINKEA_CRASH     0x1603
234         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
235         touch $DIR/$tdir/dummy
236
237         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
238         umount_client $MOUNT
239         $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
240
241         sleep 3
242         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
243         [ "$STATUS" == "completed" ] ||
244                 error "(4) Expect 'completed', but got '$STATUS'"
245
246         local repaired=$($SHOW_NAMESPACE |
247                          awk '/^updated_phase1/ { print $2 }')
248         [ $repaired -eq 1 ] ||
249                 error "(5) Fail to repair crashed linkEA: $repaired"
250
251         mount_client $MOUNT || error "(6) Fail to start client!"
252
253         stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
254                 error "(7) Fail to stat $DIR/$tdir/dummy"
255
256         local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
257         local dummyname=$($LFS fid2path $DIR $dummyfid)
258         [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
259                 error "(8) Fail to repair linkEA: $dummyfid $dummyname"
260 }
261 run_test 2a "LFSCK can find out and repair crashed linkEA entry"
262
263 test_2b()
264 {
265         lfsck_prep 1 1
266         echo "start $SINGLEMDS"
267         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
268                 error "(1) Fail to start MDS!"
269
270         mount_client $MOUNT || error "(2) Fail to start client!"
271
272         #define OBD_FAIL_LFSCK_LINKEA_MORE      0x1604
273         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
274         touch $DIR/$tdir/dummy
275
276         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
277         umount_client $MOUNT
278         $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
279
280         sleep 3
281         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
282         [ "$STATUS" == "completed" ] ||
283                 error "(4) Expect 'completed', but got '$STATUS'"
284
285         local repaired=$($SHOW_NAMESPACE |
286                          awk '/^updated_phase2/ { print $2 }')
287         [ $repaired -eq 1 ] ||
288                 error "(5) Fail to repair crashed linkEA: $repaired"
289
290         mount_client $MOUNT || error "(6) Fail to start client!"
291
292         stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
293                 error "(7) Fail to stat $DIR/$tdir/dummy"
294
295         local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
296         local dummyname=$($LFS fid2path $DIR $dummyfid)
297         [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
298                 error "(8) Fail to repair linkEA: $dummyfid $dummyname"
299 }
300 run_test 2b "LFSCK can find out and remove invalid linkEA entry"
301
302 test_4()
303 {
304         lfsck_prep 3 3
305         mds_backup_restore || error "(1) Fail to backup/restore!"
306         echo "start $SINGLEMDS with disabling OI scrub"
307         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
308                 error "(2) Fail to start MDS!"
309
310         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
311         [ "$STATUS" == "init" ] ||
312                 error "(3) Expect 'init', but got '$STATUS'"
313
314         #define OBD_FAIL_LFSCK_DELAY2           0x1601
315         do_facet $SINGLEMDS $LCTL set_param fail_val=1
316         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
317         $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
318
319         sleep 5
320         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
321         [ "$STATUS" == "scanning-phase1" ] ||
322                 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
323
324         local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
325         [ "$FLAGS" == "inconsistent" ] ||
326                 error "(6) Expect 'inconsistent', but got '$FLAGS'"
327
328         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
329         do_facet $SINGLEMDS $LCTL set_param fail_val=0
330         sleep 3
331         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
332         [ "$STATUS" == "completed" ] ||
333                 error "(7) Expect 'completed', but got '$STATUS'"
334
335         FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
336         [ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
337
338         local repaired=$($SHOW_NAMESPACE |
339                          awk '/^updated_phase1/ { print $2 }')
340         [ $repaired -ge 9 ] ||
341                 error "(9) Fail to repair crashed linkEA: $repaired"
342
343         mount_client $MOUNT || error "(10) Fail to start client!"
344
345         #define OBD_FAIL_FID_LOOKUP     0x1505
346         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
347         ls $DIR/$tdir/ > /dev/null || error "(11) no FID-in-dirent."
348
349         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
350 }
351 run_test 4 "FID-in-dirent can be rebuilt after MDT file-level backup/restore"
352
353 test_5()
354 {
355         lfsck_prep 1 1 1
356         mds_backup_restore 1 || error "(1) Fail to backup/restore!"
357         echo "start $SINGLEMDS with disabling OI scrub"
358         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
359                 error "(2) Fail to start MDS!"
360
361         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
362         [ "$STATUS" == "init" ] ||
363                 error "(3) Expect 'init', but got '$STATUS'"
364
365         #define OBD_FAIL_LFSCK_DELAY2           0x1601
366         do_facet $SINGLEMDS $LCTL set_param fail_val=1
367         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
368         $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
369
370         sleep 5
371         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
372         [ "$STATUS" == "scanning-phase1" ] ||
373                 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
374
375         local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
376         [ "$FLAGS" == "inconsistent,upgrade" ] ||
377                 error "(6) Expect 'inconsistent,upgrade', but got '$FLAGS'"
378
379         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
380         do_facet $SINGLEMDS $LCTL set_param fail_val=0
381         sleep 3
382         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
383         [ "$STATUS" == "completed" ] ||
384                 error "(7) Expect 'completed', but got '$STATUS'"
385
386         FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
387         [ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
388
389         local repaired=$($SHOW_NAMESPACE |
390                          awk '/^updated_phase1/ { print $2 }')
391         [ $repaired -ge 2 ] ||
392                 error "(9) Fail to repair crashed linkEA: $repaired"
393
394         mount_client $MOUNT || error "(10) Fail to start client!"
395
396         #define OBD_FAIL_FID_LOOKUP     0x1505
397         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
398         stat $DIR/$tdir/dummy > /dev/null || error "(11) no FID-in-LMA."
399
400         ls $DIR/$tdir/ > /dev/null || error "(12) no FID-in-dirent."
401
402         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
403         local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
404         local dummyname=$($LFS fid2path $DIR $dummyfid)
405         [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
406                 error "(13) Fail to generate linkEA: $dummyfid $dummyname"
407 }
408 run_test 5 "LFSCK can handle IFIG object upgrading"
409
410 test_6a() {
411         lfsck_prep 10 10
412         echo "start $SINGLEMDS"
413         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
414                 error "(1) Fail to start MDS!"
415
416         #define OBD_FAIL_LFSCK_DELAY1           0x1600
417         do_facet $SINGLEMDS $LCTL set_param fail_val=1
418         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
419         $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
420
421         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
422         [ "$STATUS" == "scanning-phase1" ] ||
423                 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
424
425         # Sleep 3 sec to guarantee at least one object processed by LFSCK
426         sleep 3
427         # Fail the LFSCK to guarantee there is at least one checkpoint
428         #define OBD_FAIL_LFSCK_FATAL1           0x1608
429         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001608
430         sleep 3
431         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
432         [ "$STATUS" == "failed" ] ||
433                 error "(4) Expect 'failed', but got '$STATUS'"
434
435         local POSITION0=$($SHOW_NAMESPACE |
436                           awk '/^last_checkpoint_position/ { print $2 }' |
437                           tr -d ',')
438
439         #define OBD_FAIL_LFSCK_DELAY1           0x1600
440         do_facet $SINGLEMDS $LCTL set_param fail_val=1
441         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
442         $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
443
444         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
445         [ "$STATUS" == "scanning-phase1" ] ||
446                 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
447
448         local POSITION1=$($SHOW_NAMESPACE |
449                           awk '/^latest_start_position/ { print $2 }' |
450                           tr -d ',')
451         [ $POSITION0 -lt $POSITION1 ] ||
452                 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
453
454         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
455         do_facet $SINGLEMDS $LCTL set_param fail_val=0
456         sleep 3
457         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
458         [ "$STATUS" == "completed" ] ||
459                 error "(8) Expect 'completed', but got '$STATUS'"
460 }
461 run_test 6a "LFSCK resumes from last checkpoint (1)"
462
463 test_6b() {
464         lfsck_prep 10 10
465         echo "start $SINGLEMDS"
466         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
467                 error "(1) Fail to start MDS!"
468
469         #define OBD_FAIL_LFSCK_DELAY2           0x1601
470         do_facet $SINGLEMDS $LCTL set_param fail_val=1
471         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
472         $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
473
474         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
475         [ "$STATUS" == "scanning-phase1" ] ||
476                 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
477
478         # Sleep 3 sec to guarantee at least one object processed by LFSCK
479         sleep 3
480         # Fail the LFSCK to guarantee there is at least one checkpoint
481         #define OBD_FAIL_LFSCK_FATAL2           0x1609
482         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
483         sleep 3
484         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
485         [ "$STATUS" == "failed" ] ||
486                 error "(4) Expect 'failed', but got '$STATUS'"
487
488         local POSITION0=$($SHOW_NAMESPACE |
489                           awk '/^last_checkpoint_position/ { print $4 }')
490
491         #define OBD_FAIL_LFSCK_DELAY2           0x1601
492         do_facet $SINGLEMDS $LCTL set_param fail_val=1
493         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
494         $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
495
496         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
497         [ "$STATUS" == "scanning-phase1" ] ||
498                 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
499
500         local POSITION1=$($SHOW_NAMESPACE |
501                           awk '/^latest_start_position/ { print $4 }')
502         if [ $POSITION0 -gt $POSITION1 ]; then
503                 [ $POSITION1 -eq 0 -a $POSITION0 -eq $((POSITION1 + 1)) ] ||
504                 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
505         fi
506
507         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
508         do_facet $SINGLEMDS $LCTL set_param fail_val=0
509         sleep 3
510         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
511         [ "$STATUS" == "completed" ] ||
512                 error "(8) Expect 'completed', but got '$STATUS'"
513 }
514 run_test 6b "LFSCK resumes from last checkpoint (2)"
515
516 test_7a()
517 {
518         lfsck_prep 10 10
519         echo "start $SINGLEMDS"
520         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
521                 error "(1) Fail to start MDS!"
522
523         #define OBD_FAIL_LFSCK_DELAY2           0x1601
524         do_facet $SINGLEMDS $LCTL set_param fail_val=1
525         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
526         $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
527
528         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
529         [ "$STATUS" == "scanning-phase1" ] ||
530                 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
531
532         # Sleep 3 sec to guarantee at least one object processed by LFSCK
533         sleep 3
534         echo "stop $SINGLEMDS"
535         stop $SINGLEMDS > /dev/null || error "(4) Fail to stop MDS!"
536
537         echo "start $SINGLEMDS"
538         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
539                 error "(5) Fail to start MDS!"
540
541         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
542         [ "$STATUS" == "scanning-phase1" ] ||
543                 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
544
545         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
546         do_facet $SINGLEMDS $LCTL set_param fail_val=0
547         sleep 3
548         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
549         [ "$STATUS" == "completed" ] ||
550                 error "(7) Expect 'completed', but got '$STATUS'"
551 }
552 run_test 7a "non-stopped LFSCK should auto restarts after MDS remount (1)"
553
554 test_7b()
555 {
556         lfsck_prep 2 2
557         echo "start $SINGLEMDS"
558         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
559                 error "(1) Fail to start MDS!"
560
561         mount_client $MOUNT || error "(2) Fail to start client!"
562
563         #define OBD_FAIL_LFSCK_LINKEA_MORE      0x1604
564         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
565         for ((i=0; i<10; i++)); do
566                 touch $DIR/$tdir/dummy${i}
567         done
568
569         #define OBD_FAIL_LFSCK_DELAY3           0x1602
570         do_facet $SINGLEMDS $LCTL set_param fail_val=1
571         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1602
572         $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
573
574         sleep 3
575         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
576         [ "$STATUS" == "scanning-phase2" ] ||
577                 error "(4) Expect 'scanning-phase2', but got '$STATUS'"
578
579         echo "stop $SINGLEMDS"
580         stop $SINGLEMDS > /dev/null || error "(5) Fail to stop MDS!"
581
582         echo "start $SINGLEMDS"
583         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
584                 error "(6) Fail to start MDS!"
585
586         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
587         [ "$STATUS" == "scanning-phase2" ] ||
588                 error "(7) Expect 'scanning-phase2', but got '$STATUS'"
589
590         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
591         do_facet $SINGLEMDS $LCTL set_param fail_val=0
592         sleep 3
593         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
594         [ "$STATUS" == "completed" ] ||
595                 error "(8) Expect 'completed', but got '$STATUS'"
596 }
597 run_test 7b "non-stopped LFSCK should auto restarts after MDS remount (2)"
598
599 test_8()
600 {
601         lfsck_prep 20 20
602         echo "start $SINGLEMDS"
603         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
604                 error "(1) Fail to start MDS!"
605
606         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
607         [ "$STATUS" == "init" ] ||
608                 error "(2) Expect 'init', but got '$STATUS'"
609
610         mount_client $MOUNT || error "(3) Fail to start client!"
611
612         #define OBD_FAIL_LFSCK_LINKEA_CRASH     0x1603
613         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
614         mkdir $DIR/$tdir/crashed
615
616         #define OBD_FAIL_LFSCK_LINKEA_MORE      0x1604
617         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
618         for ((i=0; i<5; i++)); do
619                 touch $DIR/$tdir/dummy${i}
620         done
621
622         #define OBD_FAIL_LFSCK_DELAY2           0x1601
623         do_facet $SINGLEMDS $LCTL set_param fail_val=2
624         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
625         $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
626
627         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
628         [ "$STATUS" == "scanning-phase1" ] ||
629                 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
630
631         $STOP_LFSCK || error "(6) Fail to stop LFSCK!"
632
633         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
634         [ "$STATUS" == "stopped" ] ||
635                 error "(7) Expect 'stopped', but got '$STATUS'"
636
637         $START_NAMESPACE || error "(8) Fail to start LFSCK for namespace!"
638
639         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
640         [ "$STATUS" == "scanning-phase1" ] ||
641                 error "(9) Expect 'scanning-phase1', but got '$STATUS'"
642
643         #define OBD_FAIL_LFSCK_FATAL2           0x1609
644         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
645         sleep 3
646         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
647         [ "$STATUS" == "failed" ] ||
648                 error "(10) Expect 'failed', but got '$STATUS'"
649
650         #define OBD_FAIL_LFSCK_DELAY1           0x1600
651         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
652         $START_NAMESPACE || error "(11) Fail to start LFSCK for namespace!"
653
654         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
655         [ "$STATUS" == "scanning-phase1" ] ||
656                 error "(12) Expect 'scanning-phase1', but got '$STATUS'"
657
658         #define OBD_FAIL_LFSCK_CRASH            0x160a
659         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160a
660         sleep 5
661
662         echo "stop $SINGLEMDS"
663         stop $SINGLEMDS > /dev/null || error "(13) Fail to stop MDS!"
664
665         #define OBD_FAIL_LFSCK_NO_AUTO          0x160b
666         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
667
668         echo "start $SINGLEMDS"
669         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
670                 error "(14) Fail to start MDS!"
671
672         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
673         [ "$STATUS" == "crashed" ] ||
674                 error "(15) Expect 'crashed', but got '$STATUS'"
675
676         #define OBD_FAIL_LFSCK_DELAY2           0x1601
677         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
678         $START_NAMESPACE || error "(16) Fail to start LFSCK for namespace!"
679
680         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
681         [ "$STATUS" == "scanning-phase1" ] ||
682                 error "(17) Expect 'scanning-phase1', but got '$STATUS'"
683
684         echo "stop $SINGLEMDS"
685         stop $SINGLEMDS > /dev/null || error "(18) Fail to stop MDS!"
686
687         #define OBD_FAIL_LFSCK_NO_AUTO          0x160b
688         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
689
690         echo "start $SINGLEMDS"
691         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
692                 error "(19) Fail to start MDS!"
693
694         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
695         [ "$STATUS" == "paused" ] ||
696                 error "(20) Expect 'paused', but got '$STATUS'"
697
698         #define OBD_FAIL_LFSCK_DELAY3           0x1602
699         do_facet $SINGLEMDS $LCTL set_param fail_val=2
700         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1602
701
702         $START_NAMESPACE || error "(21) Fail to start LFSCK for namespace!"
703         sleep 2
704         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
705         [ "$STATUS" == "scanning-phase2" ] ||
706                 error "(22) Expect 'scanning-phase2', but got '$STATUS'"
707
708         local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
709         [ "$FLAGS" == "scanned-once,inconsistent" ] ||
710                 error "(23) Expect 'scanned-once,inconsistent',but got '$FLAGS'"
711
712         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
713         do_facet $SINGLEMDS $LCTL set_param fail_val=0
714         sleep 2
715         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
716         [ "$STATUS" == "completed" ] ||
717                 error "(24) Expect 'completed', but got '$STATUS'"
718
719         FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
720         [ -z "$FLAGS" ] || error "(25) Expect empty flags, but got '$FLAGS'"
721
722 }
723 run_test 8 "LFSCK state machine"
724
725 test_9a() {
726         if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
727                 skip "Testing on UP system, the speed may be inaccurate."
728                 return 0
729         fi
730
731         lfsck_prep 70 70
732         echo "start $SINGLEMDS"
733         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
734                 error "(1) Fail to start MDS!"
735
736         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
737         [ "$STATUS" == "init" ] ||
738                 error "(2) Expect 'init', but got '$STATUS'"
739
740         local BASE_SPEED1=100
741         local RUN_TIME1=10
742         $START_NAMESPACE -s $BASE_SPEED1 || error "(3) Fail to start LFSCK!"
743
744         sleep $RUN_TIME1
745         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
746         [ "$STATUS" == "scanning-phase1" ] ||
747                 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
748
749         local SPEED=$($SHOW_NAMESPACE |
750                       awk '/^average_speed_phase1/ { print $2 }')
751
752         # There may be time error, normally it should be less than 2 seconds.
753         # We allow another 20% schedule error.
754         local TIME_DIFF=2
755         # MAX_MARGIN = 1.2 = 12 / 10
756         local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
757                            RUN_TIME1 * 12 / 10))
758         [ $SPEED -lt $MAX_SPEED ] ||
759                 error "(4) Got speed $SPEED, expected less than $MAX_SPEED"
760
761         # adjust speed limit
762         local BASE_SPEED2=300
763         local RUN_TIME2=10
764         do_facet $SINGLEMDS \
765                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit $BASE_SPEED2
766         sleep $RUN_TIME2
767
768         SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase1/ { print $2 }')
769         # MIN_MARGIN = 0.8 = 8 / 10
770         local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
771                             BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
772                            (RUN_TIME1 + RUN_TIME2) * 8 / 10))
773         [ $SPEED -gt $MIN_SPEED ] ||
774                 error "(5) Got speed $SPEED, expected more than $MIN_SPEED"
775
776         # MAX_MARGIN = 1.2 = 12 / 10
777         MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
778                       BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
779                      (RUN_TIME1 + RUN_TIME2) * 12 / 10))
780         [ $SPEED -lt $MAX_SPEED ] ||
781                 error "(6) Got speed $SPEED, expected less than $MAX_SPEED"
782
783         do_facet $SINGLEMDS \
784                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
785         sleep 5
786         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
787         [ "$STATUS" == "completed" ] ||
788                 error "(7) Expect 'completed', but got '$STATUS'"
789 }
790 run_test 9a "LFSCK speed control (1)"
791
792 test_9b() {
793         if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
794                 skip "Testing on UP system, the speed may be inaccurate."
795                 return 0
796         fi
797
798         lfsck_prep 0 0
799         echo "start $SINGLEMDS"
800         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
801                 error "(1) Fail to start MDS!"
802
803         mount_client $MOUNT || error "(2) Fail to start client!"
804
805         echo "Another preparing... 50 * 50 files (with error) will be created."
806         #define OBD_FAIL_LFSCK_LINKEA_MORE      0x1604
807         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
808         for ((i=0; i<50; i++)); do
809                 mkdir -p $DIR/$tdir/d${i}
810                 touch $DIR/$tdir/f${i}
811                 for ((j=0; j<50; j++)); do
812                         touch $DIR/$tdir/d${i}/f${j}
813                 done
814         done
815
816         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
817         [ "$STATUS" == "init" ] ||
818                 error "(3) Expect 'init', but got '$STATUS'"
819
820         #define OBD_FAIL_LFSCK_NO_DOUBLESCAN    0x160c
821         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160c
822         $START_NAMESPACE || error "(4) Fail to start LFSCK!"
823
824         sleep 10
825         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
826         [ "$STATUS" == "stopped" ] ||
827                 error "(5) Expect 'stopped', but got '$STATUS'"
828
829         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
830
831         local BASE_SPEED1=50
832         local RUN_TIME1=10
833         $START_NAMESPACE -s $BASE_SPEED1 || error "(6) Fail to start LFSCK!"
834
835         sleep $RUN_TIME1
836         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
837         [ "$STATUS" == "scanning-phase2" ] ||
838                 error "(7) Expect 'scanning-phase2', but got '$STATUS'"
839
840         local SPEED=$($SHOW_NAMESPACE |
841                       awk '/^average_speed_phase2/ { print $2 }')
842         # There may be time error, normally it should be less than 2 seconds.
843         # We allow another 20% schedule error.
844         local TIME_DIFF=2
845         # MAX_MARGIN = 1.2 = 12 / 10
846         local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
847                           RUN_TIME1 * 12 / 10))
848         [ $SPEED -lt $MAX_SPEED ] ||
849                 error "(8) Got speed $SPEED, expected less than $MAX_SPEED"
850
851         # adjust speed limit
852         local BASE_SPEED2=150
853         local RUN_TIME2=10
854         do_facet $SINGLEMDS \
855                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit $BASE_SPEED2
856         sleep $RUN_TIME2
857
858         SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase2/ { print $2 }')
859         # MIN_MARGIN = 0.8 = 8 / 10
860         local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
861                             BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
862                            (RUN_TIME1 + RUN_TIME2) * 8 / 10))
863         [ $SPEED -gt $MIN_SPEED ] ||
864                 error "(9) Got speed $SPEED, expected more than $MIN_SPEED"
865
866         # MAX_MARGIN = 1.2 = 12 / 10
867         MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
868                       BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
869                      (RUN_TIME1 + RUN_TIME2) * 12 / 10))
870         [ $SPEED -lt $MAX_SPEED ] ||
871                 error "(10) Got speed $SPEED, expected less than $MAX_SPEED"
872
873         do_facet $SINGLEMDS \
874                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
875         sleep 5
876         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
877         [ "$STATUS" == "completed" ] ||
878                 error "(11) Expect 'completed', but got '$STATUS'"
879 }
880 run_test 9b "LFSCK speed control (2)"
881
882 test_10()
883 {
884         lfsck_prep 1 1
885         echo "start $SINGLEMDS"
886         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
887                 error "(1) Fail to start MDS!"
888
889         mount_client $MOUNT || error "(2) Fail to start client!"
890
891         #define OBD_FAIL_LFSCK_LINKEA_CRASH     0x1603
892         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
893         for ((i=0; i<1000; i=$((i+2)))); do
894                 mkdir -p $DIR/$tdir/d${i}
895                 touch $DIR/$tdir/f${i}
896                 for ((j=0; j<5; j++)); do
897                         touch $DIR/$tdir/d${i}/f${j}
898                 done
899         done
900
901         #define OBD_FAIL_LFSCK_LINKEA_MORE      0x1604
902         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
903         for ((i=1; i<1000; i=$((i+2)))); do
904                 mkdir -p $DIR/$tdir/d${i}
905                 touch $DIR/$tdir/f${i}
906                 for ((j=0; j<5; j++)); do
907                         touch $DIR/$tdir/d${i}/f${j}
908                 done
909         done
910
911         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
912         ln $DIR/$tdir/f200 $DIR/$tdir/d200/dummy
913
914         umount_client $MOUNT
915         mount_client $MOUNT || error "(3) Fail to start client!"
916
917         local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
918         [ "$STATUS" == "init" ] ||
919                 error "(4) Expect 'init', but got '$STATUS'"
920
921         $START_NAMESPACE -s 100 || error "(5) Fail to start LFSCK!"
922
923         sleep 10
924         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
925         [ "$STATUS" == "scanning-phase1" ] ||
926                 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
927
928         ls -ailR $MOUNT > /dev/null || error "(7) Fail to ls!"
929
930         touch $DIR/$tdir/d198/a0 || error "(8) Fail to touch!"
931
932         mkdir $DIR/$tdir/d199/a1 || error "(9) Fail to mkdir!"
933
934         unlink $DIR/$tdir/f200 || error "(10) Fail to unlink!"
935
936         rm -rf $DIR/$tdir/d201 || error "(11) Fail to rmdir!"
937
938         mv $DIR/$tdir/f202 $DIR/$tdir/d203/ || error "(12) Fail to rename!"
939
940         ln $DIR/$tdir/f204 $DIR/$tdir/d205/a3 || error "(13) Fail to hardlink!"
941
942         ln -s $DIR/$tdir/d206 $DIR/$tdir/d207/a4 ||
943                 error "(14) Fail to softlink!"
944
945         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
946         [ "$STATUS" == "scanning-phase1" ] ||
947                 error "(15) Expect 'scanning-phase1', but got '$STATUS'"
948
949         do_facet $SINGLEMDS \
950                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
951         umount_client $MOUNT
952         sleep 10
953         STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
954         [ "$STATUS" == "completed" ] ||
955                 error "(16) Expect 'completed', but got '$STATUS'"
956 }
957 run_test 10 "System is available during LFSCK scanning"
958
959 $LCTL set_param debug=-lfsck > /dev/null || true
960
961 # restore MDS/OST size
962 MDSSIZE=${SAVED_MDSSIZE}
963 OSTSIZE=${SAVED_OSTSIZE}
964
965 # cleanup the system at last
966 formatall
967
968 complete $SECONDS
969 exit_status