Whamcloud - gitweb
LU-1187 tests: Add DNE test cases in sanity.
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 5ccf2b1..90c2261 100644 (file)
@@ -586,6 +586,59 @@ test_17m() {
 }
 run_test 17m "run e2fsck against MDT which contains short/long symlink"
 
+check_fs_consistency_17n() {
+       local mdt_index
+       local devname
+       local cmd
+       local rc=0
+
+       for mdt_index in $(seq 1 $MDSCOUNT); do
+               devname=$(mdsdevname $mdt_index)
+               cmd="$E2FSCK -fnvd $devname"
+
+               echo "stop and checking mds${mdt_index}: $cmd"
+               # e2fsck should not return error
+               stop mds${mdt_index}
+               do_facet mds${mdt_index} $cmd || rc=$?
+
+               start mds${mdt_index} $devname $MDS_MOUNT_OPTS
+               df $MOUNT > /dev/null 2>&1
+               [ $rc -ne 0 ] && break
+       done
+       return $rc
+}
+
+test_17n() {
+       local i
+
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
+       [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
+               skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
+
+       [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
+               skip "only for ldiskfs MDT" && return 0
+
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+       mkdir -p $DIR/$tdir
+       for ((i=0; i<10; i++)); do
+               $LFS mkdir -i 1 $DIR/$tdir/remote_dir_${i} ||
+                       error "create remote dir error $i"
+               createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
+                       error "create files under remote dir failed $i"
+       done
+
+       check_fs_consistency_17n || error "e2fsck report error"
+
+       for ((i=0;i<10;i++)); do
+               rm -rf $DIR/$tdir/remote_dir_${i} ||
+                       error "destroy remote dir error $i"
+       done
+
+       check_fs_consistency_17n || error "e2fsck report error"
+}
+run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
+
 test_18() {
        touch $DIR/f
        ls $DIR || error
@@ -928,6 +981,80 @@ test_24w() { # bug21506
 }
 run_test 24w "Reading a file larger than 4Gb"
 
+test_24x() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local remote_dir=$DIR/$tdir/remote_dir
+
+       mkdir -p $DIR/$tdir
+       $LFS mkdir -i $MDTIDX $remote_dir ||
+               error "create remote directory failed"
+
+       mkdir -p $DIR/$tdir/src_dir
+       touch $DIR/$tdir/src_file
+       mkdir -p $remote_dir/tgt_dir
+       touch $remote_dir/tgt_file
+
+       mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
+               error "rename dir cross MDT works!"
+
+       mrename $DIR/$tdir/src_file $remote_dir/tgt_file &&
+               error "rename file cross MDT works!"
+
+       ln $DIR/$tdir/src_file $remote_dir/tgt_file1 &&
+               error "ln file cross MDT should not work!"
+
+       rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24x "cross rename/link should be failed"
+
+test_24y() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local remote_dir=$DIR/$tdir/remote_dir
+
+       mkdir -p $DIR/$tdir
+       $LFS mkdir -i $MDTIDX $remote_dir ||
+                  error "create remote directory failed"
+
+       mkdir -p $remote_dir/src_dir
+       touch $remote_dir/src_file
+       mkdir -p $remote_dir/tgt_dir
+       touch $remote_dir/tgt_file
+
+       mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
+               error "rename subdir in the same remote dir failed!"
+
+       mrename $remote_dir/src_file $remote_dir/tgt_file ||
+               error "rename files in the same remote dir failed!"
+
+       ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
+               error "link files in the same remote dir failed!"
+
+       rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24y "rename/link on the same dir should succeed"
+
+test_24z() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local remote_src=$DIR/$tdir/remote_dir
+       local remote_tgt=$DIR/$tdir/remote_tgt
+
+       mkdir -p $DIR/$tdir
+       $LFS mkdir -i $MDTIDX $remote_src ||
+                  error "create remote directory failed"
+
+       $LFS mkdir -i $MDTIDX $remote_tgt ||
+                  error "create remote directory failed"
+
+       mrename $remote_src $remote_tgt &&
+               error "rename remote dirs should not work!"
+
+       rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24z "rename one remote dir to another remote dir should fail"
+
 test_25a() {
        echo '== symlink sanity ============================================='
 
@@ -1404,37 +1531,53 @@ test_27y() {
         [ $fcount -eq 0 ] && skip "not enough space on OST0" && return
         [ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT
 
-        MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
-        OFFSET=$(($OSTCOUNT-1))
-        OST=-1
-        for OSC in $MDS_OSCS; do
-                if [ $OST == -1 ]; then {
-                        OST=`osc_to_ost $OSC`
-                } else {
-                        echo $OSC "is Deactivate:"
-                        do_facet $SINGLEMDS lctl --device  %$OSC deactivate
-                } fi
-        done
-
-        OSTIDX=$(index_from_ostuuid $OST)
-        mkdir -p $DIR/$tdir
-        $SETSTRIPE -c 1 $DIR/$tdir      # 1 stripe / file
+       local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
+                        awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
+       local OST_DEACTIVE_IDX=-1
+       local OSC
+       local OSTIDX
+       local OST
+
+       for OSC in $MDS_OSCS; do
+               OST=$(osc_to_ost $OSC)
+               OSTIDX=$(index_from_ostuuid $OST)
+               if [ $OST_DEACTIVE_IDX == -1 ]; then
+                       OST_DEACTIVE_IDX=$OSTIDX
+               fi
+               if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
+                       echo $OSC "is Deactivated:"
+                       do_facet $SINGLEMDS lctl --device  %$OSC deactivate
+               fi
+       done
 
-        do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 1
-        sleep_maxage
-        createmany -o $DIR/$tdir/$tfile $fcount
-        do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 0
+       OSTIDX=$(index_from_ostuuid $OST)
+       mkdir -p $DIR/$tdir
+       $SETSTRIPE -c 1 $DIR/$tdir      # 1 stripe / file
+
+       for OSC in $MDS_OSCS; do
+               OST=$(osc_to_ost $OSC)
+               OSTIDX=$(index_from_ostuuid $OST)
+               if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
+                       echo $OST "is degraded:"
+                       do_facet ost$((OSTIDX+1)) lctl set_param -n \
+                                               obdfilter.$OST.degraded=1
+               fi
+       done
 
-        for i in `seq 0 $OFFSET`; do
-                [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "$OSTIDX"` ] || \
-                      error "files created on deactivated OSTs instead of degraded OST"
-        done
-        for OSC in $MDS_OSCS; do
-                [ `osc_to_ost $OSC` != $OST  ] && {
-                        echo $OSC "is activate"
-                        do_facet $SINGLEMDS lctl --device %$OSC activate
-                }
-        done
+       sleep_maxage
+       createmany -o $DIR/$tdir/$tfile $fcount
+
+       for OSC in $MDS_OSCS; do
+               OST=$(osc_to_ost $OSC)
+               OSTIDX=$(index_from_ostuuid $OST)
+               if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
+                       echo $OST "is recovered from degraded:"
+                       do_facet ost$((OSTIDX+1)) lctl set_param -n \
+                                               obdfilter.$OST.degraded=0
+               else
+                       do_facet $SINGLEMDS lctl --device %$OSC activate
+               fi
+       done
 }
 run_test 27y "create files while OST0 is degraded and the rest inactive"
 
@@ -2012,7 +2155,7 @@ test_32r() {
 }
 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
 
-test_33() {
+test_33aa() {
        rm -f $DIR/$tfile
        touch $DIR/$tfile
        chmod 444 $DIR/$tfile
@@ -2021,7 +2164,7 @@ test_33() {
        $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
        log 33_2
 }
-run_test 33 "write file with mode 444 (should return error) ===="
+run_test 33aa "write file with mode 444 (should return error) ===="
 
 test_33a() {
         rm -fr $DIR/d33
@@ -2106,6 +2249,31 @@ test_33c() {
 }
 run_test 33c "test llobdstat and write_bytes"
 
+test_33d() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local remote_dir=$DIR/$tdir/remote_dir
+
+       mkdir -p $DIR/$tdir
+       $LFS mkdir -i $MDTIDX $remote_dir ||
+               error "create remote directory failed"
+
+       touch $remote_dir/$tfile
+       chmod 444 $remote_dir/$tfile
+       chown $RUNAS_ID $remote_dir/$tfile
+
+       $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
+
+       chown $RUNAS_ID $remote_dir
+       $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
+                                       error "create" || true
+       $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
+                                   error "open RDWR" || true
+       $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 &&
+                                   error "create" || true
+}
+run_test 33d "openfile with 444 modes and malformed flags under remote dir"
+
 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
 test_34a() {
        rm -f $DIR/f34
@@ -2602,15 +2770,15 @@ TEST_39_ATIME=`date -d "1 year" +%s`
 
 test_39l() {
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
-       local atime_diff=$(do_facet $SINGLEMDS lctl get_param -n mdd.*.atime_diff)
-
+       local atime_diff=$(do_facet $SINGLEMDS \
+                               lctl get_param -n mdd.*MDT0000*.atime_diff)
        mkdir -p $DIR/$tdir
 
        # test setting directory atime to future
        touch -a -d @$TEST_39_ATIME $DIR/$tdir
        local atime=$(stat -c %X $DIR/$tdir)
        [ "$atime" = $TEST_39_ATIME ] || \
-               error "atime is not set to future: $atime, should be $TEST_39_ATIME"
+               error "atime is not set to future: $atime, $TEST_39_ATIME"
 
        # test setting directory atime from future to now
        local d1=$(date +%s)
@@ -2620,9 +2788,9 @@ test_39l() {
        cancel_lru_locks mdc
        atime=$(stat -c %X $DIR/$tdir)
        [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
-               error "atime is not updated from future: $atime, should be $d1<atime<$d2"
+               error "atime is not updated from future: $atime, $d1<atime<$d2"
 
-       do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=2
+       do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
        sleep 3
 
        # test setting directory atime when now > dir atime + atime_diff
@@ -2634,7 +2802,7 @@ test_39l() {
        [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
                error "atime is not updated  : $atime, should be $d2"
 
-       do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=60
+       do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
        sleep 3
 
        # test not setting directory atime when now < dir atime + atime_diff
@@ -2644,7 +2812,8 @@ test_39l() {
        [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
                error "atime is updated to $atime, should remain $d1<atime<$d2"
 
-       do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=$atime_diff
+       do_facet $SINGLEMDS \
+               lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
 }
 run_test 39l "directory atime update ==========================="
 
@@ -3271,56 +3440,6 @@ test_51ba() { # LU-993
 }
 run_test 51ba "verify nlink for many subdirectory cleanup"
 
-test_51bb() {
-       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
-
-       local ndirs=${TEST51BB_NDIRS:-10}
-       local nfiles=${TEST51BB_NFILES:-100}
-
-       local numfree=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
-
-       [ $numfree -lt $(( ndirs * nfiles)) ] && \
-               nfiles=$(( numfree / ndirs - 10 ))
-
-       local dir=$DIR/d51bb
-       mkdir -p $dir
-       local savePOLICY=$(lctl get_param -n lmv.*.placement)
-       lctl set_param -n lmv.*.placement=CHAR
-
-       lfs df -i $dir
-       local IUSED=$(lfs df -i $dir | grep MDT | awk '{print $3}')
-       OLDUSED=($IUSED)
-
-       declare -a dirs
-       for ((i=0; i < $ndirs; i++)); do
-               dirs[i]=$dir/$RANDOM
-               echo Creating directory ${dirs[i]}
-               mkdir -p ${dirs[i]}
-               ls $dir
-               echo Creating $nfiles in dir ${dirs[i]} ...
-               echo "createmany -o ${dirs[i]}/$tfile- $nfiles"
-               createmany -o ${dirs[i]}/$tfile- $nfiles
-       done
-       ls $dir
-
-       sleep 1
-
-       IUSED=$(lfs df -i $dir | grep MDT | awk '{print $3}')
-       NEWUSED=($IUSED)
-
-       local rc=0
-       for ((i=0; i<${#NEWUSED[@]}; i++)); do
-               echo "mds $i: inodes count OLD ${OLDUSED[$i]} NEW ${NEWUSED[$i]}"
-               [ ${OLDUSED[$i]} -lt ${NEWUSED[$i]} ] || rc=$((rc + 1))
-       done
-
-       lctl set_param -n lmv.*.placement=$savePOLICY
-
-       [ $rc -ne $MDSCOUNT ] || \
-               error "Objects/inodes are not distributed over all mds servers"
-}
-run_test 51bb "mkdir createmany CMD $MDSCOUNT  ===================="
-
 test_51d() {
         [  "$OSTCOUNT" -lt "3" ] && skip_env "skipping test with few OSTs" && return
         mkdir -p $DIR/d51d
@@ -4272,6 +4391,11 @@ test_64b () {
 }
 run_test 64b "check out-of-space detection on client ==========="
 
+test_64c() {
+       $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
+}
+run_test 64c "verify grant shrink ========================------"
+
 # bug 1414 - set/get directories' stripe info
 test_65a() {
        mkdir -p $DIR/d65
@@ -5776,9 +5900,9 @@ test_103 () {
 
     declare -a identity_old
 
-    for num in `seq $MDSCOUNT`; do
-        switch_identity $num true || identity_old[$num]=$?
-    done
+       for num in $(seq $MDSCOUNT); do
+               switch_identity $num true || identity_old[$num]=$?
+       done
 
     SAVE_UMASK=`umask`
     umask 0022
@@ -5811,11 +5935,11 @@ test_103 () {
     cd $SAVE_PWD
     umask $SAVE_UMASK
 
-    for num in `seq $MDSCOUNT`; do
-       if [ "${identity_old[$num]}" = 1 ]; then
-            switch_identity $num false || identity_old[$num]=$?
-       fi
-    done
+       for num in $(seq $MDSCOUNT); do
+               if [ "${identity_old[$num]}" = 1 ]; then
+                       switch_identity $num false || identity_old[$num]=$?
+               fi
+       done
 }
 run_test 103 "acl test ========================================="
 
@@ -7131,10 +7255,13 @@ set_dir_limits () {
        local node
 
        local LDPROC=/proc/fs/ldiskfs
+       local facets=$(get_facets MDS)
 
-       for facet in $(get_facets MDS); do
-               canondev=$(ldiskfs_canon *.$(convert_facet2label $facet).mntdev $facet)
-               do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || LDPROC=/sys/fs/ldiskfs
+       for facet in ${facets//,/ }; do
+               canondev=$(ldiskfs_canon \
+                          *.$(convert_facet2label $facet).mntdev $facet)
+               do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" ||
+                                               LDPROC=/sys/fs/ldiskfs
                do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size"
        done
 }
@@ -7149,11 +7276,10 @@ test_129() {
        MAX=16384
 
        set_dir_limits $MAX
-
        mkdir -p $DIR/$tdir
 
-       I=0
-       J=0
+       local I=0
+       local J=0
        while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
                $MULTIOP $DIR/$tdir/$J Oc
                rc=$?
@@ -9778,19 +9904,21 @@ mcreate_path2fid () {
        local rc
        local fid_path
 
-       $MCREATE --mode=$1 --major=$2 --minor=$3 $path || \
-               error "error: cannot create $desc"
+       $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
+               error "cannot create $desc"
 
        fid=$($LFS path2fid $path)
        rc=$?
-       [ $rc -ne 0 ] && error "error: cannot get fid of a $desc"
+       [ $rc -ne 0 ] && error "cannot get fid of a $desc"
 
-       fid_path=$($LFS fid2path $DIR $fid)
+       fid_path=$($LFS fid2path $DIR "$fid")
        rc=$?
-       [ $rc -ne 0 ] && error "error: cannot get path of a $desc by fid"
+       [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
+
+       [ "$path" == "$fid_path" ] ||
+               error "fid2path returned $fid_path, expected $path"
 
-       [ "$path" == "$fid_path" ] || \
-               error "error: fid2path returned \`$fid_path', expected \`$path'"
+       echo "pass with $path and $fid"
 }
 
 test_226 () {
@@ -9953,6 +10081,45 @@ test_228c() {
 }
 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
 
+test_230a() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+
+       mkdir -p $DIR/$tdir/test_230_local
+       local mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230_local)
+       [ $mdt_idx -ne 0 ] &&
+               error "create local directory on wrong MDT $mdt_idx"
+
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
+                       error "create remote directory failed"
+       local mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230)
+       [ $mdt_idx -ne $MDTIDX ] &&
+               error "create remote directory on wrong MDT $mdt_idx"
+
+       createmany -o $DIR/$tdir/test_230/t- 10 ||
+               error "create files on remote directory failed"
+       mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230/t-0)
+       [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
+       rm -r $DIR/$tdir || error "unlink remote directory failed"
+}
+run_test 230a "Create remote directory and files under the remote directory"
+
+test_230b() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local remote_dir=$DIR/$tdir/remote_dir
+
+       mkdir -p $DIR/$tdir
+       $LFS mkdir -i $MDTIDX $remote_dir ||
+               error "create remote directory failed"
+
+       $LFS mkdir -i 0 $remote_dir/new_dir &&
+               error "nested remote directory create succeed!"
+
+       rm -r $DIR/$tdir || error "unlink remote directory failed"
+}
+run_test 230b "nested remote directory should be failed"
+
 #
 # tests that do cleanup/setup should be run at the end
 #
@@ -9965,8 +10132,8 @@ test_900() {
         for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do
                 echo "clear" > $ls
         done
-        FAIL_ON_ERROR=true cleanup
-        FAIL_ON_ERROR=true setup
+       FAIL_ON_ERROR=true cleanup
+       FAIL_ON_ERROR=true setup
 }
 run_test 900 "umount should not race with any mgc requeue thread"