Whamcloud - gitweb
LU-1538 tests: standardize test script init – failover
[fs/lustre-release.git] / lustre / tests / replay-vbr.sh
1 #!/bin/bash
2
3 set -e
4
5 MOUNT_2=${MOUNT_2:-"yes"}
6
7 LUSTRE=${LUSTRE:-$(dirname $0)/..}
8 . $LUSTRE/tests/test-framework.sh
9 init_test_env $@
10 init_logging
11
12 remote_mds_nodsh && log "SKIP: remote MDS with nodsh" && exit 0
13
14 ALWAYS_EXCEPT=" $REPLAY_VBR_EXCEPT"
15
16 #                                  ~6  (min)"
17 [ "$SLOW" = "no" ] && EXCEPT_SLOW="7 "
18
19 build_test_filter
20
21 check_and_setup_lustre
22
23 assert_DIR
24 rm -rf $DIR/[df][0-9]*
25
26 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
27
28 # if there is no CLIENT1 defined, some tests can be ran on localhost
29 CLIENT1=${CLIENT1:-$HOSTNAME}
30 # if CLIENT2 doesn't exist then use CLIENT1 instead
31 # All tests should use CLIENT2 with MOUNT2 only therefore it will work if
32 # $CLIENT2 == CLIENT1
33 # Exception is the test which need two separate nodes
34 CLIENT2=${CLIENT2:-$CLIENT1}
35
36 is_mounted $MOUNT2 || error "MOUNT2 is not mounted"
37
38 #
39 # get_version(): Gets the version of an object on servers
40 # Parameter1: Client/Machine Name
41 # Parameter2: File Path
42 # Returns: Objectversion Or -1 if getobjversion fails.
43 #
44 get_version() {
45         local var=${SINGLEMDS}_svc
46         local client=$1
47         local file=$2
48         local fid=$(do_node $client $LFS path2fid $file)
49         local objver=$(do_facet $SINGLEMDS $LCTL --device ${!var} \
50                 getobjversion \\\"$fid\\\")
51
52         [[ -z $objver ]] && objver=-1
53         echo $objver
54 }
55
56 #
57 # chk_get_version(): Wrapper to get_version().
58 # Parameter1: Client/Machine Name
59 # Parameter2: File Path
60 # Returns: Objectversion Or Exit with error in case objver is -1.
61 #
62 chk_get_version() {
63         local objver=$(get_version $1 $2)
64
65         [[ "$objver" == "-1" ]] && error "object version is empty."
66         echo $objver
67 }
68
69
70 #save COS setting
71 cos_param_file=$TMP/rvbr-cos-params
72 save_lustre_params $(get_facets MDS) "mdt.*.commit_on_sharing" > $cos_param_file
73
74 test_0a() {
75         local ver=$(get_version $CLIENT1 $DIR/$tdir/1a)
76
77         [[ "$ver" == "-1" ]] && return 0
78         return 1
79 }
80 run_test 0a "getversion for non existent file shouldn't cause kernel panic"
81
82 test_0b() {
83         local var=${SINGLEMDS}_svc
84         local fid
85         local file=$DIR/$tdir/f
86
87         do_node $CLIENT1 mkdir -p $DIR/$tdir/
88         do_node $CLIENT1 touch $file
89         fid=$(do_node $CLIENT1 $LFS path2fid $file)
90         do_node $CLIENT1 rm -rf $file
91         do_facet $SINGLEMDS $LCTL --device ${!var} getobjversion \\\"$fid\\\" || true
92 }
93 run_test 0b "getversion for non existent fid shouldn't cause kernel panic"
94
95 # test set #1: OPEN
96 test_1a() { # former test_0a
97         local file=$DIR/$tfile
98         local pre
99         local post
100
101         do_node $CLIENT1 mcreate $file
102         pre=$(chk_get_version $CLIENT1 $file)
103         do_node $CLIENT1 openfile -f O_RDWR $file
104         post=$(chk_get_version $CLIENT1 $file)
105         if (($pre != $post)); then
106                 error "version changed unexpectedly: pre $pre, post $post"
107         fi
108 }
109 run_test 1a "open and close do not change versions"
110
111 test_1b() { # former test_0b
112     local var=${SINGLEMDS}_svc
113     zconf_mount $CLIENT2 $MOUNT2
114
115     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
116     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
117     do_node $CLIENT1 mkdir -p -m 755 $MOUNT/$tdir
118
119     replay_barrier $SINGLEMDS
120     do_node $CLIENT2 chmod 777 $MOUNT2/$tdir
121     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT $MOUNT/$tdir/$tfile
122     zconf_umount $CLIENT2 $MOUNT2
123     facet_failover $SINGLEMDS
124
125     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
126     if ! do_node $CLIENT1 $CHECKSTAT -a $DIR/$tdir/$tfile; then
127                 error_and_remount "open succeeded unexpectedly"
128     fi
129 }
130 run_test 1b "open (O_CREAT) checks version of parent"
131
132 test_1c() { # former test_0c
133     local var=${SINGLEMDS}_svc
134     zconf_mount $CLIENT2 $MOUNT2
135
136     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
137     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
138
139     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
140     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $DIR/$tdir/$tfile
141
142     replay_barrier $SINGLEMDS
143     do_node $CLIENT2 chmod 0777 $MOUNT2/$tdir
144     do_node $CLIENT2 chmod 0666 $MOUNT2/$tdir/$tfile
145     rmultiop_start $CLIENT1 $DIR/$tdir/$tfile o_c
146     zconf_umount $CLIENT2 $MOUNT2
147     facet_failover $SINGLEMDS
148
149     client_up $CLIENT1 || error "$CLIENT1 evicted"
150     rmultiop_stop $CLIENT1 || error "close failed"
151 }
152 run_test 1c "open (non O_CREAT) does not checks versions"
153
154 # test set #2: CREAT (not open)
155 # - version of parent is not changed but checked
156 # - pre-version should be -1
157 # - post-version should be valid
158 test_2a() {  # extended former test_0d
159         local pre
160         local post
161
162         # fifo
163         pre=$(chk_get_version $CLIENT1 $DIR)
164         do_node $CLIENT1 mkfifo $DIR/$tfile-fifo
165         post=$(chk_get_version $CLIENT1 $DIR)
166         if (($pre != $post)); then
167                 error "version was changed: pre $pre, post $post"
168         fi
169         # mkdir
170         pre=$(chk_get_version $CLIENT1 $DIR)
171         do_node $CLIENT1 mkdir $DIR/$tfile-dir
172         post=$(chk_get_version $CLIENT1 $DIR)
173         if (($pre != $post)); then
174                 error "version was changed: pre $pre, post $post"
175         fi
176         do_node $CLIENT1 rmdir $DIR/$tfile-dir
177
178         # mknod
179         pre=$(chk_get_version $CLIENT1 $DIR)
180         do_node $CLIENT1 mkfifo $DIR/$tfile-nod
181         post=$(chk_get_version $CLIENT1 $DIR)
182         if (($pre != $post)); then
183                 error "version was changed: pre $pre, post $post"
184         fi
185         # symlink
186         pre=$(chk_get_version $CLIENT1 $DIR)
187         do_node $CLIENT1 mkfifo $DIR/$tfile-symlink
188         post=$(chk_get_version $CLIENT1 $DIR)
189         if (($pre != $post)); then
190                 error "version was changed: pre $pre, post $post"
191         fi
192         # remote directory
193         if [ $MDSCOUNT -ge 2 ]; then
194                 #create remote dir
195                 local MDT_IDX=1
196                 pre=$(chk_get_version $CLIENT1 $DIR)
197                 do_node $CLIENT1 $LFS mkdir -i $MDT_IDX $DIR/$tfile-remote_dir
198                 post=$(chk_get_version $CLIENT1 $DIR)
199                 if (($pre != $post)); then
200                         error "version was changed: pre $pre, post $post"
201                 fi
202         fi
203         do_node $CLIENT1 rm -rf $DIR/$tfile-*
204
205 }
206 run_test 2a "create operations doesn't change version of parent"
207
208 test_2b() { # former test_0e
209     local var=${SINGLEMDS}_svc
210     zconf_mount $CLIENT2 $MOUNT2
211
212     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
213     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
214
215     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
216
217     replay_barrier $SINGLEMDS
218     do_node $CLIENT2 chmod 777 $MOUNT2/$tdir
219     do_node $CLIENT1 mkfifo $DIR/$tdir/$tfile
220     zconf_umount $CLIENT2 $MOUNT2
221     facet_failover $SINGLEMDS
222
223     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
224     if ! do_node $CLIENT1 $CHECKSTAT -a $DIR/$tdir/$tfile; then
225                 error_and_remount "create succeeded unexpectedly"
226     fi
227 }
228 run_test 2b "create checks version of parent"
229
230 test_3a() { # former test_0f
231         local pre
232         local post
233
234         do_node $CLIENT1 mcreate $DIR/$tfile
235         pre=$(chk_get_version $CLIENT1 $DIR)
236         do_node $CLIENT1 rm $DIR/$tfile
237         post=$(chk_get_version $CLIENT1 $DIR)
238         if (($pre != $post)); then
239                 error "version was changed: pre $pre, post $post"
240         fi
241
242         if [ $MDSCOUNT -ge 2 ]; then
243                 #create remote dir
244                 local MDT_IDX=1
245                 do_node $CLIENT1 $LFS mkdir -i $MDT_IDX $DIR/$tfile-remote_dir
246                 pre=$(chk_get_version $CLIENT1 $DIR)
247                 do_node $CLIENT1 rmdir $DIR/$tfile-remote_dir
248                 post=$(chk_get_version $CLIENT1 $DIR)
249                 if (($pre != $post)); then
250                         error "version was changed: pre $pre, post $post"
251                 fi
252         fi
253 }
254 run_test 3a "unlink doesn't change version of parent"
255
256 test_3b() { # former test_0g
257     local var=${SINGLEMDS}_svc
258     zconf_mount $CLIENT2 $MOUNT2
259
260     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
261     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
262
263     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
264     do_node $CLIENT1 mcreate $DIR/$tdir/$tfile
265
266     replay_barrier $SINGLEMDS
267     do_node $CLIENT2 chmod 777 $MOUNT2/$tdir
268     do_node $CLIENT1 rm $DIR/$tdir/$tfile
269     zconf_umount $CLIENT2 $MOUNT2
270     facet_failover $SINGLEMDS
271
272     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
273     if do_node $CLIENT1 $CHECKSTAT -a $DIR/$tdir/$tfile; then
274                 error_and_remount "unlink succeeded unexpectedly"
275     fi
276 }
277 run_test 3b "unlink checks version of parent"
278
279 test_4a() { # former test_0h
280         local file=$DIR/$tfile
281         local pre
282         local post
283
284         do_node $CLIENT1 mcreate $file
285         pre=$(chk_get_version $CLIENT1 $file)
286         do_node $CLIENT1 chown $RUNAS_ID:$RUNAS_GID $file
287         post=$(chk_get_version $CLIENT1 $file)
288         if (($pre == $post)); then
289                 error "version not changed: pre $pre, post $post"
290         fi
291 }
292 run_test 4a "setattr of UID changes versions"
293
294 test_4b() { # former test_0i
295         local file=$DIR/$tfile
296         local pre
297         local post
298
299         do_node $CLIENT1 mcreate $file
300         pre=$(chk_get_version $CLIENT1 $file)
301         do_node $CLIENT1 chgrp $RUNAS_GID $file
302         post=$(chk_get_version $CLIENT1 $file)
303         if (($pre == $post)); then
304                 error "version not changed: pre $pre, post $post"
305         fi
306 }
307 run_test 4b "setattr of GID changes versions"
308
309 test_4c() { # former test_0j
310     local file=$DIR/$tfile
311     local var=${SINGLEMDS}_svc
312     zconf_mount $CLIENT2 $MOUNT2
313
314     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
315     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
316
317     do_node $CLIENT1 mcreate $file
318
319     replay_barrier $SINGLEMDS
320     do_node $CLIENT2 chgrp $RUNAS_GID $MOUNT2/$tfile
321     do_node $CLIENT1 chown $RUNAS_ID:$RUNAS_GID $file
322     zconf_umount $CLIENT2 $MOUNT2
323     facet_failover $SINGLEMDS
324
325     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
326     if ! do_node $CLIENT1 $CHECKSTAT -u \\\#$UID $file; then
327                 error_and_remount "setattr of UID succeeded unexpectedly"
328     fi
329 }
330 run_test 4c "setattr of UID checks versions"
331
332 test_4d() { # former test_0k
333     local file=$DIR/$tfile
334     local var=${SINGLEMDS}_svc
335     zconf_mount $CLIENT2 $MOUNT2
336
337     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
338     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
339
340     do_node $CLIENT1 mcreate $file
341
342     replay_barrier $SINGLEMDS
343     do_node $CLIENT2 chown $RUNAS_ID:$RUNAS_GID $MOUNT2/$tfile
344     do_node $CLIENT1 chgrp $RUNAS_GID $file
345     zconf_umount $CLIENT2 $MOUNT2
346     facet_failover $SINGLEMDS
347
348     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
349     if ! do_node $CLIENT1 $CHECKSTAT -g \\\#$UID $file; then
350                 error_and_remount "setattr of GID succeeded unexpectedly"
351     fi
352 }
353 run_test 4d "setattr of GID checks versions"
354
355 test_4e() { # former test_0l
356         local file=$DIR/$tfile
357         local pre
358         local post
359
360         do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $file
361         pre=$(chk_get_version $CLIENT1 $file)
362         do_node $CLIENT1 chmod 666 $file
363         post=$(chk_get_version $CLIENT1 $file)
364         if (($pre == $post)); then
365                 error "version not changed: pre $pre, post $post"
366         fi
367 }
368 run_test 4e "setattr of permission changes versions"
369
370 test_4f() { # former test_0m
371     local file=$DIR/$tfile
372     local var=${SINGLEMDS}_svc
373     zconf_mount $CLIENT2 $MOUNT2
374
375     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
376     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
377
378     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $file
379
380     replay_barrier $SINGLEMDS
381     do_node $CLIENT2 chgrp $RUNAS_GID $MOUNT2/$tfile
382     do_node $CLIENT1 chmod 666 $file
383     zconf_umount $CLIENT2 $MOUNT2
384     facet_failover $SINGLEMDS
385
386     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
387     if ! do_node $CLIENT1 $CHECKSTAT -p 0644 $file; then
388                 error_and_remount "setattr of permission succeeded unexpectedly"
389     fi
390 }
391 run_test 4f "setattr of permission checks versions"
392
393 test_4g() { # former test_0n
394         local file=$DIR/$tfile
395         local pre
396         local post
397
398         do_node $CLIENT1 mcreate $file
399         pre=$(chk_get_version $CLIENT1 $file)
400         do_node $CLIENT1 chattr +i $file
401         post=$(chk_get_version $CLIENT1 $file)
402         do_node $CLIENT1 chattr -i $file
403         if (($pre == $post)); then
404                 error "version not changed: pre $pre, post $post"
405         fi
406 }
407 run_test 4g "setattr of flags changes versions"
408
409 checkattr() {
410     local client=$1
411     local attr=$2
412     local file=$3
413     local rc
414
415     if ((${#attr} != 1)); then
416         error "checking multiple attributes not implemented yet"
417     fi
418     do_node $client lsattr $file | cut -d ' ' -f 1 | grep -q $attr
419 }
420
421 test_4h() { # former test_0o
422     local file=$DIR/$tfile
423     local rc
424     local var=${SINGLEMDS}_svc
425     zconf_mount $CLIENT2 $MOUNT2
426
427     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
428     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
429
430     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $file
431
432     replay_barrier $SINGLEMDS
433     do_node $CLIENT2 chmod 666 $MOUNT2/$tfile
434     do_node $CLIENT1 chattr +i $file
435     zconf_umount $CLIENT2 $MOUNT2
436     facet_failover $SINGLEMDS
437
438     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
439     checkattr $CLIENT1 i $file
440     rc=$?
441     do_node $CLIENT1 chattr -i $file
442     if [ $rc -eq 0 ]; then
443         error "setattr of flags succeeded unexpectedly"
444     fi
445 }
446 run_test 4h "setattr of flags checks versions"
447
448 test_4i() { # former test_0p
449         local file=$DIR/$tfile
450         local pre
451         local post
452         local ad_orig
453         local var=${SINGLEMDS}_svc
454
455         ad_orig=$(do_facet $SINGLEMDS "$LCTL get_param mdd.${!var}.atime_diff")
456         do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.atime_diff=0"
457         do_node $CLIENT1 mcreate $file
458         pre=$(chk_get_version $CLIENT1 $file)
459         do_node $CLIENT1 touch $file
460         post=$(chk_get_version $CLIENT1 $file)
461         #
462         # We don't fail MDS in this test.  atime_diff shall be
463         # restored to its original value.
464         #
465         do_facet $SINGLEMDS "$LCTL set_param $ad_orig"
466         if (($pre != $post)); then
467                 error "version changed unexpectedly: pre $pre, post $post"
468         fi
469 }
470 run_test 4i "setattr of times does not change versions"
471
472 test_4j() { # former test_0q
473         local file=$DIR/$tfile
474         local pre
475         local post
476
477         do_node $CLIENT1 mcreate $file
478         pre=$(chk_get_version $CLIENT1 $file)
479         do_node $CLIENT1 $TRUNCATE $file 1
480         post=$(chk_get_version $CLIENT1 $file)
481         if (($pre != $post)); then
482                 error "version changed unexpectedly: pre $pre, post $post"
483         fi
484 }
485 run_test 4j "setattr of size does not change versions"
486
487 test_4k() { # former test_0r
488     local file=$DIR/$tfile
489     local mtime_pre
490     local mtime_post
491     local mtime
492     local var=${SINGLEMDS}_svc
493     zconf_mount $CLIENT2 $MOUNT2
494
495     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
496     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.atime_diff=0"
497     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
498
499     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $file
500
501     replay_barrier $SINGLEMDS
502     do_node $CLIENT2 chmod 666 $MOUNT2/$tfile
503     do_node $CLIENT1 $TRUNCATE $file 1
504     sleep 1
505     mtime_pre=$(do_node $CLIENT1 stat --format=%Y $file)
506     do_node $CLIENT1 touch $file
507     sleep 1 # avoid stat caching
508     mtime_post=$(do_node $CLIENT1 stat --format=%Y $file)
509     zconf_umount $CLIENT2 $MOUNT2
510     facet_failover $SINGLEMDS
511
512     client_up $CLIENT1 || error "$CLIENT1 evicted"
513     if (($mtime_pre >= $mtime_post)); then
514         error "time not changed: pre $mtime_pre, post $mtime_post"
515     fi
516     if ! do_node $CLIENT1 $CHECKSTAT -s 1 $file; then
517                 error_and_remount "setattr of size failed"
518     fi
519     mtime=$(do_node $CLIENT1 stat --format=%Y $file)
520     if (($mtime != $mtime_post)); then
521         error "setattr of times failed: expected $mtime_post, got $mtime"
522     fi
523 }
524 run_test 4k "setattr of times and size does not check versions"
525
526 test_5a() { # former test_0s
527         local pre
528         local post
529         local tp_pre
530         local tp_post
531
532         do_node $CLIENT1 mcreate $DIR/$tfile
533         do_node $CLIENT1 mkdir -p $DIR/$tdir
534         pre=$(chk_get_version $CLIENT1 $DIR/$tfile)
535         tp_pre=$(chk_get_version $CLIENT1 $DIR/$tdir)
536         do_node $CLIENT1 link $DIR/$tfile $DIR/$tdir/$tfile
537         post=$(chk_get_version $CLIENT1 $DIR/$tfile)
538         tp_post=$(chk_get_version $CLIENT1 $DIR/$tdir)
539         if (($pre == $post)); then
540                 error "version of source not changed: pre $pre, post $post"
541         fi
542         if (($tp_pre != $tp_post)); then
543                 error "version of target parent was changed:"\
544                         "pre $tp_pre, post $tp_post"
545         fi
546 }
547 run_test 5a "link changes versions of source but not target parent"
548
549 test_5b() { # former test_0t
550     local var=${SINGLEMDS}_svc
551     zconf_mount $CLIENT2 $MOUNT2
552
553     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
554     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
555
556     do_node $CLIENT1 mcreate $DIR/$tfile
557     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
558
559     replay_barrier $SINGLEMDS
560     do_node $CLIENT2 chmod 777 $MOUNT2/$tdir
561     do_node $CLIENT1 link $DIR/$tfile $DIR/$tdir/$tfile
562     zconf_umount $CLIENT2 $MOUNT2
563     facet_failover $SINGLEMDS
564
565     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
566     if ! do_node $CLIENT1 $CHECKSTAT -a $DIR/$tdir/$tfile; then
567                 error_and_remount "link should fail"
568     fi
569 }
570 run_test 5b "link checks version of target parent"
571
572 test_5c() { # former test_0u
573     local var=${SINGLEMDS}_svc
574     zconf_mount $CLIENT2 $MOUNT2
575
576     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
577     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
578
579     do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $DIR/$tfile
580     do_node $CLIENT1 mkdir -p $DIR/$tdir
581
582     replay_barrier $SINGLEMDS
583     do_node $CLIENT2 chmod 666 $MOUNT2/$tfile
584     do_node $CLIENT1 link $DIR/$tfile $DIR/$tdir/$tfile
585     zconf_umount $CLIENT2 $MOUNT2
586     facet_failover $SINGLEMDS
587
588     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
589     if ! do_node $CLIENT1 $CHECKSTAT -a $DIR/$tdir/$tfile; then
590                 error_and_remount "link should fail"
591     fi
592 }
593 run_test 5c "link checks version of source"
594
595 test_6a() { # former test_0v
596         local sp_pre
597         local tp_pre
598         local sp_post
599         local tp_post
600
601         do_node $CLIENT1 mcreate $DIR/$tfile
602         do_node $CLIENT1 mkdir -p $DIR/$tdir
603         sp_pre=$(chk_get_version $CLIENT1 $DIR)
604         tp_pre=$(chk_get_version $CLIENT1 $DIR/$tdir)
605         do_node $CLIENT1 mv $DIR/$tfile $DIR/$tdir/$tfile
606         sp_post=$(chk_get_version $CLIENT1 $DIR)
607         tp_post=$(chk_get_version $CLIENT1 $DIR/$tdir)
608         if (($sp_pre != $sp_post)); then
609                 error "version of source parent was changed:" \
610                         "pre $sp_pre, post $sp_post"
611         fi
612         if (($tp_pre != $tp_post)); then
613                 error "version of target parent was changed:" \
614                         "pre $tp_pre, post $tp_post"
615         fi
616 }
617 run_test 6a "rename doesn't change versions of source parent and target parent"
618
619 test_6b() { # former test_0w
620         local pre
621         local post
622
623         do_node $CLIENT1 mcreate $DIR/$tfile
624         pre=$(chk_get_version $CLIENT1 $DIR)
625         do_node $CLIENT1 mv $DIR/$tfile $DIR/$tfile-new
626         post=$(chk_get_version $CLIENT1 $DIR)
627         if (($pre != $post)); then
628                 error "version of parent was changed: pre $pre, post $post"
629         fi
630 }
631 run_test 6b "rename within same dir doesn't change version of parent"
632
633 test_6c() { # former test_0x
634     local var=${SINGLEMDS}_svc
635     zconf_mount $CLIENT2 $MOUNT2
636
637     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
638     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
639
640     do_node $CLIENT1 mcreate $DIR/$tfile
641     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
642
643     replay_barrier $SINGLEMDS
644     do_node $CLIENT2 chmod 777 $MOUNT2
645     do_node $CLIENT1 mv $DIR/$tfile $DIR/$tdir/$tfile
646     zconf_umount $CLIENT2 $MOUNT2
647     facet_failover $SINGLEMDS
648
649     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
650     if do_node $CLIENT1 $CHECKSTAT -a $DIR/$tfile; then
651                 error_and_remount "rename should fail"
652     fi
653 }
654 run_test 6c "rename checks version of source parent"
655
656 test_6d() { # former test_0y
657     local var=${SINGLEMDS}_svc
658     zconf_mount $CLIENT2 $MOUNT2
659
660     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
661     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
662
663     do_node $CLIENT1 mcreate $DIR/$tfile
664     do_node $CLIENT1 mkdir -p -m 755 $DIR/$tdir
665
666     replay_barrier $SINGLEMDS
667     do_node $CLIENT2 chmod 777 $MOUNT2/$tdir
668     do_node $CLIENT1 mv $DIR/$tfile $DIR/$tdir/$tfile
669     zconf_umount $CLIENT2 $MOUNT2
670     facet_failover $SINGLEMDS
671
672     client_evicted $CLIENT1 || error "$CLIENT1 not evicted"
673     if do_node $CLIENT1 $CHECKSTAT -a $DIR/$tfile; then
674                 error_and_remount "rename should fail"
675     fi
676 }
677 run_test 6d "rename checks version of target parent"
678
679 # pdirops tests, bug 18143
680 cycle=0
681 test_7_cycle() {
682     local first=$1
683     local lost=$2
684     local last=$3
685     local rc=0
686     local var=${SINGLEMDS}_svc
687     zconf_mount $CLIENT2 $MOUNT2
688     cycle=$((cycle + 1))
689     local cname=$TESTNAME.$cycle
690
691     echo "start cycle: $cname"
692     do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
693     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
694
695     do_node $CLIENT1 mkdir -p $DIR/$tdir
696     replay_barrier $SINGLEMDS
697     # first operation
698     echo "$cname first: $first"
699     do_node $CLIENT1 $first || error "$cname: Cannot do first operation"
700     # client2 operations that will be lost
701     echo "$cname lost: $lost"
702     do_node $CLIENT2 $lost || error "$cname: Cannot do 'lost' operations"
703     # second operation
704     echo "$cname last: $last"
705     do_node $CLIENT1 $last || error "$cname: Cannot do last operation"
706     zconf_umount $CLIENT2 $MOUNT2
707     facet_failover $SINGLEMDS
708     # should fail as conflict expected
709     client_evicted $CLIENT1 || rc=1
710
711         wait_recovery_complete $SINGLEMDS
712         wait_mds_ost_sync || error "wait_mds_ost_sync failed"
713
714         rm -rf $DIR/$tdir
715         return $rc
716 }
717
718 test_7a() {
719     first="createmany -o $DIR/$tdir/$tfile- 1"
720     lost="rm $MOUNT2/$tdir/$tfile-0"
721     last="createmany -o $DIR/$tdir/$tfile- 1"
722     test_7_cycle "$first" "$lost" "$last" || error "Test 7a.1 failed"
723
724     first="createmany -o $DIR/$tdir/$tfile- 1"
725     lost="rm $MOUNT2/$tdir/$tfile-0"
726     last="mkdir $DIR/$tdir/$tfile-0"
727     test_7_cycle "$first" "$lost" "$last" || error "Test 7a.2 failed"
728
729     first="mkdir $DIR/$tdir/$tfile-0"
730     lost="mv $MOUNT2/$tdir/$tfile-0 $MOUNT2/$tdir/$tfile-1"
731     last="createmany -o $DIR/$tdir/$tfile- 1"
732     test_7_cycle "$first" "$lost" "$last" || error "Test 7a.3 failed"
733     return 0
734 }
735 run_test 7a "create, {lost}, create"
736
737 test_7b() {
738     first="createmany -o $DIR/$tdir/$tfile- 1"
739     lost="rm $MOUNT2/$tdir/$tfile-0; createmany -o $MOUNT2/$tdir/$tfile- 1"
740     last="rm $DIR/$tdir/$tfile-0"
741     test_7_cycle "$first" "$lost" "$last" || error "Test 7b.1 failed"
742
743     first="createmany -o $DIR/$tdir/$tfile- 1"
744     lost="touch $MOUNT2/$tdir/$tfile; mv $MOUNT2/$tdir/$tfile $MOUNT2/$tdir/$tfile-0"
745     last="rm $DIR/$tdir/$tfile-0"
746     test_7_cycle "$first" "$lost" "$last" || error "Test 7b.2 failed"
747
748     first="createmany -o $DIR/$tdir/$tfile- 1"
749     lost="rm $MOUNT2/$tdir/$tfile-0; mkdir $MOUNT2/$tdir/$tfile-0"
750     last="rmdir $DIR/$tdir/$tfile-0"
751     test_7_cycle "$first" "$lost" "$last" || error "Test 7b.3 failed"
752     return 0
753 }
754 run_test 7b "create, {lost}, unlink"
755
756 test_7c() {
757     first="createmany -o $DIR/$tdir/$tfile- 1"
758     lost="rm $MOUNT2/$tdir/$tfile-0; createmany -o $MOUNT2/$tdir/$tfile- 1"
759     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile"
760     test_7_cycle "$first" "$lost" "$last" || error "Test 7c.1 failed"
761
762     first="createmany -o $DIR/$tdir/$tfile- 2"
763     lost="rm $MOUNT2/$tdir/$tfile-0; mkdir $MOUNT2/$tdir/$tfile-0"
764     last="mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
765     test_7_cycle "$first" "$lost" "$last" || error "Test 7c.2 failed"
766
767     first="createmany -o $DIR/$tdir/$tfile- 1; mkdir $DIR/$tdir/$tfile-1-0"
768     lost="rmdir $MOUNT2/$tdir/$tfile-1-0; createmany -o $MOUNT2/$tdir/$tfile-1- 1"
769     last="mv $DIR/$tdir/$tfile-1-0 $DIR/$tdir/$tfile-0"
770     test_7_cycle "$first" "$lost" "$last" || error "Test 7c.3 failed"
771
772     first="createmany -o $DIR/$tdir/$tfile- 1"
773     lost="mv $MOUNT2/$tdir/$tfile-0 $MOUNT2/$tdir/$tfile"
774     last="mv $DIR/$tdir/$tfile $DIR/$tdir/$tfile-0"
775     test_7_cycle "$first" "$lost" "$last" || error "Test 7c.4 failed"
776     return 0
777 }
778 run_test 7c "create, {lost}, rename"
779
780 test_7d() {
781     first="createmany -o $DIR/$tdir/$tfile- 1; rm $DIR/$tdir/$tfile-0"
782     lost="createmany -o $MOUNT2/$tdir/$tfile- 1; rm $MOUNT2/$tdir/$tfile-0"
783     last="createmany -o $DIR/$tdir/$tfile- 1"
784     test_7_cycle "$first" "$lost" "$last" && error "Test 7d.1 failed"
785
786     first="createmany -o $DIR/$tdir/$tfile- 1; rm $DIR/$tdir/$tfile-0"
787     lost="mkdir $MOUNT2/$tdir/$tfile-0; rmdir $MOUNT2/$tdir/$tfile-0"
788     last="mkdir $DIR/$tdir/$tfile-0"
789     test_7_cycle "$first" "$lost" "$last" && error "Test 7d.2 failed"
790
791     first="mkdir $DIR/$tdir/$tfile-0; rmdir $DIR/$tdir/$tfile-0"
792     lost="createmany -o $MOUNT2/$tdir/$tfile- 1; mv $MOUNT2/$tdir/$tfile-0 $MOUNT2/$tdir/$tfile-1"
793     last="createmany -o $DIR/$tdir/$tfile- 1"
794     test_7_cycle "$first" "$lost" "$last" && error "Test 7d.3 failed"
795     return 0
796 }
797 run_test 7d "unlink, {lost}, create"
798
799 test_7e() {
800     first="createmany -o $DIR/$tdir/$tfile- 1; rm $DIR/$tdir/$tfile-0"
801     lost="createmany -o $MOUNT2/$tdir/$tfile- 1; rm $MOUNT2/$tdir/$tfile-0;createmany -o $MOUNT2/$tdir/$tfile- 1"
802     last="rm $DIR/$tdir/$tfile-0"
803     test_7_cycle "$first" "$lost" "$last" || error "Test 7e.1 failed"
804
805     first="mkdir $DIR/$tdir/$tfile-0; rmdir $DIR/$tdir/$tfile-0"
806     lost="mkdir $MOUNT2/$tdir/$tfile-0; rmdir $MOUNT2/$tdir/$tfile-0; mkdir $MOUNT2/$tdir/$tfile-0"
807     last="rmdir $DIR/$tdir/$tfile-0"
808     test_7_cycle "$first" "$lost" "$last" || error "Test 7e.2 failed"
809
810     first="createmany -o $DIR/$tdir/$tfile- 1; rm $DIR/$tdir/$tfile-0"
811     lost="mkdir $MOUNT2/$tdir/$tfile-0"
812     last="rmdir $DIR/$tdir/$tfile-0"
813     test_7_cycle "$first" "$lost" "$last" || error "Test 7e.3 failed"
814
815     first="mkdir $DIR/$tdir/$tfile-0; rmdir $DIR/$tdir/$tfile-0"
816     lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
817     last="rm $DIR/$tdir/$tfile-0"
818     test_7_cycle "$first" "$lost" "$last" || error "Test 7e.4 failed"
819
820     first="createmany -o $DIR/$tdir/$tfile- 2; rm $DIR/$tdir/$tfile-0"
821     lost="mv $MOUNT2/$tdir/$tfile-1 $MOUNT2/$tdir/$tfile-0"
822     last="rm $DIR/$tdir/$tfile-0"
823     test_7_cycle "$first" "$lost" "$last" || error "Test 7e.5 failed"
824     return 0
825 }
826 run_test 7e "unlink, {lost}, unlink"
827
828 test_7f() {
829     first="createmany -o $DIR/$tdir/$tfile- 1; rm $DIR/$tdir/$tfile-0"
830     lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
831     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
832     test_7_cycle "$first" "$lost" "$last" || error "Test 7f.1 failed"
833
834     first="createmany -o $DIR/$tdir/$tfile- 2; rm $DIR/$tdir/$tfile-0"
835     lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
836     last="mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
837     test_7_cycle "$first" "$lost" "$last" || error "Test 7f.2 failed"
838
839     first="mkdir $DIR/$tdir/$tfile; createmany -o $DIR/$tdir/$tfile- 1; rmdir $DIR/$tdir/$tfile"
840     lost="mkdir $MOUNT2/$tdir/$tfile"
841     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile"
842     test_7_cycle "$first" "$lost" "$last" || error "Test 7f.3 failed"
843
844     first="createmany -o $DIR/$tdir/$tfile- 2; rm $DIR/$tdir/$tfile-0"
845     lost="mv $MOUNT2/$tdir/$tfile-1 $MOUNT2/$tdir/$tfile-0"
846     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
847     test_7_cycle "$first" "$lost" "$last" || error "Test 7f.4 failed"
848
849     first="createmany -o $DIR/$tdir/$tfile- 2; rm $DIR/$tdir/$tfile-0"
850     lost="mkdir $MOUNT2/$tdir/$tfile-0"
851     last="mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
852     test_7_cycle "$first" "$lost" "$last" || error "Test 7f.5 failed"
853     return 0
854 }
855 run_test 7f "unlink, {lost}, rename"
856
857 test_7g() {
858         first="createmany -o $DIR/$tdir/$tfile- 1; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
859         lost="mkdir $MOUNT2/$tdir/$tfile-0;rmdir $MOUNT2/$tdir/$tfile-0"
860         last="createmany -o $DIR/$tdir/$tfile- 1"
861         test_7_cycle "$first" "$lost" "$last" && error "Test 7g.1 failed"
862
863         first="createmany -o $DIR/$tdir/$tfile- 2; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
864         lost="createmany -o $MOUNT2/$tdir/$tfile- 1; rm $MOUNT2/$tdir/$tfile-0"
865         last="mkdir $DIR/$tdir/$tfile-0"
866         test_7_cycle "$first" "$lost" "$last" && error "Test 7g.2 failed"
867
868         first="createmany -o $DIR/$tdir/$tfile- 1; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile"
869         lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
870         last="link $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
871         if [ "$MDS1_VERSION" -lt $(version_code 2.5.1) ]; then
872                 test_7_cycle "$first" "$lost" "$last" ||
873                         error "Test 7g.3 failed"
874         else #LU-4442 LU-3528
875                 test_7_cycle "$first" "$lost" "$last" &&
876                         error "Test 7g.3 failed"
877         fi
878     return 0
879 }
880 run_test 7g "rename, {lost}, create"
881
882 test_7h() {
883     first="createmany -o $DIR/$tdir/$tfile- 1; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
884     lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
885     last="rm $DIR/$tdir/$tfile-0"
886     test_7_cycle "$first" "$lost" "$last" || error "Test 7h.1 failed"
887
888     first="createmany -o $DIR/$tdir/$tfile- 2; mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
889     lost="rm $MOUNT2/$tdir/$tfile-0; createmany -o $MOUNT2/$tdir/$tfile- 1"
890     last="rm $DIR/$tdir/$tfile-0"
891     test_7_cycle "$first" "$lost" "$last" || error "Test 7h.2 failed"
892
893     first="createmany -o $DIR/$tdir/$tfile- 1; mkdir  $DIR/$tdir/$tfile; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile"
894     lost="rm $MOUNT2/$tdir/$tfile/$tfile-0"
895     last="rmdir $DIR/$tdir/$tfile"
896     #test_7_cycle "$first" "$lost" "$last" || error "Test 7h.3 failed"
897     return 0
898 }
899 run_test 7h "rename, {lost}, unlink"
900
901 test_7i() {
902     first="createmany -o $DIR/$tdir/$tfile- 1; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
903     lost="createmany -o $MOUNT2/$tdir/$tfile- 1"
904     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
905     test_7_cycle "$first" "$lost" "$last" || error "Test 7i.1 failed"
906
907     first="createmany -o $DIR/$tdir/$tfile- 1; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-1"
908     lost="mkdir $MOUNT2/$tdir/$tfile-0"
909     last="mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
910     test_7_cycle "$first" "$lost" "$last" || error "Test 7i.1 failed"
911
912     first="createmany -o $DIR/$tdir/$tfile- 3; mv $DIR/$tdir/$tfile-1 $DIR/$tdir/$tfile-0"
913     lost="mv $MOUNT2/$tdir/$tfile-2 $MOUNT2/$tdir/$tfile-0"
914     last="mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile-2"
915     test_7_cycle "$first" "$lost" "$last" || error "Test 7i.3 failed"
916
917     first="createmany -o $DIR/$tdir/$tfile- 2; mv $DIR/$tdir/$tfile-0 $DIR/$tdir/$tfile"
918     lost="rm $MOUNT2/$tdir/$tfile-1"
919     last="mv $DIR/$tdir/$tfile $DIR/$tdir/$tfile-1"
920     test_7_cycle "$first" "$lost" "$last" || error "Test 7i.4 failed"
921     return 0
922 }
923 run_test 7i "rename, {lost}, rename"
924
925 # test set #8: orphan handling bug 15392.
926 # Unlink during recovery creates orphan always just in case some late open may
927 # arrive. These orphans will be removed after recovery anyway.
928 # Tests check that valid create,unlink,create sequence will work in this case
929 # too but not fail on second create due to orphan found.
930
931 test_8a() {
932     local var=${SINGLEMDS}_svc
933     zconf_mount $CLIENT2 $MOUNT2
934
935     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
936
937     do_node $CLIENT1 mcreate $DIR/$tfile
938     do_node $CLIENT1 mkdir $DIR/$tfile-2
939     replay_barrier $SINGLEMDS
940     # missed replay from client2 will lead to recovery by versions
941     do_node $CLIENT2 touch $MOUNT2/$tfile-2/$tfile
942     do_node $CLIENT1 rm $DIR/$tfile || return 1
943     do_node $CLIENT1 touch $DIR/$tfile || return 2
944
945     zconf_umount $CLIENT2 $MOUNT2
946     facet_failover $SINGLEMDS
947     client_up $CLIENT1 || return 6
948
949     do_node $CLIENT1 rm $DIR/$tfile || error "$tfile doesn't exists"
950     return 0
951 }
952 run_test 8a "create | unlink, create shouldn't fail"
953
954 test_8b() {
955     local var=${SINGLEMDS}_svc
956     zconf_mount $CLIENT2 $MOUNT2
957
958     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
959
960     do_node $CLIENT1 touch $DIR/$tfile
961     do_node $CLIENT1 mkdir $DIR/$tfile-2
962     replay_barrier $SINGLEMDS
963     # missed replay from client2 will lead to recovery by versions
964     do_node $CLIENT2 touch $MOUNT2/$tfile-2/$tfile
965     do_node $CLIENT1 rm -f $MOUNT1/$tfile || return 1
966     do_node $CLIENT1 mcreate $MOUNT1/$tfile || return 2
967
968     zconf_umount $CLIENT2 $MOUNT2
969     facet_failover $SINGLEMDS
970     client_up $CLIENT1 || return 6
971
972     do_node $CLIENT1 rm $MOUNT1/$tfile || error "$tfile doesn't exists"
973     return 0
974 }
975 run_test 8b "create | unlink, create shouldn't fail"
976
977 test_8c() {
978     local var=${SINGLEMDS}_svc
979     zconf_mount $CLIENT2 $MOUNT2
980
981     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
982
983     do_node $CLIENT1 touch $DIR/$tfile
984     do_node $CLIENT1 mkdir $DIR/$tfile-2
985     replay_barrier $SINGLEMDS
986     # missed replay from client2 will lead to recovery by versions
987     do_node $CLIENT2 touch $MOUNT2/$tfile-2/$tfile
988     do_node $CLIENT1 rm -f $MOUNT1/$tfile || return 1
989     do_node $CLIENT1 mkdir $MOUNT1/$tfile || return 2
990
991     zconf_umount $CLIENT2 $MOUNT2
992     facet_failover $SINGLEMDS
993     client_up $CLIENT1 || return 6
994
995     do_node $CLIENT1 rmdir $MOUNT1/$tfile || error "$tfile doesn't exists"
996     return 0
997 }
998 run_test 8c "create | unlink, create shouldn't fail"
999
1000 #
1001 # This test uses three Lustre clients on two hosts.
1002 #
1003 #   Lustre Client 1:    $CLIENT1:$MOUNT     ($DIR)
1004 #   Lustre Client 2:    $CLIENT2:$MOUNT2    ($DIR2)
1005 #   Lustre Client 3:    $CLIENT2:$MOUNT1    ($DIR1)
1006 #
1007 test_10b() { # former test_2b
1008         local pre
1009         local post
1010         local var=${SINGLEMDS}_svc
1011
1012         [ -n "$CLIENTS" ] || { skip "Need two or more clients" && exit 0; }
1013         [ $CLIENTCOUNT -ge 2 ] || \
1014                 { skip "Need two or more clients, have $CLIENTCOUNT" && \
1015                         exit 0; }
1016
1017         do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
1018         do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
1019
1020         zconf_mount $CLIENT1 $MOUNT
1021         zconf_mount $CLIENT2 $MOUNT1
1022         zconf_mount $CLIENT2 $MOUNT2
1023         do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $DIR/$tfile-a
1024         do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $DIR/$tfile-b
1025
1026         #
1027         # Save an MDT transaction number before recovery.
1028         #
1029         do_node $CLIENT1 touch $DIR1/$tfile
1030         pre=$(chk_get_version $CLIENT1 $DIR/$tfile)
1031
1032         #
1033         # Comments on the replay sequence state the expected result
1034         # of each request.
1035         #
1036         #   "R"     Replayed.
1037         #   "U"     Unable to replay.
1038         #   "J"     Rejected.
1039         #
1040         replay_barrier $SINGLEMDS
1041         do_node $CLIENT1 chmod 666 $DIR/$tfile-a            # R
1042         do_node $CLIENT2 chmod 666 $DIR1/$tfile-b           # R
1043         do_node $CLIENT2 chgrp $RUNAS_GID $DIR2/$tfile-a    # U
1044         do_node $CLIENT1 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile-a      # J
1045         do_node $CLIENT2 $TRUNCATE $DIR2/$tfile-b 1          # U
1046         do_node $CLIENT2 chgrp $RUNAS_GID $DIR1/$tfile-b    # R
1047         do_node $CLIENT1 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile-b      # R
1048         zconf_umount $CLIENT2 $MOUNT2
1049         facet_failover $SINGLEMDS
1050
1051         client_evicted $CLIENT1 || error "$CLIENT1:$MOUNT not evicted"
1052         client_up $CLIENT2 || error "$CLIENT2:$MOUNT1 evicted"
1053
1054         #
1055         # Check the MDT epoch.  $post must be the first transaction
1056         # number assigned after recovery.
1057         #
1058         do_node $CLIENT2 chmod 666 $DIR1/$tfile
1059         post=$(chk_get_version $CLIENT2 $DIR1/$tfile)
1060         if (($(($pre >> 32)) == $((post >> 32)))); then
1061                 error "epoch not changed: pre $pre, post $post"
1062         fi
1063
1064         if (($(($post & 0x00000000ffffffff)) != 1)); then
1065                 error "transno should restart from one: got $post"
1066         fi
1067
1068         do_node $CLIENT2 stat $DIR1/$tfile-a
1069         do_node $CLIENT2 stat $DIR1/$tfile-b
1070
1071         do_node $CLIENT2 $CHECKSTAT -p 0666 -u \\\#$UID -g \\\#$UID \
1072                 $DIR1/$tfile-a || error "$DIR/$tfile-a: unexpected state"
1073         do_node $CLIENT2 $CHECKSTAT -p 0666 -u \\\#$RUNAS_ID -g \\\#$RUNAS_GID \
1074                 $DIR1/$tfile-b || error "$DIR/$tfile-b: unexpected state"
1075
1076         zconf_umount $CLIENT2 $MOUNT1
1077 }
1078 run_test 10b "3 clients: some, none, and all reqs replayed"
1079
1080 # test set #11: operations in single directory
1081 test_11a() {
1082     local var=${SINGLEMDS}_svc
1083     zconf_mount $CLIENT2 $MOUNT2
1084
1085     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
1086
1087     replay_barrier $SINGLEMDS
1088
1089     do_node $CLIENT1 createmany -o $DIR/$tfile-1- 100 &
1090     PID=$!
1091     do_node $CLIENT2 createmany -o $MOUNT2/$tfile-2- 100
1092     zconf_umount $CLIENT2 $MOUNT2
1093     wait $PID
1094
1095     facet_failover $SINGLEMDS
1096     # recovery shouldn't fail due to missing client 2
1097     client_up $CLIENT1 || return 1
1098     # All files from client1 should have been replayed
1099     do_node $CLIENT1 unlinkmany $DIR/$tfile-1- 100 || return 2
1100
1101     [ -e $DIR/$tdir/$tfile-2-0 ] && error "$tfile-2-0 exists"
1102     return 0
1103 }
1104 run_test 11a "concurrent creates don't affect each other"
1105
1106 test_11b() {
1107     local var=${SINGLEMDS}_svc
1108     zconf_mount $CLIENT2 $MOUNT2
1109
1110     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
1111
1112     do_node $CLIENT2 createmany -o $MOUNT2/$tfile-2- 100
1113
1114     replay_barrier $SINGLEMDS
1115     do_node $CLIENT1 createmany -o $DIR/$tfile-1- 100 &
1116     PID=$!
1117     do_node $CLIENT2 unlinkmany -o $MOUNT2/$tfile-2- 100
1118     zconf_umount $CLIENT2 $MOUNT2
1119     wait $PID
1120
1121     facet_failover $SINGLEMDS
1122     # recovery shouldn't fail due to missing client 2
1123     client_up $CLIENT1 || return 1
1124     # All files from client1 should have been replayed
1125     do_node $CLIENT1 unlinkmany $DIR/$tfile-1- 100 || return 2
1126
1127     [ -e $DIR/$tdir/$tfile-2-0 ] && error "$tfile-2-0 exists"
1128     return 0
1129 }
1130 run_test 11b "concurrent creates and unlinks don't affect each other"
1131
1132 # test set #12: lock replay with VBR, bug 16356
1133 test_12a() { # former test_2a
1134     local var=${SINGLEMDS}_svc
1135     zconf_mount $CLIENT2 $MOUNT2
1136
1137     do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
1138
1139     do_node $CLIENT2 mkdir -p $MOUNT2/$tdir
1140     replay_barrier $SINGLEMDS
1141     do_node $CLIENT2 mcreate $MOUNT2/$tdir/$tfile
1142     do_node $CLIENT1 createmany -o $DIR/$tfile- 25
1143     #client1 read data from client2 which will be lost
1144     do_node $CLIENT1 $CHECKSTAT $DIR/$tdir/$tfile
1145     do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25
1146     zconf_umount $CLIENT2 $MOUNT2
1147
1148     facet_failover $SINGLEMDS
1149     # recovery shouldn't fail due to missing client 2
1150     client_up $CLIENT1 || return 1
1151
1152     # All 50 files should have been replayed
1153     do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2
1154     do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3
1155     do_node $CLIENT1 $CHECKSTAT $DIR/$tdir/$tfile && return 4
1156
1157     return 0
1158 }
1159 run_test 12a "lost data due to missed REMOTE client during replay"
1160
1161 test_13() { # LU-8826
1162         local var=${SINGLEMDS}_svc
1163
1164         if combined_mgs_mds ; then
1165                 skip "Needs separate MGS to enable IR"
1166                 return 0
1167         fi
1168
1169         do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.sync_permission=0"
1170         do_facet $SINGLEMDS "$LCTL set_param mdt.${!var}.commit_on_sharing=0"
1171
1172         zconf_mount $CLIENT2 $MOUNT2
1173         do_node $CLIENT1 openfile -f O_RDWR:O_CREAT -m 0644 $DIR/$tfile
1174
1175         # set ir_timeout to a reasonable small value
1176         local ir_timeout=$(do_facet mgs $LCTL get_param -n mgs.*.ir_timeout)
1177         do_facet mgs $LCTL set_param mgs.*.ir_timeout=5
1178         # make sure IR functional
1179         sleep 5
1180
1181         replay_barrier $SINGLEMDS
1182         do_node $CLIENT1 chmod 666 $DIR/$tfile
1183         do_node $CLIENT2 chmod 777 $DIR2/$tfile
1184
1185         # make sure client data of $CLIENT2:$MOUNT2 is remained
1186         # define OBD_FAIL_TGT_CLIENT_DEL        0x718
1187         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x718
1188         zconf_umount $CLIENT2 $MOUNT2
1189         # define OBD_FAIL_TGT_SLUGGISH_NET      0x719
1190         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x719
1191         facet_failover $SINGLEMDS
1192
1193         client_up $CLIENT1 || error "$CLIENT1 evicted"
1194
1195         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
1196         do_facet mgs $LCTL set_param mgs.*.ir_timeout=$ir_timeout
1197
1198         do_node $CLIENT1 $CHECKSTAT -p 0666 $DIR/$tfile ||
1199                 error "$DIR/$tfile-a: unexpected state"
1200 }
1201 run_test 13 "Shouldn't give up VBR easily on sluggish network"
1202
1203 #restore COS setting
1204 restore_lustre_params < $cos_param_file
1205 rm -f $cos_param_file
1206
1207 [ "$CLIENTS" ] && zconf_mount_clients $CLIENTS $DIR
1208
1209 complete $SECONDS
1210 check_and_cleanup_lustre
1211 exit_status