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 $*
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
[ "$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"
# 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' ')
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"
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)
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"
[ $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
$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"
[ $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"
# 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
$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," \
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," \
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," \
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," \
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"
}
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
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