Whamcloud - gitweb
1ce2737359f372032f4ffe73da282e1115637e8a
[fs/lustre-release.git] / lustre / tests / sanity-scrub.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_SCRUB_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 [ "${MDSFSTYPE:-$FSTYPE}" != "ldiskfs" ] &&
21         skip "test OI scrub only for ldiskfs" && exit 0
22 require_dsh_mds || exit 0
23
24 SAVED_MDSSIZE=${MDSSIZE}
25 SAVED_OSTSIZE=${OSTSIZE}
26 # use small MDS + OST size to speed formatting time
27 # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size
28 MDSSIZE=100000
29 OSTSIZE=100000
30
31 check_and_setup_lustre
32 build_test_filter
33
34 MDT_DEV="${FSNAME}-MDT0000"
35 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
36 START_SCRUB="do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV}"
37 STOP_SCRUB="do_facet $SINGLEMDS $LCTL lfsck_stop -M ${MDT_DEV}"
38 SHOW_SCRUB="do_facet $SINGLEMDS \
39                 $LCTL get_param -n osd-ldiskfs.${MDT_DEV}.oi_scrub"
40 MOUNT_OPTS_SCRUB="-o user_xattr"
41 MOUNT_OPTS_NOSCRUB="-o user_xattr,noscrub"
42
43 scrub_prep() {
44         local nfiles=$1
45
46         echo "formatall"
47         formatall > /dev/null
48         echo "setupall"
49         setupall > /dev/null
50
51         echo "preparing... ${nfiles} files will be created."
52         mkdir -p $DIR/$tdir
53         cp $LUSTRE/tests/*.sh $DIR/$tdir/
54         [[ $nfiles -gt 0 ]] && { createmany -o $DIR/$tdir/$tfile $nfiles ||
55                                 error "createmany failed"; }
56
57         echo "prepared."
58         cleanup_mount $MOUNT > /dev/null || error "Fail to stop client!"
59         echo "stop $SINGLEMDS"
60         stop $SINGLEMDS > /dev/null || error "Fail to stop MDS!"
61 }
62
63 test_0() {
64         scrub_prep 0
65         echo "start $SINGLEMDS without disabling OI scrub"
66         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
67                 error "(1) Fail to start MDS!"
68
69         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
70         [ "$STATUS" == "init" ] ||
71                 error "(2) Expect 'init', but got '$STATUS'"
72
73         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
74         [ -z "$FLAGS" ] || error "(3) Expect empty flags, but got '$FLAGS'"
75
76         mount_client $MOUNT || error "(4) Fail to start client!"
77
78         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
79                 error "(5) File diff failed unexpected!"
80 }
81 run_test 0 "Do not auto trigger OI scrub for non-backup/restore case"
82
83 test_1a() {
84         scrub_prep 0
85         mds_remove_ois || error "(1) Fail to remove/recreate!"
86
87         echo "start $SINGLEMDS without disabling OI scrub"
88         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
89                 error "(2) Fail to start MDS!"
90
91         sleep 3
92         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
93         [ "$STATUS" == "completed" ] ||
94                 error "(3) Expect 'completed', but got '$STATUS'"
95
96         mount_client $MOUNT || error "(4) Fail to start client!"
97
98         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
99                 error "(5) File diff failed unexpected!"
100 }
101 run_test 1a "Trigger OI scrub when MDT mounts for OI files remove/recreate case"
102
103 test_1b() {
104         local index
105
106         # OI files to be removed:
107         # idx 0: oi.16.0
108         # idx 1: oi.16.1
109         # idx 2: oi.16.{2,4,8,16,32}
110         # idx 3: oi.16.{3,9,27}
111         # idx 5: oi.16.{5,25}
112         # idx 7: oi.16.{7,49}
113         for index in 0 1 2 3 5 7; do
114                 scrub_prep 0
115                 mds_remove_ois ${index} || error "(1) Fail to remove/recreate!"
116
117                 echo "start $SINGLEMDS with disabling OI scrub"
118                 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > \
119                         /dev/null || error "(2) Fail to start MDS!"
120
121                 local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
122                 [ "$FLAGS" == "recreated" ] ||
123                         error "(3) Expect 'recreated', but got '$STATUS'"
124
125                 $START_SCRUB || error "(4) Fail to start OI scrub!"
126                 sleep 3
127                 local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
128                 [ "$STATUS" == "completed" ] ||
129                         error "(5) Expect 'completed', but got '$STATUS'"
130
131                 FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
132                 [ -z "$FLAGS" ] ||
133                         error "(6) Expect empty flags, but got '$FLAGS'"
134         done
135 }
136 run_test 1b "Auto detect kinds of OI file(s) removed/recreated cases"
137
138 test_2() {
139         scrub_prep 0
140         mds_backup_restore || error "(1) Fail to backup/restore!"
141
142         echo "start $SINGLEMDS without disabling OI scrub"
143         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
144                 error "(2) Fail to start MDS!"
145
146         sleep 3
147         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
148         [ "$STATUS" == "completed" ] ||
149                 error "(3) Expect 'completed', but got '$STATUS'"
150
151         mount_client $MOUNT || error "(4) Fail to start client!"
152
153         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
154                 error "(5) File diff failed unexpected!"
155 }
156 run_test 2 "Trigger OI scrub when MDT mounts for backup/restore case"
157
158 test_3() {
159         scrub_prep 0
160         mds_backup_restore || error "(1) Fail to backup/restore!"
161
162         echo "start $SINGLEMDS with disabling OI scrub"
163         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
164                 error "(2) Fail to start MDS!"
165
166         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
167         [ "$STATUS" == "init" ] ||
168                 error "(3) Expect 'init', but got '$STATUS'"
169
170         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
171         [ "$FLAGS" == "inconsistent" ] ||
172                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
173         echo "stopall"
174         stopall > /dev/null
175 }
176 run_test 3 "Do not trigger OI scrub when MDT mounts if 'noscrub' specified"
177
178 test_4() {
179         scrub_prep 0
180         mds_backup_restore || error "(1) Fail to backup/restore!"
181
182         echo "start $SINGLEMDS with disabling OI scrub"
183         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
184                 error "(2) Fail to start MDS!"
185
186         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
187         [ "$STATUS" == "init" ] ||
188                 error "(3) Expect 'init', but got '$STATUS'"
189
190         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
191         [ "$FLAGS" == "inconsistent" ] ||
192                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
193
194         mount_client $MOUNT || error "(5) Fail to start client!"
195
196         do_facet $SINGLEMDS \
197                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
198         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
199                 error "(6) File diff failed unexpected!"
200
201         sleep 3
202         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
203         [ "$STATUS" == "completed" ] ||
204                 error "(7) Expect 'completed', but got '$STATUS'"
205 }
206 run_test 4 "Trigger OI scrub automatically if inconsistent OI mapping was found"
207
208 test_5() {
209         scrub_prep 1500
210         mds_backup_restore || error "(1) Fail to backup/restore!"
211
212         echo "start $SINGLEMDS with disabling OI scrub"
213         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
214                 error "(2) Fail to start MDS!"
215
216         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
217         [ "$STATUS" == "init" ] ||
218                 error "(3) Expect 'init', but got '$STATUS'"
219
220         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
221         [ "$FLAGS" == "inconsistent" ] ||
222                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
223
224         mount_client $MOUNT || error "(5) Fail to start client!"
225
226         do_facet $SINGLEMDS \
227                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
228         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
229         do_facet $SINGLEMDS $LCTL set_param fail_val=3
230         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
231         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
232                 error "(6) File diff failed unexpected!"
233
234         umount_client $MOUNT || error "(7) Fail to stop client!"
235
236         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
237         [ "$STATUS" == "scanning" ] ||
238                 error "(8) Expect 'scanning', but got '$STATUS'"
239
240         #define OBD_FAIL_OSD_SCRUB_CRASH         0x191
241         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000191
242         sleep 4
243         echo "stop $SINGLEMDS"
244         stop $SINGLEMDS > /dev/null || error "(9) Fail to stop MDS!"
245
246         echo "start $SINGLEMDS with disabling OI scrub"
247         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
248                 error "(10) Fail to start MDS!"
249
250         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
251         [ "$STATUS" == "crashed" ] ||
252                 error "(11) Expect 'crashed', but got '$STATUS'"
253
254         echo "stop $SINGLEMDS"
255         stop $SINGLEMDS > /dev/null || error "(12) Fail to stop MDS!"
256
257         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
258         do_facet $SINGLEMDS $LCTL set_param fail_val=3
259         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
260         echo "start $SINGLEMDS without disabling OI scrub"
261         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
262                 error "(13) Fail to start MDS!"
263
264         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
265         [ "$STATUS" == "scanning" ] ||
266                 error "(14) Expect 'scanning', but got '$STATUS'"
267
268         #define OBD_FAIL_OSD_SCRUB_FATAL         0x192
269         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000192
270         sleep 4
271         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
272         [ "$STATUS" == "failed" ] ||
273                 error "(15) Expect 'failed', but got '$STATUS'"
274
275         mount_client $MOUNT || error "(16) Fail to start client!"
276
277         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
278         do_facet $SINGLEMDS $LCTL set_param fail_val=3
279         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
280         stat $DIR/$tdir/${tfile}1000 ||
281                 error "(17) Fail to stat $DIR/$tdir/${tfile}1000!"
282
283         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
284         [ "$STATUS" == "scanning" ] ||
285                 error "(18) Expect 'scanning', but got '$STATUS'"
286
287         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
288         do_facet $SINGLEMDS $LCTL set_param fail_val=0
289         sleep 5
290         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
291         [ "$STATUS" == "completed" ] ||
292                 error "(19) Expect 'completed', but got '$STATUS'"
293
294         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
295         [ -z "$FLAGS" ] || error "(20) Expect empty flags, but got '$FLAGS'"
296 }
297 run_test 5 "OI scrub state machine"
298
299 test_6() {
300         scrub_prep 1000
301         mds_backup_restore || error "(1) Fail to backup/restore!"
302
303         echo "start $SINGLEMDS with disabling OI scrub"
304         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
305                 error "(2) Fail to start MDS!"
306
307         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
308         [ "$STATUS" == "init" ] ||
309                 error "(3) Expect 'init', but got '$STATUS'"
310
311         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
312         [ "$FLAGS" == "inconsistent" ] ||
313                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
314
315         mount_client $MOUNT || error "(5) Fail to start client!"
316
317         do_facet $SINGLEMDS \
318                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
319         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
320         do_facet $SINGLEMDS $LCTL set_param fail_val=3
321         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
322         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
323                 error "(6) File diff failed unexpected!"
324
325         # Sleep 5 sec to guarantee at least one object processed by OI scrub
326         sleep 5
327         # Fail the OI scrub to guarantee there is at least one checkpoint
328         #define OBD_FAIL_OSD_SCRUB_FATAL         0x192
329         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000192
330         sleep 4
331         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
332         [ "$STATUS" == "failed" ] ||
333                 error "(7) Expect 'failed', but got '$STATUS'"
334
335         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
336         do_facet $SINGLEMDS $LCTL set_param fail_val=3
337         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
338         # stat will re-trigger OI scrub
339         stat $DIR/$tdir/${tfile}800 ||
340                 error "(8) Fail to stat $DIR/$tdir/${tfile}800!"
341
342         umount_client $MOUNT || error "(9) Fail to stop client!"
343
344         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
345         [ "$STATUS" == "scanning" ] ||
346                 error "(10) Expect 'scanning', but got '$STATUS'"
347
348         #define OBD_FAIL_OSD_SCRUB_CRASH         0x191
349         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000191
350         sleep 4
351         local POSITION0=$($SHOW_SCRUB |
352                         awk '/^last_checkpoint_position/ {print $2}')
353         POSITION0=$((POSITION0 + 1))
354
355         echo "stop $SINGLEMDS"
356         stop $SINGLEMDS > /dev/null || error "(11) Fail to stop MDS!"
357
358         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
359         do_facet $SINGLEMDS $LCTL set_param fail_val=3
360         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
361         echo "start $SINGLEMDS without disabling OI scrub"
362         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
363                 error "(12) Fail to start MDS!"
364
365         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
366         [ "$STATUS" == "scanning" ] ||
367                 error "(13) Expect 'scanning', but got '$STATUS'"
368
369         local POSITION1=$($SHOW_SCRUB |
370                         awk '/^latest_start_position/ {print $2}')
371         [ $POSITION0 -eq $POSITION1 ] ||
372                 error "(14) Expect position: $POSITION0, but got $POSITION1"
373
374         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
375         do_facet $SINGLEMDS $LCTL set_param fail_val=0
376         sleep 5
377         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
378         [ "$STATUS" == "completed" ] ||
379                 error "(15) Expect 'completed', but got '$STATUS'"
380
381         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
382         [ -z "$FLAGS" ] || error "(16) Expect empty flags, but got '$FLAGS'"
383 }
384 run_test 6 "OI scrub resumes from last checkpoint"
385
386 test_7() {
387         scrub_prep 500
388         mds_backup_restore || error "(1) Fail to backup/restore!"
389
390         echo "start $SINGLEMDS with disabling OI scrub"
391         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
392                 error "(2) Fail to start MDS!"
393
394         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
395         [ "$STATUS" == "init" ] ||
396                 error "(3) Expect 'init', but got '$STATUS'"
397
398         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
399         [ "$FLAGS" == "inconsistent" ] ||
400                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
401
402         mount_client $MOUNT || error "(5) Fail to start client!"
403
404         do_facet $SINGLEMDS \
405                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
406         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
407         do_facet $SINGLEMDS $LCTL set_param fail_val=3
408         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
409         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
410                 error "(6) File diff failed unexpected!"
411
412         stat $DIR/$tdir/${tfile}300 ||
413                 error "(7) Fail to stat $DIR/$tdir/${tfile}300!"
414
415         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
416         [ "$STATUS" == "scanning" ] ||
417                 error "(8) Expect 'scanning', but got '$STATUS'"
418
419         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
420         [ "$FLAGS" == "inconsistent,auto" ] ||
421                 error "(9) Expect 'inconsistent,auto', but got '$FLAGS'"
422
423         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
424         do_facet $SINGLEMDS $LCTL set_param fail_val=0
425         sleep 5
426         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
427         [ "$STATUS" == "completed" ] ||
428                 error "(10) Expect 'completed', but got '$STATUS'"
429
430         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
431         [ -z "$FLAGS" ] || error "(11) Expect empty flags, but got '$FLAGS'"
432 }
433 run_test 7 "System is available during OI scrub scanning"
434
435 test_8() {
436         scrub_prep 0
437         mds_backup_restore || error "(1) Fail to backup/restore!"
438
439         echo "start $SINGLEMDS with disabling OI scrub"
440         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
441                 error "(2) Fail to start MDS!"
442
443         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
444         [ "$STATUS" == "init" ] ||
445                 error "(3) Expect 'init', but got '$STATUS'"
446
447         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
448         [ "$FLAGS" == "inconsistent" ] ||
449                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
450
451         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
452         do_facet $SINGLEMDS $LCTL set_param fail_val=3
453         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
454         $START_SCRUB || error "(5) Fail to start OI scrub!"
455
456         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
457         [ "$STATUS" == "scanning" ] ||
458                 error "(6) Expect 'scanning', but got '$STATUS'"
459
460         $STOP_SCRUB || error "(7) Fail to stop OI scrub!"
461
462         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
463         [ "$STATUS" == "stopped" ] ||
464                 error "(8) Expect 'stopped', but got '$STATUS'"
465
466         $START_SCRUB || error "(9) Fail to start OI scrub!"
467
468         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
469         [ "$STATUS" == "scanning" ] ||
470                 error "(10) Expect 'scanning', but got '$STATUS'"
471
472         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
473         do_facet $SINGLEMDS $LCTL set_param fail_val=0
474         sleep 5
475         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
476         [ "$STATUS" == "completed" ] ||
477                 error "(11) Expect 'completed', but got '$STATUS'"
478
479         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
480         [ -z "$FLAGS" ] || error "(12) Expect empty flags, but got '$FLAGS'"
481 }
482 run_test 8 "Control OI scrub manually"
483
484 test_9() {
485         if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
486                 skip "Testing on UP system, the speed may be inaccurate."
487                 return 0
488         fi
489
490         scrub_prep 8000
491         mds_backup_restore || error "(1) Fail to backup/restore!"
492
493         echo "start $SINGLEMDS with disabling OI scrub"
494         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
495                 error "(2) Fail to start MDS!"
496
497         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
498         [ "$STATUS" == "init" ] ||
499                 error "(3) Expect 'init', but got '$STATUS'"
500
501         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
502         [ "$FLAGS" == "inconsistent" ] ||
503                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
504
505         # OI scrub should run with full speed under inconsistent case
506         $START_SCRUB -s 100 || error "(5) Fail to start OI scrub!"
507
508         sleep 10
509         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
510         [ "$STATUS" == "completed" ] ||
511                 error "(6) Expect 'completed', but got '$STATUS'"
512
513         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
514         [ -z "$FLAGS" ] || error "(7) Expect empty flags, but got '$FLAGS'"
515
516         # OI scrub should run with limited speed under non-inconsistent case
517         $START_SCRUB -s 100 -r || error "(8) Fail to start OI scrub!"
518
519         sleep 10
520         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
521         [ "$STATUS" == "scanning" ] ||
522                 error "(9) Expect 'scanning', but got '$STATUS'"
523
524         # Do NOT ignore that there are 1024 pre-fetched items.
525         # So the max speed may be (1024 + 100 * 10) / 10.
526         # And there may be time error, so the max speed may be more large.
527         local SPEED=$($SHOW_SCRUB | awk '/^average_speed/ { print $2 }')
528         [ $SPEED -gt 220 ] &&
529                 error "(10) Unexpected speed $SPEED, should not more than 220"
530
531         # adjust speed limit
532         do_facet $SINGLEMDS \
533                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 300
534         sleep 10
535
536         SPEED=$($SHOW_SCRUB | awk '/^average_speed/ { print $2 }')
537         [ $SPEED -lt 220 ] &&
538                 error "(11) Unexpected speed $SPEED, should not less than 220"
539
540         [ $SPEED -gt 300 ] &&
541                 error "(12) Unexpected speed $SPEED, should not more than 300"
542
543         do_facet $SINGLEMDS \
544                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
545         sleep 6
546         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
547         [ "$STATUS" == "completed" ] ||
548                 error "(13) Expect 'completed', but got '$STATUS'"
549 }
550 run_test 9 "OI scrub speed control"
551
552 test_10a() {
553         scrub_prep 0
554         mds_backup_restore || error "(1) Fail to backup/restore!"
555
556         echo "start $SINGLEMDS with disabling OI scrub"
557         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
558                 error "(2) Fail to start MDS!"
559
560         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
561         [ "$STATUS" == "init" ] ||
562                 error "(3) Expect 'init', but got '$STATUS'"
563
564         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
565         [ "$FLAGS" == "inconsistent" ] ||
566                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
567
568         mount_client $MOUNT || error "(5) Fail to start client!"
569
570         do_facet $SINGLEMDS \
571                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
572         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
573         do_facet $SINGLEMDS $LCTL set_param fail_val=3
574         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
575         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
576                 error "(6) File diff failed unexpected!"
577
578         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
579         [ "$STATUS" == "scanning" ] ||
580                 error "(7) Expect 'scanning', but got '$STATUS'"
581
582         umount_client $MOUNT || error "(8) Fail to stop client!"
583
584         echo "stop $SINGLEMDS"
585         stop $SINGLEMDS > /dev/null || error "(9) Fail to stop MDS!"
586
587         echo "start $SINGLEMDS with disabling OI scrub"
588         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
589                 error "(10) Fail to start MDS!"
590
591         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
592         [ "$STATUS" == "paused" ] ||
593                 error "(11) Expect 'paused', but got '$STATUS'"
594
595         echo "stop $SINGLEMDS"
596         stop $SINGLEMDS > /dev/null || error "(12) Fail to stop MDS!"
597
598         echo "start $SINGLEMDS without disabling OI scrub"
599         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
600                 error "(13) Fail to start MDS!"
601
602         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
603         [ "$STATUS" == "scanning" ] ||
604                 error "(14) Expect 'scanning', but got '$STATUS'"
605
606         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
607         do_facet $SINGLEMDS $LCTL set_param fail_val=0
608         sleep 5
609         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
610         [ "$STATUS" == "completed" ] ||
611                 error "(15) Expect 'completed', but got '$STATUS'"
612
613         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
614         [ -z "$FLAGS" ] || error "(16) Expect empty flags, but got '$FLAGS'"
615 }
616 run_test 10a "non-stopped OI scrub should auto restarts after MDS remount (1)"
617
618 test_10b() {
619         scrub_prep 0
620         mds_backup_restore || error "(1) Fail to backup/restore!"
621
622         echo "start $SINGLEMDS with disabling OI scrub"
623         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
624                 error "(2) Fail to start MDS!"
625
626         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
627         [ "$STATUS" == "init" ] ||
628                 error "(3) Expect 'init', but got '$STATUS'"
629
630         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
631         [ "$FLAGS" == "inconsistent" ] ||
632                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
633
634         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
635         do_facet $SINGLEMDS $LCTL set_param fail_val=3
636         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
637
638         $START_SCRUB || error "(5) Fail to start OI scrub!"
639
640         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
641         [ "$STATUS" == "scanning" ] ||
642                 error "(6) Expect 'scanning', but got '$STATUS'"
643
644         echo "stop $SINGLEMDS"
645         stop $SINGLEMDS > /dev/null || error "(7) Fail to stop MDS!"
646
647         echo "start $SINGLEMDS with disabling OI scrub"
648         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
649                 error "(8) Fail to start MDS!"
650
651         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
652         [ "$STATUS" == "paused" ] ||
653                 error "(9) Expect 'paused', but got '$STATUS'"
654
655         echo "stop $SINGLEMDS"
656         stop $SINGLEMDS > /dev/null || error "(10) Fail to stop MDS!"
657
658         echo "start $SINGLEMDS without disabling OI scrub"
659         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
660                 error "(11) Fail to start MDS!"
661
662         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
663         [ "$STATUS" == "scanning" ] ||
664                 error "(12) Expect 'scanning', but got '$STATUS'"
665
666         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
667         do_facet $SINGLEMDS $LCTL set_param fail_val=0
668         sleep 5
669         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
670         [ "$STATUS" == "completed" ] ||
671                 error "(13) Expect 'completed', but got '$STATUS'"
672
673         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
674         [ -z "$FLAGS" ] || error "(14) Expect empty flags, but got '$FLAGS'"
675 }
676 run_test 10b "non-stopped OI scrub should auto restarts after MDS remount (2)"
677
678 # restore the ${facet}_MKFS_OPTS variables
679 for facet in MGS MDS OST; do
680         opts=SAVED_${facet}_MKFS_OPTS
681         if [[ -n ${!opts} ]]; then
682                 eval ${facet}_MKFS_OPTS=\"${!opts}\"
683         fi
684 done
685
686 # restore MDS/OST size
687 MDSSIZE=${SAVED_MDSSIZE}
688 OSTSIZE=${SAVED_OSTSIZE}
689
690 # cleanup the system at last
691 formatall
692
693 complete $(basename $0) $SECONDS
694 exit_status