Whamcloud - gitweb
aa32eb721f1a79ab5f6a2489218d739f38927933
[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 8
326         # Fail the OI scrub to guarantee there is at least one checkpoint
327         #define OBD_FAIL_OSD_SCRUB_FATAL         0x192
328         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000192
329         sleep 4
330         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
331         [ "$STATUS" == "failed" ] ||
332                 error "(7) Expect 'failed', but got '$STATUS'"
333
334         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
335         do_facet $SINGLEMDS $LCTL set_param fail_val=3
336         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
337         # stat will re-trigger OI scrub
338         stat $DIR/$tdir/${tfile}800 ||
339                 error "(8) Fail to stat $DIR/$tdir/${tfile}800!"
340
341         umount_client $MOUNT || error "(9) Fail to stop client!"
342
343         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
344         [ "$STATUS" == "scanning" ] ||
345                 error "(10) Expect 'scanning', but got '$STATUS'"
346
347         #define OBD_FAIL_OSD_SCRUB_CRASH         0x191
348         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80000191
349         sleep 4
350         local POSITION0=$($SHOW_SCRUB | \
351                         awk '/^last_checkpoint_position/ {print $2}')
352         POSITION0=$((POSITION0 + 1))
353
354         echo "stop $SINGLEMDS"
355         stop $SINGLEMDS > /dev/null || error "(11) Fail to stop MDS!"
356
357         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
358         do_facet $SINGLEMDS $LCTL set_param fail_val=3
359         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
360         echo "start $SINGLEMDS without disabling OI scrub"
361         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
362                 error "(12) Fail to start MDS!"
363
364         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
365         [ "$STATUS" == "scanning" ] ||
366                 error "(13) Expect 'scanning', but got '$STATUS'"
367
368         local POSITION1=$($SHOW_SCRUB | \
369                         awk '/^latest_start_position/ {print $2}')
370         [ $POSITION0 -eq $POSITION1 ] ||
371                 error "(14) Expect position: $POSITION0, but got $POSITION1"
372
373         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
374         do_facet $SINGLEMDS $LCTL set_param fail_val=0
375         sleep 5
376         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
377         [ "$STATUS" == "completed" ] ||
378                 error "(15) Expect 'completed', but got '$STATUS'"
379
380         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
381         [ -z "$FLAGS" ] || error "(16) Expect empty flags, but got '$FLAGS'"
382 }
383 run_test 6 "OI scrub resumes from last checkpoint"
384
385 test_7() {
386         scrub_prep 500
387         mds_backup_restore || error "(1) Fail to backup/restore!"
388
389         echo "start $SINGLEMDS with disabling OI scrub"
390         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
391                 error "(2) Fail to start MDS!"
392
393         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
394         [ "$STATUS" == "init" ] ||
395                 error "(3) Expect 'init', but got '$STATUS'"
396
397         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
398         [ "$FLAGS" == "inconsistent" ] ||
399                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
400
401         mount_client $MOUNT || error "(5) Fail to start client!"
402
403         do_facet $SINGLEMDS \
404                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
405         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
406         do_facet $SINGLEMDS $LCTL set_param fail_val=3
407         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
408         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
409                 error "(6) File diff failed unexpected!"
410
411         stat $DIR/$tdir/${tfile}300 ||
412                 error "(7) Fail to stat $DIR/$tdir/${tfile}300!"
413
414         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
415         [ "$STATUS" == "scanning" ] ||
416                 error "(8) Expect 'scanning', but got '$STATUS'"
417
418         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
419         [ "$FLAGS" == "inconsistent,auto" ] ||
420                 error "(9) Expect 'inconsistent,auto', but got '$FLAGS'"
421
422         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
423         do_facet $SINGLEMDS $LCTL set_param fail_val=0
424         sleep 5
425         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
426         [ "$STATUS" == "completed" ] ||
427                 error "(10) Expect 'completed', but got '$STATUS'"
428
429         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
430         [ -z "$FLAGS" ] || error "(11) Expect empty flags, but got '$FLAGS'"
431 }
432 run_test 7 "System is available during OI scrub scanning"
433
434 test_8() {
435         scrub_prep 0
436         mds_backup_restore || error "(1) Fail to backup/restore!"
437
438         echo "start $SINGLEMDS with disabling OI scrub"
439         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
440                 error "(2) Fail to start MDS!"
441
442         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
443         [ "$STATUS" == "init" ] ||
444                 error "(3) Expect 'init', but got '$STATUS'"
445
446         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
447         [ "$FLAGS" == "inconsistent" ] ||
448                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
449
450         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
451         do_facet $SINGLEMDS $LCTL set_param fail_val=3
452         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
453         $START_SCRUB || error "(5) Fail to start OI scrub!"
454
455         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
456         [ "$STATUS" == "scanning" ] ||
457                 error "(6) Expect 'scanning', but got '$STATUS'"
458
459         $STOP_SCRUB || error "(7) Fail to stop OI scrub!"
460
461         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
462         [ "$STATUS" == "stopped" ] ||
463                 error "(8) Expect 'stopped', but got '$STATUS'"
464
465         $START_SCRUB || error "(9) Fail to start OI scrub!"
466
467         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
468         [ "$STATUS" == "scanning" ] ||
469                 error "(10) Expect 'scanning', but got '$STATUS'"
470
471         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
472         do_facet $SINGLEMDS $LCTL set_param fail_val=0
473         sleep 5
474         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
475         [ "$STATUS" == "completed" ] ||
476                 error "(11) Expect 'completed', but got '$STATUS'"
477
478         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
479         [ -z "$FLAGS" ] || error "(12) Expect empty flags, but got '$FLAGS'"
480 }
481 run_test 8 "Control OI scrub manually"
482
483 test_9() {
484         scrub_prep 8000
485         mds_backup_restore || error "(1) Fail to backup/restore!"
486
487         echo "start $SINGLEMDS with disabling OI scrub"
488         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
489                 error "(2) Fail to start MDS!"
490
491         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
492         [ "$STATUS" == "init" ] ||
493                 error "(3) Expect 'init', but got '$STATUS'"
494
495         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
496         [ "$FLAGS" == "inconsistent" ] ||
497                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
498
499         # OI scrub should run with full speed under inconsistent case
500         $START_SCRUB -s 100 || error "(5) Fail to start OI scrub!"
501
502         sleep 10
503         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
504         [ "$STATUS" == "completed" ] ||
505                 error "(6) Expect 'completed', but got '$STATUS'"
506
507         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
508         [ -z "$FLAGS" ] || error "(7) Expect empty flags, but got '$FLAGS'"
509
510         # OI scrub should run with limited speed under non-inconsistent case
511         $START_SCRUB -s 100 -r || error "(8) Fail to start OI scrub!"
512
513         sleep 10
514         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
515         [ "$STATUS" == "scanning" ] ||
516                 error "(9) Expect 'scanning', but got '$STATUS'"
517
518         # Do NOT ignore that there are 1024 pre-fetched items.
519         # So the max speed may be (1024 + 100 * 10) / 10.
520         # And there may be time error, so the max speed may be more large.
521         local SPEED=$($SHOW_SCRUB | awk '/^average_speed/ { print $2 }')
522         [ $SPEED -gt 220 ] &&
523                 error "(10) Unexpected speed $SPEED, should not more than 220"
524
525         # adjust speed limit
526         do_facet $SINGLEMDS \
527                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 300
528         sleep 10
529
530         SPEED=$($SHOW_SCRUB | awk '/^average_speed/ { print $2 }')
531         [ $SPEED -lt 220 ] &&
532                 error "(11) Unexpected speed $SPEED, should not less than 220"
533
534         # (1024 + 100 * 10 + 300 * 10) / 20
535         [ $SPEED -gt 270 ] &&
536                 error "(12) Unexpected speed $SPEED, should not more than 270"
537
538         do_facet $SINGLEMDS \
539                 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
540         sleep 6
541         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
542         [ "$STATUS" == "completed" ] ||
543                 error "(13) Expect 'completed', but got '$STATUS'"
544 }
545 run_test 9 "OI scrub speed control"
546
547 test_10a() {
548         scrub_prep 0
549         mds_backup_restore || error "(1) Fail to backup/restore!"
550
551         echo "start $SINGLEMDS with disabling OI scrub"
552         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
553                 error "(2) Fail to start MDS!"
554
555         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
556         [ "$STATUS" == "init" ] ||
557                 error "(3) Expect 'init', but got '$STATUS'"
558
559         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
560         [ "$FLAGS" == "inconsistent" ] ||
561                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
562
563         mount_client $MOUNT || error "(5) Fail to start client!"
564
565         do_facet $SINGLEMDS \
566                 $LCTL set_param -n osd-ldiskfs.${MDT_DEV}.auto_scrub 1
567         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
568         do_facet $SINGLEMDS $LCTL set_param fail_val=3
569         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
570         diff -q $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
571                 error "(6) File diff failed unexpected!"
572
573         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
574         [ "$STATUS" == "scanning" ] ||
575                 error "(7) Expect 'scanning', but got '$STATUS'"
576
577         umount_client $MOUNT || error "(8) Fail to stop client!"
578
579         echo "stop $SINGLEMDS"
580         stop $SINGLEMDS > /dev/null || error "(9) Fail to stop MDS!"
581
582         echo "start $SINGLEMDS with disabling OI scrub"
583         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
584                 error "(10) Fail to start MDS!"
585
586         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
587         [ "$STATUS" == "paused" ] ||
588                 error "(11) Expect 'paused', but got '$STATUS'"
589
590         echo "stop $SINGLEMDS"
591         stop $SINGLEMDS > /dev/null || error "(12) Fail to stop MDS!"
592
593         echo "start $SINGLEMDS without disabling OI scrub"
594         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
595                 error "(13) Fail to start MDS!"
596
597         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
598         [ "$STATUS" == "scanning" ] ||
599                 error "(14) Expect 'scanning', but got '$STATUS'"
600
601         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
602         do_facet $SINGLEMDS $LCTL set_param fail_val=0
603         sleep 5
604         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
605         [ "$STATUS" == "completed" ] ||
606                 error "(15) Expect 'completed', but got '$STATUS'"
607
608         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
609         [ -z "$FLAGS" ] || error "(16) Expect empty flags, but got '$FLAGS'"
610 }
611 run_test 10a "non-stopped OI scrub should auto restarts after MDS remount (1)"
612
613 test_10b() {
614         scrub_prep 0
615         mds_backup_restore || error "(1) Fail to backup/restore!"
616
617         echo "start $SINGLEMDS with disabling OI scrub"
618         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
619                 error "(2) Fail to start MDS!"
620
621         local STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
622         [ "$STATUS" == "init" ] ||
623                 error "(3) Expect 'init', but got '$STATUS'"
624
625         local FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
626         [ "$FLAGS" == "inconsistent" ] ||
627                 error "(4) Expect 'inconsistent', but got '$FLAGS'"
628
629         #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
630         do_facet $SINGLEMDS $LCTL set_param fail_val=3
631         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x190
632
633         $START_SCRUB || error "(5) Fail to start OI scrub!"
634
635         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
636         [ "$STATUS" == "scanning" ] ||
637                 error "(6) Expect 'scanning', but got '$STATUS'"
638
639         echo "stop $SINGLEMDS"
640         stop $SINGLEMDS > /dev/null || error "(7) Fail to stop MDS!"
641
642         echo "start $SINGLEMDS with disabling OI scrub"
643         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
644                 error "(8) Fail to start MDS!"
645
646         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
647         [ "$STATUS" == "paused" ] ||
648                 error "(9) Expect 'paused', but got '$STATUS'"
649
650         echo "stop $SINGLEMDS"
651         stop $SINGLEMDS > /dev/null || error "(10) Fail to stop MDS!"
652
653         echo "start $SINGLEMDS without disabling OI scrub"
654         start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
655                 error "(11) Fail to start MDS!"
656
657         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
658         [ "$STATUS" == "scanning" ] ||
659                 error "(12) Expect 'scanning', but got '$STATUS'"
660
661         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
662         do_facet $SINGLEMDS $LCTL set_param fail_val=0
663         sleep 5
664         STATUS=$($SHOW_SCRUB | awk '/^status/ { print $2 }')
665         [ "$STATUS" == "completed" ] ||
666                 error "(13) Expect 'completed', but got '$STATUS'"
667
668         FLAGS=$($SHOW_SCRUB | awk '/^flags/ { print $2 }')
669         [ -z "$FLAGS" ] || error "(14) Expect empty flags, but got '$FLAGS'"
670 }
671 run_test 10b "non-stopped OI scrub should auto restarts after MDS remount (2)"
672
673 # restore the ${facet}_MKFS_OPTS variables
674 for facet in MGS MDS OST; do
675         opts=SAVED_${facet}_MKFS_OPTS
676         if [[ -n ${!opts} ]]; then
677                 eval ${facet}_MKFS_OPTS=\"${!opts}\"
678         fi
679 done
680
681 # restore MDS/OST size
682 MDSSIZE=${SAVED_MDSSIZE}
683 OSTSIZE=${SAVED_OSTSIZE}
684
685 # cleanup the system at last
686 formatall
687
688 complete $(basename $0) $SECONDS
689 exit_status