test_24v() {
local NRFILES=100000
- local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}')
+ local FREE_INODES=$(mdt_free_inodes 0)
[ $FREE_INODES -lt $NRFILES ] && \
skip "not enough free inodes $FREE_INODES required $NRFILES" &&
return
mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
+ mrename $remote_dir $DIR/ &&
+ error "rename dir cross MDT works!"
+
mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
error "rename dir cross MDT works!"
# on the mdt's osc
local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST)
local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \
- osc.$mdtosc_proc1.prealloc_last_id)
+ osc.$mdtosc_proc1.prealloc_last_id)
local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \
- osc.$mdtosc_proc1.prealloc_next_id)
+ osc.$mdtosc_proc1.prealloc_next_id)
local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX})
do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc*
}
run_test 39n "check that O_NOATIME is honored"
+test_39o() {
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ mkdir a b
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir b
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39o "directory cached attributes updated after create ========"
+
test_40() {
dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
local STRIPE_SIZE=1048576
local FILE_LENGTH=$((STRIPE_SIZE*100))
local nreads=10000
- local osc
-
- setup_test101bc
-
- cancel_lru_locks osc
- $LCTL set_param osc.*.rpc_stats 0
- $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
- for osc in $($LCTL get_param -N osc.*); do
- if [ "$osc" == "osc.num_refs" ]; then
- continue
- fi
+ local osc_rpc_stats
- local lines=$($LCTL get_param -n ${osc}.rpc_stats | wc | awk '{print $1}')
- if [ $lines -le 20 ]; then
- continue
- fi
+ setup_test101bc
- local rpc4k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "1:" { print $2; exit; }')
- local rpc8k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "2:" { print $2; exit; }')
- local rpc16k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "4:" { print $2; exit; }')
- local rpc32k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "8:" { print $2; exit; }')
-
- [ $rpc4k != 0 ] && error "Small 4k read IO ${rpc4k}!"
- [ $rpc8k != 0 ] && error "Small 8k read IO ${rpc8k}!"
- [ $rpc16k != 0 ] && error "Small 16k read IO ${rpc16k}!"
- [ $rpc32k != 0 ] && error "Small 32k read IO ${rpc32k}!"
- echo "${osc} rpc check passed!"
- done
- cleanup_test101bc
- true
+ cancel_lru_locks osc
+ $LCTL set_param osc.*.rpc_stats 0
+ $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
+ for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
+ local stats=$($LCTL get_param -n $osc_rpc_stats)
+ local lines=$(echo "$stats" | awk 'END {print NR;}')
+ local size
+
+ if [ $lines -le 20 ]; then
+ continue
+ fi
+ for size in 1 2 4 8; do
+ local rpc=$(echo "$stats" |
+ awk '($1 == "'$size':") {print $2; exit; }')
+ [ $rpc != 0 ] &&
+ error "Small $((size*4))k read IO $rpc !"
+ done
+ echo "$osc_rpc_stats check passed!"
+ done
+ cleanup_test101bc
+ true
}
run_test 101c "check stripe_size aligned read-ahead ================="
return 0;
}
-run_test 102l "listxattr filter test =================================="
+run_test 102l "listxattr size test =================================="
+
+test_102m() { # LU-3403 llite: error of listxattr when buffer is small
+ local path=$DIR/$tfile
+ touch $path
+
+ listxattr_size_check $path || error "listattr_size_check $path failed"
+}
+run_test 102m "Ensure listxattr fails on small bufffer ========"
cleanup_test102
[ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
echo -n "Free space priority "
- lctl get_param -n lov.*-clilov-*.qos_prio_free
+ do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
+ head -1
declare -a AVAIL
free_min_max
- [ $MINV -gt 960000 ] && skip "too much free space in OST$MINI, skip" &&\
- return
- # generate uneven OSTs
+ [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip" && return
+ trap simple_cleanup_common EXIT
+
+ # Check if we need to generate uneven OSTs
test_mkdir -p $DIR/$tdir/OST${MINI}
- declare -i FILL
- FILL=$(($MINV / 4))
- echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb"
- $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI}||error "setstripe failed"
- i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i bs=2M count=1 2>/dev/null
- FILL=$(($FILL - 2048))
- echo -n .
- done
- FILL=$(($MINV / 4))
- sync
- sleep_maxage
+ local FILL=$(($MINV / 4))
+ local DIFF=$(($MAXV - $MINV))
+ local DIFF2=$(($DIFF * 100 / $MINV))
+
+ local threshold=$(do_facet $SINGLEMDS \
+ lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+ threshold=${threshold%%%}
+ echo -n "Check for uneven OSTs: "
+ echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
+
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
+ echo "Don't need to fill OST$MINI"
+ else
+ # generate uneven OSTs. Write 2% over the QOS threshold value
+ echo "no"
+ DIFF=$(($threshold - $DIFF2 + 2))
+ DIFF2=$(( ($MINV * $DIFF)/100 ))
+ echo "Fill ${DIFF}% remaining space in OST${MINI} with ${DIFF2}KB"
+ $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
+ error "setstripe failed"
+ DIFF=$(($DIFF2 / 2048))
+ i=0
+ while [ $i -lt $DIFF ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
+ bs=2M count=1 2>/dev/null
+ echo -n .
+ done
+ echo .
+ sync
+ sleep_maxage
+ free_min_max
+ fi
- free_min_max
DIFF=$(($MAXV - $MINV))
DIFF2=$(($DIFF * 100 / $MINV))
- echo -n "diff=${DIFF}=${DIFF2}% must be > 20% for QOS mode..."
- if [ $DIFF2 -gt 20 ]; then
- echo "ok"
+ echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..."
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
else
- echo "failed - QOS mode won't be used"
- error_ignore "QOS imbalance criteria not met"
- return
+ echo "failed - QOS mode won't be used"
+ error_ignore 0000 "QOS imbalance criteria not met"
+ simple_cleanup_common
+ return
fi
MINI1=$MINI; MINV1=$MINV
MAXI1=$MAXI; MAXV1=$MAXV
# now fill using QOS
- echo writing a bunch of files to QOS-assigned OSTs
$SETSTRIPE -c 1 $DIR/$tdir
+ FILL=$(($FILL / 200))
+ if [ $FILL -gt 600 ]; then
+ FILL=600
+ fi
+ echo "writing $FILL files to QOS-assigned OSTs"
i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1024 count=200 2>/dev/null
- FILL=$(($FILL - 200))
- echo -n .
+ while [ $i -lt $FILL ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
+ count=1 2>/dev/null
+ echo -n .
done
echo "wrote $i 200k files"
sync
echo "free space delta: orig $DIFF final $DIFF2"
[ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
DIFF=$(($MINV1 - ${AVAIL[$MINI1]}))
- echo "Wrote $DIFF to smaller OST $MINI1"
+ echo "Wrote ${DIFF}KB to smaller OST $MINI1"
DIFF2=$(($MAXV1 - ${AVAIL[$MAXI1]}))
- echo "Wrote $DIFF2 to larger OST $MAXI1"
- [ $DIFF -gt 0 ] && echo "Wrote $(($DIFF2 * 100 / $DIFF - 100))% more data to larger OST $MAXI1"
+ echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
+ FILL=$(($DIFF2 * 100 / $DIFF - 100))
+ [ $DIFF -gt 0 ] &&
+ echo "Wrote ${FILL}% more data to larger OST $MAXI1"
# Figure out which files were written where
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MINI1': / {print $2; exit}')
+ awk '/'$MINI1': / {print $2; exit}')
echo $UUID
- MINC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MINC files created on smaller OST $MINI1"
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MAXI1': / {print $2; exit}')
+ awk '/'$MAXI1': / {print $2; exit}')
echo $UUID
- MAXC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MAXC files created on larger OST $MAXI1"
- [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1"
- [ $MAXC -gt $MINC ] || error_ignore "stripe QOS didn't balance free space"
+ FILL=$(($MAXC * 100 / $MINC - 100))
+ [ $MINC -gt 0 ] &&
+ echo "Wrote ${FILL}% more files to larger OST $MAXI1"
+ [ $MAXC -gt $MINC ] ||
+ error_ignore 0000 "stripe QOS didn't balance free space"
- rm -rf $DIR/$tdir
+ simple_cleanup_common
}
run_test 116a "stripe QOS: free space balance ==================="
$SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file||error "setstripe on $fm_file"
[ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
- dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+ local actual_stripecnt=$($GETSTRIPE -c $fm_file)
+ dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+ error "dd failed on $fm_file"
filefrag -ves $fm_file || error "filefrag $fm_file failed"
- filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+ filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" |
+ grep -v "ext:" | grep -v "found"`
last_lun=`echo $filefrag_op | cut -d: -f5`
(( tot_len += ext_len ))
last_lun=$frag_lun
done
- if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+ if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
cleanup_130
error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
return
tail -1
}
-test_160() {
+test_160a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
echo "$USERS other changelog users; can't verify off"
fi
}
-run_test 160 "changelog sanity"
+run_test 160a "changelog sanity"
+
+test_160b() { # LU-3587
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+ { skip "Need MDS version at least 2.2.0"; return; }
+
+ 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"
+
+ local LONGNAME1=$(str_repeat a 255)
+ local LONGNAME2=$(str_repeat b 255)
+
+ cd $DIR
+ echo "creating very long named file"
+ touch $LONGNAME1 || error "create of $LONGNAME1 failed"
+ echo "moving very long named file"
+ mv $LONGNAME1 $LONGNAME2
+
+ $LFS changelog $MDT0 | grep RENME
+
+ echo "deregistering $USER"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+
+ rm -f $LONGNAME2
+}
+run_test 160b "Verify that very long rename doesn't crash in changelog"
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
test_214() { # for bug 20133
- test_mkdir -p $DIR/d214p/d214c
+ mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
for (( i=0; i < 340; i++ )) ; do
- touch $DIR/d214p/d214c/a$i
+ touch $DIR/$tdir/d214c/a$i
done
- ls -l $DIR/d214p || error "ls -l $DIR/d214p failed"
- mv $DIR/d214p/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
+ ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
+ mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
ls $DIR/d214c || error "ls $DIR/d214c failed"
+ rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
}
run_test 214 "hash-indexed directory test - bug 20133"
[ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
stat $DIR/$tfile || error "failed to stat released file"
- $TRUNCATE $DIR/$tfile 200000 &&
- error "truncate of released file should fail"
-
- # Ensure that nothing happened anyway.
- $CHECKSTAT -s 0 $DIR/$tfile ||
- error "released file size should not change"
-
- # Stripe count should be no change after truncate
- stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
- [ $stripe_count -eq 2 ] || error "after trunc: ($stripe_count)"
-
chown $RUNAS_ID $DIR/$tfile ||
error "chown $RUNAS_ID $DIR/$tfile failed"
chgrp $RUNAS_ID $DIR/$tfile ||
error "chgrp $RUNAS_ID $DIR/$tfile failed"
- touch $DIR/$tfile ||
- error "touch $DIR/$tfile failed"
-
+ touch $DIR/$tfile || error "touch $DIR/$tfile failed"
rm $DIR/$tfile || error "failed to remove released file"
}
run_test 229 "getstripe/stat/rm/attr changes work on released files"
touch $DIR/$tdir/$tfile || error "touch failed"
# OBD_FAIL_LLITE_XATTR_ENOMEM
$LCTL set_param fail_loc=0x1405
- setfattr -n user.attr -v value $DIR/$tdir/$tfile &&
- error "setfattr should have failed with ENOMEM"
- # attr pre-2.4.44-7 had a bug with rc
- getfattr -n user.attr $DIR/$tdir/$tfile &&
- error "getfattr should have failed with ENOMEM"
+ if [ ! -f /etc/SuSE-release ]; then
+ # attr pre-2.4.44-7 had a bug with rc
+ # LU-3703 - SLES clients have older attr
+ getfattr -n user.attr $DIR/$tdir/$tfile &&
+ error "getfattr should have failed with ENOMEM"
+ fi
$LCTL set_param fail_loc=0x0
rm -rf $DIR/$tdir
}
run_test 235 "LU-1715: flock deadlock detection does not work properly"
+#LU-2935
+test_236() {
+ check_swap_layouts_support && return 0
+ test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+
+ local ref1=/etc/passwd
+ local ref2=/etc/group
+ local file1=$DIR/$tdir/f1
+ local file2=$DIR/$tdir/f2
+
+ $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
+ cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
+ $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
+ cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
+ exec {FD}<>$file2
+ rm $file2
+ $LFS swap_layouts $file1 /proc/self/fd/${FD} ||
+ error "cannot swap layouts of '$file1' and /proc/self/fd/${FD}"
+ exec {FD}>&-
+ cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
+
+ #cleanup
+ rm -rf $DIR/$tdir
+}
+run_test 236 "Layout swap on open unlinked file"
+
#
# tests that do cleanup/setup should be run at the end
#