Fix sanity test_270a to work with ARM so that it does O_DIRECT
writes with a multiple of the local PAGE_SIZE (65536 bytes)
instead of 102400 bytes (which works fine on x64, but not ARM).
Generalize the test to use variables instead of precomputed values
so that it is clear why the particular values are used.
Test-Parameters: trivial envdefinitions=ONLY=270a
Test-Parameters: mdtfilesystemtype=zfs ostfilesystemtype=zfs testlist=sanity envdefinitions=ONLY=270a
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: Ic2a32215dc1423b0bbf1e5188a5e85420a3ebbe5
Reviewed-on: https://review.whamcloud.com/33633
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Jian Yu <yujian@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
### Data-on-MDT sanity tests ###
test_270a() {
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
### Data-on-MDT sanity tests ###
test_270a() {
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
- skip "Need MDS version at least 2.10.55"
+ skip "Need MDS version at least 2.10.55 for DoM"
# create DoM file
local dom=$DIR/$tdir/dom_file
# create DoM file
local dom=$DIR/$tdir/dom_file
mkdir -p $DIR/$tdir
# basic checks for DoM component creation
mkdir -p $DIR/$tdir
# basic checks for DoM component creation
- $LFS setstripe -E 1024K -E 1024K -L mdt $dom 2>/dev/null &&
+ $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
error "Can set MDT layout to non-first entry"
error "Can set MDT layout to non-first entry"
- $LFS setstripe -E 1024K -L mdt -E 1024K -L mdt $dom 2>/dev/null &&
+ $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
error "Can define multiple entries as MDT layout"
error "Can define multiple entries as MDT layout"
- $LFS setstripe -E 1M -L mdt $dom ||
- error "Can't create DoM layout"
+ $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
[ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
[ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
[ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
[ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
local space_check=1
# Skip free space checks with ZFS
local space_check=1
# Skip free space checks with ZFS
- if [ "$(facet_fstype $facet)" == "zfs" ]; then
- space_check=0
- fi
+ [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
+ local size_tmp=$((65536 * 3))
local mdtfree1=$(do_facet $facet \
local mdtfree1=$(do_facet $facet \
- lctl get_param -n osd*.*$mdtname.kbytesfree)
- dd if=/dev/urandom of=$tmp bs=1024 count=100
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+
+ dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
# check also direct IO along write
# check also direct IO along write
- dd if=$tmp of=$dom bs=102400 count=1 oflag=direct
+ # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
+ dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
sync
cmp $tmp $dom || error "file data is different"
sync
cmp $tmp $dom || error "file data is different"
- [ $(stat -c%s $dom) == 102400 ] || error "bad size after write"
+ [ $(stat -c%s $dom) == $size_tmp ] ||
+ error "bad size after write: $(stat -c%s $dom) != $size_tmp"
if [ $space_check == 1 ]; then
local mdtfree2=$(do_facet $facet \
if [ $space_check == 1 ]; then
local mdtfree2=$(do_facet $facet \
- lctl get_param -n osd*.*$mdtname.kbytesfree)
- [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
- error "MDT free space is wrong after write"
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+
+ # increase in usage from by $size_tmp
+ [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
+ error "MDT free space wrong after write: " \
+ "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
- $TRUNCATE $dom 10000
- [ $(stat -c%s $dom) == 10000 ] || error "bad size after truncate"
+ local size_dom=10000
+
+ $TRUNCATE $dom $size_dom
+ [ $(stat -c%s $dom) == $size_dom ] ||
+ error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
if [ $space_check == 1 ]; then
mdtfree1=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
if [ $space_check == 1 ]; then
mdtfree1=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
- [ $(($mdtfree1 - $mdtfree2)) -ge 92 ] ||
- error "MDT free space is wrong after truncate"
+ # decrease in usage from $size_tmp to new $size_dom
+ [ $(($mdtfree1 - $mdtfree2)) -ge \
+ $(((size_tmp - size_dom) / 1024)) ] ||
+ error "MDT free space is wrong after truncate: " \
+ "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
fi
# append
cat $tmp >> $dom
sync
fi
# append
cat $tmp >> $dom
sync
- [ $(stat -c%s $dom) == 112400 ] || error "bad size after append"
+ size_dom=$((size_dom + size_tmp))
+ [ $(stat -c%s $dom) == $size_dom ] ||
+ error "bad size after append: $(stat -c%s $dom) != $size_dom"
if [ $space_check == 1 ]; then
mdtfree2=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
if [ $space_check == 1 ]; then
mdtfree2=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
- [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
- error "MDT free space is wrong after append"
+ # increase in usage by $size_tmp from previous
+ [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
+ error "MDT free space is wrong after append: " \
+ "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
if [ $space_check == 1 ]; then
mdtfree1=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
if [ $space_check == 1 ]; then
mdtfree1=$(do_facet $facet \
lctl get_param -n osd*.*$mdtname.kbytesfree)
- [ $(($mdtfree1 - $mdtfree2)) -ge 112 ] ||
- error "MDT free space is wrong after removal"
+ # decrease in usage by $size_dom from previous
+ [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
+ error "MDT free space is wrong after removal: " \
+ "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
fi
# combined striping
$LFS setstripe -E 1024K -L mdt -E EOF $dom ||
error "Can't create DoM + OST striping"
fi
# combined striping
$LFS setstripe -E 1024K -L mdt -E EOF $dom ||
error "Can't create DoM + OST striping"
- dd if=/dev/urandom of=$tmp bs=1024 count=2000
+ size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
+ dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
# check also direct IO along write
# check also direct IO along write
- dd if=$tmp of=$dom bs=102400 count=20 oflag=direct
+ dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
sync
cmp $tmp $dom || error "file data is different"
sync
cmp $tmp $dom || error "file data is different"
- [ $(stat -c%s $dom) == 2048000 ] || error "bad size after write"
- rm $dom
- rm $tmp
+ [ $(stat -c%s $dom) == $size_tmp ] ||
+ error "bad size after write: $(stat -c%s $dom) != $size_tmp"
+ rm $dom $tmp