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