X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanityn.sh;h=269e37196259ed11cf04f21ba7180770cf0cfb7a;hp=fbc8bf79cbaf3c769365a93af3f62c9bc4543438;hb=7136981bfaad8b95e15e9d2969b94c933491eb98;hpb=7c7d754dbe42180ee45eb8a41f36f51447c7abfc diff --git a/lustre/tests/sanityn.sh b/lustre/tests/sanityn.sh index fbc8bf7..269e371 100644 --- a/lustre/tests/sanityn.sh +++ b/lustre/tests/sanityn.sh @@ -11,9 +11,6 @@ ALWAYS_EXCEPT=" 14b 18c 19 22 28 29 35 grep -q 'Enterprise Server 10' /etc/SuSE-release 2> /dev/null && ALWAYS_EXCEPT="$ALWAYS_EXCEPT 11 14" || true -# Tests that fail on uml -[ "$UML" = "true" ] && EXCEPT="$EXCEPT 7" - # It will be ported soon. EXCEPT="$EXCEPT 22" @@ -43,6 +40,10 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} init_logging +[ $(facet_fstype $SINGLEMDS) = "zfs" ] && +# bug number for skipped test: LU-2840 LU-2776 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 21 51a" + [ "$SLOW" = "no" ] && EXCEPT_SLOW="12 23 33a" FAIL_ON_ERROR=false @@ -52,8 +53,8 @@ TRACE=${TRACE:-""} check_and_setup_lustre -LOVNAME=`lctl get_param -n llite.*.lov.common_name | tail -n 1` -OSTCOUNT=`lctl get_param -n lov.$LOVNAME.numobd` +LOVNAME=$($LCTL get_param -n llite.*.lov.common_name | tail -n 1) +OSTCOUNT=$($LCTL get_param -n lov.$LOVNAME.numobd) assert_DIR rm -rf $DIR1/[df][0-9]* $DIR1/lnk @@ -133,6 +134,41 @@ test_2e() { } run_test 2e "check chmod on root is propagated to others" +test_2f() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + local remote_dir=$tdir/remote_dir + + mkdir -p $DIR1/$tdir + $LFS mkdir -i $MDTIDX $DIR1/$remote_dir || + error "Create remote directory failed" + + touch $DIR1/$remote_dir/$tfile || + error "Create file under remote directory failed" + chmod 777 $DIR1/$remote_dir/$tfile || + error "Chmod file under remote directory failed" + + $CHECKSTAT -t file -p 0777 $DIR2/$remote_dir/$tfile || + error "Check attr of file under remote directory failed" + + chown $RUNAS_ID:$RUNAS_GID $DIR1/$remote_dir/$tfile || + error "Chown file under remote directory failed" + + $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR2/$remote_dir/$tfile || + error "Check owner of file under remote directory failed" + + cd $DIR2/$remote_dir || error "enter remote dir" + rm -rf $DIR1/$remote_dir/$tfile || + error "Unlink remote directory failed" + + $CHECKSTAT -t file $DIR2/$remote_dir/$tfile && + error "unlink file still exists!" + + cd $DIR2/$tdir || error "exit remote dir" + rm -rf $DIR1/$tdir || error "unlink directory failed" +} +run_test 2f "check attr/owner updates on DNE with 2 mtpt's" + test_3() { local target="this/is/good" ln -s $target $DIR1/$tfile || error "ln -s $target $DIR1/$tfile failed" @@ -221,7 +257,7 @@ test_10b() { run_test 10b "write of file with sub-page size on multiple mounts " test_11() { - mkdir $DIR1/d11 + test_mkdir $DIR1/d11 multiop_bg_pause $DIR1/d11/f O_c || return 1 MULTIPID=$! cp -p /bin/ls $DIR1/d11/f @@ -239,7 +275,7 @@ test_12() { run_test 12 "test lock ordering (link, stat, unlink) ===========" test_13() { # bug 2451 - directory coherency - mkdir $DIR1/d13 || error + test_mkdir $DIR1/d13 || error cd $DIR1/d13 || error ls ( touch $DIR1/d13/f13 ) # needs to be a separate shell @@ -255,7 +291,7 @@ test_13() { # bug 2451 - directory coherency run_test 13 "test directory page revocation ====================" test_14() { - mkdir -p $DIR1/$tdir + test_mkdir -p $DIR1/$tdir cp -p /bin/ls $DIR1/$tdir/$tfile multiop_bg_pause $DIR1/$tdir/$tfile Ow_c || return 1 MULTIPID=$! @@ -267,7 +303,7 @@ test_14() { run_test 14 "execution of file open for write returns -ETXTBSY =" test_14a() { - mkdir -p $DIR1/d14 + test_mkdir -p $DIR1/d14 cp -p `which multiop` $DIR1/d14/multiop || error "cp failed" MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1 MULTIOP_PID=$! @@ -279,7 +315,7 @@ test_14a() { run_test 14a "open(RDWR) of executing file returns -ETXTBSY ====" test_14b() { # bug 3192, 7040 - mkdir -p $DIR1/d14 + test_mkdir -p $DIR1/d14 cp -p `which multiop` $DIR1/d14/multiop || error "cp failed" MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1 MULTIOP_PID=$! @@ -293,7 +329,7 @@ test_14b() { # bug 3192, 7040 run_test 14b "truncate of executing file returns -ETXTBSY ======" test_14c() { # bug 3430, 7040 - mkdir -p $DIR1/d14 + test_mkdir -p $DIR1/d14 cp -p `which multiop` $DIR1/d14/multiop || error "cp failed" MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1 MULTIOP_PID=$! @@ -306,7 +342,7 @@ test_14c() { # bug 3430, 7040 run_test 14c "open(O_TRUNC) of executing file return -ETXTBSY ==" test_14d() { # bug 10921 - mkdir -p $DIR1/d14 + test_mkdir -p $DIR1/d14 cp -p `which multiop` $DIR1/d14/multiop || error "cp failed" MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1 MULTIOP_PID=$! @@ -328,13 +364,35 @@ test_15() { # bug 974 - ENOSPC } run_test 15 "test out-of-space with multiple writers ===========" +COUNT=${COUNT:-2500} +# The FSXNUM reduction for ZFS is needed until ORI-487 is fixed. +# We don't want to skip it entirely, but ZFS is VERY slow and cannot +# pass a 2500 operation dual-mount run within the time limit. +if [ "$(facet_fstype ost1)" = "zfs" ]; then + FSXNUM=$((COUNT / 5)) + FSXP=1 +elif [ "$SLOW" = "yes" ]; then + FSXNUM=$((COUNT * 5)) + FSXP=500 +else + FSXNUM=$COUNT + FSXP=100 +fi + test_16() { - rm -f $MOUNT1/fsxfile - lfs setstripe $MOUNT1/fsxfile -c -1 # b=10919 - fsx -c 50 -p 100 -N 2500 -l $((SIZE * 256)) -S 0 $FSXOPT \ - $MOUNT1/fsxfile $MOUNT2/fsxfile + local file1=$DIR1/$tfile + local file2=$DIR2/$tfile + + # to allocate grant because it may run out due to test_15. + lfs setstripe -c -1 $file1 + dd if=/dev/zero of=$file1 bs=$STRIPE_BYTES count=$OSTCOUNT oflag=sync + dd if=/dev/zero of=$file2 bs=$STRIPE_BYTES count=$OSTCOUNT oflag=sync + rm -f $file1 + + lfs setstripe -c -1 $file1 # b=10919 + fsx -c 50 -p $FSXP -N $FSXNUM -l $((SIZE * 256)) -S 0 $file1 $file2 } -run_test 16 "2500 iterations of dual-mount fsx =================" +run_test 16 "$FSXNUM iterations of dual-mount fsx" test_17() { # bug 3513, 3667 remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -371,14 +429,14 @@ test_19() { # bug3811 local node=$(facet_active_host ost1) # check whether obdfilter is cache capable at all - if ! get_obdfilter_param $node '' read_cache_enable >/dev/null; then + if ! get_osd_param $node '' read_cache_enable >/dev/null; then echo "not cache-capable obdfilter" return 0 fi - local MAX=$(get_obdfilter_param $node '' readcache_max_filesize | \ + local MAX=$(get_osd_param $node '' readcache_max_filesize | \ head -n 1) - set_obdfilter_param $node '' readcache_max_filesize 4096 + set_osd_param $node '' readcache_max_filesize 4096 dd if=/dev/urandom of=$TMP/$tfile bs=512k count=32 local SUM=$(cksum $TMP/$tfile | cut -d" " -f 1,2) cp $TMP/$tfile $DIR1/$tfile @@ -393,13 +451,13 @@ test_19() { # bug3811 [ "$(cat $TMP/sum2)" = "$SUM" ] || \ error "$DIR2/$tfile $(cat $TMP/sum2) != $SUM" done - set_obdfilter_param $node '' readcache_max_filesize $MAX + set_osd_param $node '' readcache_max_filesize $MAX rm $DIR1/$tfile } run_test 19 "test concurrent uncached read races ===============" test_20() { - mkdir $DIR1/d20 + test_mkdir $DIR1/d20 cancel_lru_locks osc CNT=$((`lctl get_param -n llite.*.dump_page_cache | wc -l`)) $MULTIOP $DIR1/f20 Ow8190c @@ -418,7 +476,7 @@ cleanup_21() { } test_21() { # Bug 5907 - mkdir $DIR1/d21 + test_mkdir $DIR1/d21 mount /etc $DIR1/d21 --bind || error "mount failed" # Poor man's mount. trap cleanup_21 EXIT rmdir -v $DIR1/d21 && error "Removed mounted directory" @@ -477,14 +535,15 @@ run_test 24a "lfs df [-ih] [path] test =========================" test_24b() { touch $DIR1/$tfile - fsnum=`lfs df | grep -c "filesystem summary:"` + fsnum=$(lfs_df | grep -c "summary") [ $fsnum -eq 2 ] || error "lfs df shows $fsnum != 2 filesystems." } run_test 24b "lfs df should show both filesystems ===============" -test_25() { - [ `lctl get_param -n mdc.*-mdc-*.connect_flags | grep -c acl` -lt 2 ] && - skip "must have acl, skipping" && return +test_25a() { + local acl=$(lctl get_param -n mdc.*MDT0000-mdc-*.connect_flags | + grep -c acl) + [ "$acl" -lt 1 ] && skip "must have acl, skipping" && return mkdir -p $DIR1/$tdir touch $DIR1/$tdir/f1 || error "touch $DIR1/$tdir/f1" @@ -506,7 +565,37 @@ test_25() { rm -rf $DIR1/$tdir } -run_test 25 "change ACL on one mountpoint be seen on another ===" +run_test 25a "change ACL on one mountpoint be seen on another ===" + +test_25b() { + local acl=$(lctl get_param -n mdc.*MDT0000-mdc-*.connect_flags | + grep -c acl) + [ "$acl" -lt 1 ] && skip "must have acl, skipping" && return + + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + rm -rf $DIR1/$tdir + $LFS mkdir -i 1 $DIR1/$tdir + touch $DIR1/$tdir/f1 || error "touch $DIR1/$tdir/f1" + chmod 0755 $DIR1/$tdir/f1 || error "chmod 0755 $DIR1/$tdir/f1" + + $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #1" + setfacl -m u:$RUNAS_ID:--- -m g:$RUNAS_GID:--- $DIR1/$tdir || + error "setfacl $DIR2/$tdir #1" + $RUNAS $CHECKSTAT $DIR2/$tdir/f1 && error "checkstat $DIR2/$tdir/f1 #2" + setfacl -m u:$RUNAS_ID:r-x -m g:$RUNAS_GID:r-x $DIR1/$tdir || + error "setfacl $DIR2/$tdir #2" + $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #3" + setfacl -m u:$RUNAS_ID:--- -m g:$RUNAS_GID:--- $DIR1/$tdir || + error "setfacl $DIR2/$tdir #3" + $RUNAS $CHECKSTAT $DIR2/$tdir/f1 && error "checkstat $DIR2/$tdir/f1 #4" + setfacl -x u:$RUNAS_ID: -x g:$RUNAS_GID: $DIR1/$tdir || + error "setfacl $DIR2/$tdir #4" + $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #5" + + rm -rf $DIR1/$tdir +} +run_test 25b "change ACL under remote dir on one mountpoint be seen on another" test_26a() { utime $DIR1/f26a -s $DIR2/f26a || error @@ -599,26 +688,29 @@ test_29() { # bug 10999 run_test 29 "lock put race between glimpse and enqueue =========" test_30() { #bug #11110 - mkdir -p $DIR1/$tdir - cp -f /bin/bash $DIR1/$tdir/bash - /bin/sh -c 'sleep 1; rm -f $DIR2/$tdir/bash; cp /bin/bash $DIR2/$tdir' & - err=$($DIR1/$tdir/bash -c 'sleep 2; openfile -f O_RDONLY /proc/$$/exe >& /dev/null; echo $?') - wait - [ $err -ne 116 ] && error_ignore 12900 "return code ($err) != -ESTALE" && return - true + test_mkdir -p $DIR1/$tdir + cp -f /bin/bash $DIR1/$tdir/bash + /bin/sh -c 'sleep 1; rm -f $DIR2/$tdir/bash; + cp /bin/bash $DIR2/$tdir' & + local err=$($DIR1/$tdir/bash -c 'sleep 2; + openfile -f O_RDONLY /proc/$$/exe >& /dev/null; echo $?') + wait + [ $err -ne 116 ] && + error_ignore 12900 "return code ($err) != -ESTALE" && return + true } -run_test 30 "recreate file race =========" +run_test 30 "recreate file race" test_31a() { - mkdir -p $DIR1/$tdir || error "Creating dir $DIR1/$tdir" - writes=`LANG=C dd if=/dev/zero of=$DIR/$tdir/$tfile count=1 2>&1 | - awk 'BEGIN { FS="+" } /out/ {print $1}'` - #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE 0x314 - lctl set_param fail_loc=0x314 - reads=`LANG=C dd if=$DIR2/$tdir/$tfile of=/dev/null 2>&1 | - awk 'BEGIN { FS="+" } /in/ {print $1}'` - [ $reads -eq $writes ] || error "read" $reads "blocks, must be" $writes + test_mkdir -p $DIR1/$tdir || error "Creating dir $DIR1/$tdir" + local writes=$(LANG=C dd if=/dev/zero of=$DIR/$tdir/$tfile \ + count=1 2>&1 | awk 'BEGIN { FS="+" } /out/ {print $1}') + #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE 0x314 + lctl set_param fail_loc=0x314 + local reads=$(LANG=C dd if=$DIR2/$tdir/$tfile of=/dev/null 2>&1 | + awk 'BEGIN { FS="+" } /in/ {print $1}') + [ $reads -eq $writes ] || error "read" $reads "blocks, must be" $writes } run_test 31a "voluntary cancel / blocking ast race==============" @@ -630,7 +722,7 @@ test_31b() { wait_mds_ost_sync || error "wait_mds_ost_sync()" wait_delete_completed || error "wait_delete_completed()" - mkdir -p $DIR1/$tdir || error "Creating dir $DIR1/$tdir" + test_mkdir -p $DIR1/$tdir || error "Creating dir $DIR1/$tdir" lfs setstripe $DIR/$tdir/$tfile -i 0 -c 1 cp /etc/hosts $DIR/$tdir/$tfile #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE 0x314 @@ -799,6 +891,65 @@ test_33a() { } run_test 33a "commit on sharing, cross crete/delete, 2 clients, benchmark" +# commit on sharing tests +test_33b() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + + [ -n "$CLIENTS" ] || { skip "Need two or more clients" && return 0; } + [ $CLIENTCOUNT -ge 2 ] || + { skip "Need two or more clients, have $CLIENTCOUNT" && + return 0; } + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + local nfiles=${TEST33_NFILES:-10000} + local param_file=$TMP/$tfile-params + + save_lustre_params $(comma_list $(mdts_nodes)) \ + "mdt.*.commit_on_sharing" > $param_file + local COS + local jbdold + local jbdnew + local jbd + local MDTIDX=1 + + for COS in 0 1; do + do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=$COS + avgjbd=0 + avgtime=0 + for i in 1 2 3; do + do_node $CLIENT1 "$LFS mkdir -i $MDTIDX -p \ + $DIR1/$tdir-\\\$(hostname)-$i" + + jbdold=$(print_jbd_stat) + echo "=== START createmany old: $jbdold transaction" + local elapsed=$(do_and_time "do_nodes $CLIENT1,$CLIENT2\ + createmany -o $DIR1/$tdir-\\\$(hostname)-$i/f- \ + -r $DIR2/$tdir-\\\$(hostname)-$i/f- $nfiles > \ + /dev/null 2>&1") + jbdnew=$(print_jbd_stat) + jbd=$(( jbdnew - jbdold )) + echo "=== END createmany new: $jbdnew transaction : \ + $jbd transactions nfiles $nfiles time $elapsed COS=$COS" + avgjbd=$(( avgjbd + jbd )) + avgtime=$(( avgtime + elapsed )) + done + eval cos${COS}_jbd=$((avgjbd / 3)) + eval cos${COS}_time=$((avgtime / 3)) + done + + echo "COS=0 transactions (avg): $cos0_jbd time (avg): $cos0_time" + echo "COS=1 transactions (avg): $cos1_jbd time (avg): $cos1_time" + [ "$cos0_jbd" != 0 ] && + echo "COS=1 vs COS=0 jbd: $(((cos1_jbd/cos0_jbd - 1) * 100)) %" + [ "$cos0_time" != 0 ] && + echo "COS=1 vs COS=0 time: $(((cos1_time/cos0_time - 1) * 100)) %" + + restore_lustre_params < $param_file + rm -f $param_file + return 0 +} +run_test 33b "COS: cross create/delete, 2 clients, benchmark under remote dir" + # End commit on sharing tests get_ost_lock_timeouts() { @@ -810,10 +961,21 @@ get_ost_lock_timeouts() { echo $locks } +cleanup_34() { + local i + trap 0 + do_nodes $(comma_list $(osts_nodes)) \ + "lctl set_param -n fail_loc=0 2>/dev/null || true" + for i in $(seq $OSTCOUNT); do + wait_osc_import_state client ost$i FULL + done +} + test_34() { #16129 local OPER local lock_in local lock_out + trap cleanup_34 EXIT RETURN for OPER in notimeout timeout ; do rm $DIR1/$tfile 2>/dev/null lock_in=$(get_ost_lock_timeouts) @@ -852,6 +1014,7 @@ test_34() { #16129 fi fi done + cleanup_34 } run_test 34 "no lock timeout under IO" @@ -864,7 +1027,7 @@ test_35() { # bug 17645 let count=count+1 done - mkdir -p $MOUNT1/$tfile + test_mkdir -p $MOUNT1/$tfile cancel_lru_locks mdc # Let's initiate -EINTR situation by setting fail_loc and take @@ -916,7 +1079,7 @@ test_36() { #bug 16417 local SIZE_B local i - mkdir -p $DIR1/$tdir + test_mkdir -p $DIR1/$tdir $LFS setstripe -c -1 $DIR1/$tdir i=0 SIZE=50 @@ -924,23 +1087,23 @@ test_36() { #bug 16417 while [ $i -le 10 ]; do lctl mark "start test" - local before=$($LFS df | awk '{if ($1 ~/^filesystem/) \ - {print $5; exit} }') - dd if=/dev/zero of=$DIR1/$tdir/file000 bs=1M count=$SIZE - sync # sync data from client's cache - sync_all_data # sync data from server's cache (delayed - # allocation) + local before=$($LFS df | awk '{ if ($1 ~/^filesystem/) \ + { print $5; exit} }') + dd if=/dev/zero of=$DIR1/$tdir/$tfile bs=1M count=$SIZE || + error "dd $DIR1/$tdir/$tfile ${SIZE}MB failed" + sync # sync data from client cache + sync_all_data # sync data from server cache (delayed allocation) sleep 1 - local after_dd=$($LFS df | awk '{if ($1 ~/^filesystem/) \ - {print $5; exit} }') - multiop_bg_pause $DIR2/$tdir/file000 O_r${SIZE_B}c || return 3 + local after_dd=$($LFS df | awk '{ if ($1 ~/^filesystem/) \ + { print $5; exit} }') + multiop_bg_pause $DIR2/$tdir/$tfile O_r${SIZE_B}c || return 3 read_pid=$! - rm -f $DIR1/$tdir/file000 + rm -f $DIR1/$tdir/$tfile kill -USR1 $read_pid wait $read_pid wait_delete_completed - local after=$($LFS df | awk '{if ($1 ~/^filesystem/) \ - {print $5; exit} }') + local after=$($LFS df | awk '{ if ($1 ~/^filesystem/) \ + { print $5; exit} }') echo "*** cycle($i) *** before($before) after_dd($after_dd)" \ "after($after)" # this free space! not used @@ -951,10 +1114,10 @@ test_36() { #bug 16417 let i=i+1 done } -run_test 36 "handle ESTALE/open-unlink corectly" +run_test 36 "handle ESTALE/open-unlink correctly" test_37() { # bug 18695 - mkdir -p $DIR1/$tdir + test_mkdir -p $DIR1/$tdir multiop_bg_pause $DIR1/$tdir D_c || return 1 MULTIPID=$! # create large directory (32kB seems enough from e2fsck, ~= 1000 files) @@ -1097,6 +1260,12 @@ test_40a() { rm $DIR2/$tfile-4 $DIR2/$tfile-5 rmdir $DIR2/$tfile-3 check_pdo_conflict $PID1 || error "unlink is blocked" + + if [ $MDSCOUNT -ge 2 ]; then + $LFS mkdir -i 1 $DIR2/$tfile-6 + check_pdo_conflict $PID1 || error "remote mkdir is blocked" + fi + # all operations above shouldn't wait the first one check_pdo_conflict $PID1 || error "parallel operation is blocked" wait $PID1 @@ -1126,7 +1295,13 @@ test_40b() { rmdir $DIR2/$tfile-3 check_pdo_conflict $PID1 || error "unlink is blocked" # all operations above shouldn't wait the first one - check_pdo_conflict $PID1 || error "parallel operation is blocked" + + if [ $MDSCOUNT -ge 2 ]; then + $LFS mkdir -i 1 $DIR2/$tfile-6 + check_pdo_conflict $PID1 || error "remote mkdir is blocked" + fi + + check_pdo_conflict $PID1 || error "parallel operation is blocked" wait $PID1 rm -r $DIR1/* return 0 @@ -1154,7 +1329,13 @@ test_40c() { rm $DIR2/$tfile-4 $DIR2/$tfile-5 rmdir $DIR2/$tfile-3 check_pdo_conflict $PID1 || error "unlink is blocked" - # all operations above shouldn't wait the first one + + if [ $MDSCOUNT -ge 2 ]; then + $LFS mkdir -i 1 $DIR2/$tfile-6 + check_pdo_conflict $PID1 || error "remote mkdir is blocked" + fi + + # all operations above shouldn't wait the first one check_pdo_conflict $PID1 || error "parallel operation is blocked" wait $PID1 rm -r $DIR1/* @@ -1183,6 +1364,12 @@ test_40d() { rm $DIR2/$tfile-4 $DIR2/$tfile-5 rmdir $DIR2/$tfile-3 check_pdo_conflict $PID1 || error "unlink is blocked" + + if [ $MDSCOUNT -ge 2 ]; then + $LFS mkdir -i 1 $DIR2/$tfile-6 + check_pdo_conflict $PID1 || error "remote mkdir is blocked" + fi + # all operations above shouldn't wait the first one check_pdo_conflict $PID1 || error "parallel operation is blocked" wait $PID1 @@ -1209,7 +1396,13 @@ test_40e() { rm $DIR2/$tfile-4 $DIR2/$tfile-2 rmdir $DIR2/$tfile-3 check_pdo_conflict $PID1 || error "unlink is blocked" - # all operations above shouldn't wait the first one + + if [ $MDSCOUNT -ge 2 ]; then + $LFS mkdir -i 1 $DIR2/$tfile-6 + check_pdo_conflict $PID1 || error "remote mkdir is blocked" + fi + + # all operations above shouldn't wait the first one check_pdo_conflict $PID1 || error "parallel operation is blocked" wait $PID1 rm -r $DIR1/* @@ -1546,6 +1739,22 @@ test_43h() { } run_test 43h "pdirops: unlink vs readdir ==============" +test_43i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + $LFS mkdir -i 1 $DIR2/$tfile || error "remote mkdir must succeed" + check_pdo_conflict $PID1 && + { wait $PID1; error "remote mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43i "pdirops: unlink vs remote mkdir" + # test 44: rename tgt and blocking operations test_44a() { touch $DIR1/$tfile-2 @@ -1663,6 +1872,23 @@ test_44h() { } run_test 44h "pdirops: rename tgt vs readdir ==============" +# test 44: rename tgt and blocking operations +test_44i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + $LFS mkdir -i 1 $DIR2/$tfile && error "remote mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; + error "remote mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44i "pdirops: rename tgt vs remote mkdir" + # test 45: rename src and blocking operations test_45a() { touch $DIR1/$tfile @@ -1757,7 +1983,7 @@ test_45g() { mv $DIR1/$tfile $DIR1/$tfile-2 & PID1=$! sleep 1 - stat $DIR2/$tfile > /dev/null && "stat must fail" + stat $DIR2/$tfile > /dev/null && error "stat must fail" check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } rm -r $DIR1/* return 0 @@ -1778,6 +2004,22 @@ test_45h() { } run_test 45h "pdirops: unlink vs readdir ==============" +test_45i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + $LFS mkdir -i 1 $DIR2/$tfile || error "create remote dir must succeed" + check_pdo_conflict $PID1 && { wait $PID1; + error "create remote dir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45i "pdirops: rename src vs remote mkdir" + # test 46: link and blocking operations test_46a() { touch $DIR1/$tfile-2 @@ -1887,12 +2129,135 @@ test_46h() { PID1=$! sleep 1 ls -lia $DIR2/ > /dev/null - check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + check_pdo_conflict $PID1 && { wait $PID1; + error "readdir isn't blocked"; } rm -r $DIR1/* return 0 } run_test 46h "pdirops: link vs readdir ==============" +test_46i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + $LFS mkdir -i 1 $DIR2/$tfile && error "remote mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; + error "remote mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46i "pdirops: link vs remote mkdir" + +# test 47: remote mkdir and blocking operations +test_47a() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile && error "mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47a "pdirops: remote mkdir vs mkdir" + +test_47b() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail" + check_pdo_conflict $PID1 && { wait $PID1; + error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47b "pdirops: remote mkdir vs create" + +test_47c() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + link $DIR2/$tfile-2 $DIR2/$tfile && error "link must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47c "pdirops: remote mkdir vs link" + +test_47d() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + rmdir $DIR2/$tfile || error "unlink must succeed" + check_pdo_conflict $PID1 && { wait $PID1; + error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47d "pdirops: remote mkdir vs unlink" + +test_47e() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + mv -T $DIR2/$tfile-2 $DIR2/$tfile && error "rename must fail" + check_pdo_conflict $PID1 && { wait $PID1; + error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47e "pdirops: remote mkdir and rename (tgt)" + +test_47f() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-2 || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; + error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47f "pdirops: remote mkdir and rename (src)" + +test_47g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + $LFS mkdir -i 1 $DIR1/$tfile & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null || error "stat must succeed" + check_pdo_conflict $PID1 && { wait $PID1; + error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 47g "pdirops: remote mkdir vs getattr" + test_50() { trunc_size=4096 dd if=/dev/zero of=$DIR1/$tfile bs=1K count=10 @@ -1906,11 +2271,86 @@ test_50() { } run_test 50 "osc lvb attrs: enqueue vs. CP AST ==============" +test_51a() { + local filesize + local origfile=/etc/hosts + + filesize=`stat -c %s $origfile` + + # create an empty file + $MCREATE $DIR1/$tfile + # cache layout lock on both mount point + stat $DIR1/$tfile > /dev/null + stat $DIR2/$tfile > /dev/null + + # open and sleep 2 seconds then read + $MULTIOP $DIR2/$tfile o_2r${filesize}c & + local pid=$! + sleep 0.1 + + # create the layout of testing file + dd if=$origfile of=$DIR1/$tfile conv=notrunc > /dev/null + + # MULTIOP proc should be able to read enough bytes and exit + sleep 2 + kill -0 $pid && error "multiop is still there" + cmp $origfile $DIR2/$tfile || error "$MCREATE and $DIR2/$tfile differs" + + rm -f $DIR1/$tfile +} +run_test 51a "layout lock: refresh layout should work" + +test_51b() { + local tmpfile=`mktemp` + + # create an empty file + $MCREATE $DIR1/$tfile + + # delay glimpse so that layout has changed when glimpse finish +#define OBD_FAIL_GLIMPSE_DELAY 0x1404 + $LCTL set_param fail_loc=0x1404 + stat -c %s $DIR2/$tfile |tee $tmpfile & + local pid=$! + sleep 0.1 + + # create layout of testing file + dd if=/dev/zero of=$DIR1/$tfile bs=1k count=1 conv=notrunc > /dev/null + + wait $pid + local fsize=`cat $tmpfile` + + [ x$fsize = x1024 ] || error "file size is $fsize, should be 1024" + + rm -f $DIR1/$tfile $tmpfile +} +run_test 51b "layout lock: glimpse should be able to restart if layout changed" + +test_51c() { + # create an empty file + $MCREATE $DIR1/$tfile + +#define OBD_FAIL_MDS_LL_BLOCK 0x172 + $LCTL set_param fail_loc=0x172 + + # change the layout of testing file + echo "Setting layout ..." + $LFS setstripe -c $OSTCOUNT $DIR1/$tfile & + pid=$! + sleep 0.1 + + # get layout of this file should wait until dd is finished + local stripecnt=`$LFS getstripe -c $DIR2/$tfile` + [ $stripecnt -eq $OSTCOUNT ] || error "layout wrong" + + rm -f $DIR1/$tfile +} +run_test 51c "layout lock: IT_LAYOUT blocked and correct layout can be returned" + test_60() { [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.0) ]] || { skip "Need MDS version at least 2.3.0"; return; } # Create a file - mkdir -p $DIR1/$tdir + test_mkdir -p $DIR1/$tdir file1=$DIR1/$tdir/file file2=$DIR2/$tdir/file @@ -1955,10 +2395,28 @@ test_60() { } run_test 60 "Verify data_version behaviour" +test_70() { + local test_dir=$tdir/test_dir + + mkdir -p $DIR1/$tdir + if [ $MDSCOUNT -ge 2 ]; then + local MDTIDX=1 + $LFS mkdir -i $MDTIDX $DIR1/$test_dir || + error "Create remote directory failed" + else + mkdir -p $DIR1/$test_dir + fi + cd $DIR2/$test_dir || error "cd directory failed" + rm -rf $DIR1/$test_dir || error "unlink directory failed" + + cd $DIR2/$tdir || error "exit directory" +} +run_test 70 "cd directory && rm directory" + log "cleanup: ======================================================" [ "$(mount | grep $MOUNT2)" ] && umount $MOUNT2 -complete $(basename $0) $SECONDS +complete $SECONDS check_and_cleanup_lustre exit_status