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