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