Whamcloud - gitweb
LU-8523 test: sanity 311 is too strict
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 12ca545..c2d49ac 100755 (executable)
@@ -4459,6 +4459,26 @@ test_56a() {     # was test_56
 }
 run_test 56a "check $GETSTRIPE"
 
+test_56b() {
+       test_mkdir $DIR/$tdir
+       NUMDIRS=3
+       for i in $(seq 1 $NUMDIRS); do
+               test_mkdir $DIR/$tdir/dir$i
+       done
+
+       # test lfs getdirstripe default mode is non-recursion, which is
+       # different from lfs getstripe
+       dircnt=$($LFS getdirstripe $DIR/$tdir | grep -c lmv_stripe_count)
+       [[ $dircnt -eq 1 ]] ||
+               error "$LFS getdirstripe: found $dircnt, not 1"
+       dircnt=$($LFS getdirstripe --recursive $DIR/$tdir |
+               grep -c lmv_stripe_count)
+       [[ $dircnt -eq $((NUMDIRS + 1)) ]] ||
+               error "$LFS getdirstripe --recursive: found $dircnt, \
+                       not $((NUMDIRS + 1))"
+}
+run_test 56b "check $LFS getdirstripe"
+
 NUMFILES=3
 NUMDIRS=3
 setup_56() {
@@ -5640,6 +5660,12 @@ test_65l() { # bug 12836
 }
 run_test 65l "lfs find on -1 stripe dir ========================"
 
+test_65m() {
+       $RUNAS $SETSTRIPE -c 2 $MOUNT && error "setstripe should fail"
+       true
+}
+run_test 65m "normal user can't set filesystem default stripe"
+
 # bug 2543 - update blocks count on client
 test_66() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -10599,6 +10625,12 @@ test_156() {
 run_test 156 "Verification of tunables"
 
 #Changelogs
+cleanup_changelog () {
+       trap 0
+       echo "Deregistering changelog client $CL_USER"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER
+}
+
 err17935 () {
        if [[ $MDSCOUNT -gt 1 ]]; then
                error_ignore bz17935 $*
@@ -10639,10 +10671,12 @@ test_160a() {
 
        local CL_USERS="mdd.$MDT0.changelog_users"
        local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
-       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
-       echo "Registered as changelog user $USER"
-       $GET_CL_USERS | grep -q $USER ||
-               error "User $USER not found in changelog_users"
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       trap cleanup_changelog EXIT
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
 
        # change something
        test_mkdir -p $DIR/$tdir/pics/2008/zachy
@@ -10686,9 +10720,9 @@ test_160a() {
        [ "$fidc" == "$fidf" ] ||
                err17935 "pfid in changelog $fidc != dir fid $fidf"
 
-       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
-       $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
-       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 5))
+       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
        echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
        [ $USER_REC2 == $(($USER_REC1 + 5)) ] ||
                err17935 "user index expected $(($USER_REC1 + 5)) is $USER_REC2"
@@ -10703,7 +10737,7 @@ test_160a() {
        # LU-3446 changelog index reset on MDT restart
        local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
        CUR_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        stop $SINGLEMDS || error "Fail to stop MDT."
        start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
        CUR_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
@@ -10712,19 +10746,19 @@ test_160a() {
                err17935 "current index should be $CUR_REC1 is $CUR_REC2"
 
        echo "verifying user deregister"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
-       $GET_CL_USERS | grep -q $USER &&
-               error "User $USER still in changelog_users"
+       cleanup_changelog
+       $GET_CL_USERS | grep -q $CL_USER &&
+               error "User $CL_USER still in changelog_users"
 
        USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
-       if [ $USERS -eq 0 ]; then
+       if [ $CL_USER -eq 0 ]; then
                LAST_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                touch $DIR/$tdir/chloe
                LAST_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
                [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
        else
-               echo "$USERS other changelog users; can't verify off"
+               echo "$CL_USER other changelog users; can't verify off"
        fi
 }
 run_test 160a "changelog sanity"
@@ -10737,10 +10771,12 @@ test_160b() { # LU-3587
 
        local CL_USERS="mdd.$MDT0.changelog_users"
        local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
-       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
-       echo "Registered as changelog user $USER"
-       $GET_CL_USERS | grep -q $USER ||
-               error "User $USER not found in changelog_users"
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       trap cleanup_changelog EXIT
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
 
        local LONGNAME1=$(str_repeat a 255)
        local LONGNAME2=$(str_repeat b 255)
@@ -10752,11 +10788,8 @@ test_160b() { # LU-3587
        mv $LONGNAME1 $LONGNAME2
 
        $LFS changelog $MDT0 | grep RENME
-
-       echo "deregistering $USER"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
-
        rm -f $LONGNAME2
+       cleanup_changelog
 }
 run_test 160b "Verify that very long rename doesn't crash in changelog"
 
@@ -10773,8 +10806,9 @@ test_160c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
 
        # Registration step
-       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
                changelog_register -n)
+       trap cleanup_changelog EXIT
 
        rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
@@ -10786,11 +10820,10 @@ test_160c() {
        $LFS changelog $MDT0
        TRUNCS=$($LFS changelog $MDT0 | tail -5 | grep -c "TRUNC")
        [ $TRUNCS -eq 1 ] || err17935 "TRUNC changelog mask count $TRUNCS != 1"
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
 
        # Deregistration step
-       echo "deregistering $USER"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 160c "verify that changelog log catch the truncate event"
 
@@ -10806,21 +10839,22 @@ test_160d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
 
        # Registration step
-       local USER=$(do_facet mds1 $LCTL --device $MDT0 \
+       CL_USER=$(do_facet mds1 $LCTL --device $MDT0 \
                changelog_register -n)
 
+       trap cleanup_changelog EXIT
        mkdir -p $DIR/$tdir/migrate_dir
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
 
        $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
        $LFS changelog $MDT0
        MIGRATES=$($LFS changelog $MDT0 | tail -5 | grep -c "MIGRT")
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        [ $MIGRATES -eq 1 ] ||
                error "MIGRATE changelog mask count $MIGRATES != 1"
 
        # Deregistration step
-       do_facet mds1 $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 160d "verify that changelog log catch the migrate event"
 
@@ -10927,8 +10961,10 @@ test_161c() {
 
        # define CLF_RENAME_LAST 0x0001
        # rename overwrite a target having nlink = 1 (changelog flag 0x1)
-       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
                changelog_register -n)
+
+       trap cleanup_changelog EXIT
        rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
        touch $DIR/$tdir/foo_161c
@@ -10937,10 +10973,8 @@ test_161c() {
        $LFS changelog $MDT0 | grep RENME
        local flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | \
                cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x1" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x1"
        fi
        echo "rename overwrite a target having nlink = 1," \
@@ -10953,10 +10987,8 @@ test_161c() {
        mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
        $LFS changelog $MDT0 | grep RENME
        flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "rename overwrite a target having nlink > 1," \
@@ -10967,10 +10999,8 @@ test_161c() {
        mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
        $LFS changelog $MDT0 | grep RENME
        flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "rename doesn't overwrite a target," \
@@ -10981,10 +11011,8 @@ test_161c() {
        rm -f $DIR/$tdir/foo2_161c
        $LFS changelog $MDT0 | grep UNLNK
        flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x1" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x1"
        fi
        echo "unlink a file having nlink = 1," \
@@ -10995,15 +11023,13 @@ test_161c() {
        rm -f $DIR/$tdir/foobar_161c
        $LFS changelog $MDT0 | grep UNLNK
        flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "unlink a file having nlink > 1," \
                "changelog record has flags of $flags"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
 
@@ -11925,10 +11951,11 @@ jobstats_set() {
 }
 
 cleanup_205() {
+       trap 0
        do_facet $SINGLEMDS \
                $LCTL set_param mdt.*.job_cleanup_interval=$OLD_INTERVAL
        [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
-       do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER
+       cleanup_changelog
 }
 
 test_205() { # Job stats
@@ -14960,16 +14987,114 @@ test_311() {
        local new_iused
        for i in $(seq 120); do
                new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
-               [ $new_iused -lt $((old_iused - 900)) ] && break
+               [ $((old_iused - new_iused)) -gt 800 ] && break
                sleep 1
        done
 
        echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
-       [ $new_iused -lt $((old_iused - 900)) ] ||
+       [ $((old_iused - new_iused)) -gt 800 ] ||
                error "objs not destroyed after unlink"
 }
 run_test 311 "disable OSP precreate, and unlink should destroy objs"
 
+zfs_oid_to_objid()
+{
+       local ost=$1
+       local objid=$2
+
+       local vdevdir=$(dirname $(facet_vdevice $ost))
+       local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
+       local zfs_zapid=$(do_facet $ost $cmd |
+                         grep -w "/O/0/d$((objid%32))" -C 5 |
+                         awk '/Object/{getline; print $1}')
+       local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
+                         awk "/$objid = /"'{printf $3}')
+
+       echo $zfs_objid
+}
+
+zfs_object_blksz() {
+       local ost=$1
+       local objid=$2
+
+       local vdevdir=$(dirname $(facet_vdevice $ost))
+       local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
+       local blksz=$(do_facet $ost $cmd $objid |
+                     awk '/dblk/{getline; printf $4}')
+
+       case "${blksz: -1}" in
+               k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
+               m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
+               *) ;;
+       esac
+
+       echo $blksz
+}
+
+test_312() { # LU-4856
+       [ $(facet_fstype ost1) = "zfs" ] ||
+               { skip "the test only applies to zfs" && return; }
+
+       local max_blksz=$(do_facet ost1 \
+                         $ZFS get -p recordsize $(facet_device ost1) |
+                         awk '!/VALUE/{print $3}')
+
+       # to make life a little bit easier
+       $LFS mkdir -c 1 -i 0 $DIR/$tdir
+       $LFS setstripe -c 1 -i 0 $DIR/$tdir
+
+       local tf=$DIR/$tdir/$tfile
+       touch $tf
+       local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+
+       # Get ZFS object id
+       local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       # block size change by sequential over write
+       local blksz
+       for ((bs=4096; bs <= max_blksz; bs <<= 2)); do
+               dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
+
+               blksz=$(zfs_object_blksz ost1 $zfs_objid)
+               [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
+       done
+       rm -f $tf
+
+       # block size change by sequential append write
+       dd if=/dev/zero of=$tf bs=4K count=1 oflag=sync conv=notrunc
+       oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+       zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       for ((count = 1; count < $((max_blksz / 4096)); count *= 2)); do
+               dd if=/dev/zero of=$tf bs=4K count=$count seek=$count \
+                       oflag=sync conv=notrunc
+
+               blksz=$(zfs_object_blksz ost1 $zfs_objid)
+               blksz=$((blksz / 8192)) # in 2*4K unit
+               [ $blksz -eq $count ] ||
+                       error "blksz error(in 8k): $blksz, expected: $count"
+       done
+       rm -f $tf
+
+       # random write
+       touch $tf
+       oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+       zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       dd if=/dev/zero of=$tf bs=8K count=1 oflag=sync conv=notrunc
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 8192 ] || error "blksz error: $blksz, expected: 8k"
+
+       dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
+
+       dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
+}
+run_test 312 "make sure ZFS adjusts its block size by write pattern"
+
 test_400a() { # LU-1606, was conf-sanity test_74
        local extra_flags=''
        local out=$TMP/$tfile