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