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