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