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