+check_stats() {
+ local res
+ local count
+ case $1 in
+ $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"`
+ ;;
+ ost) res=`do_facet ost1 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"`
+ ;;
+ *) error "Wrong argument $1" ;;
+ esac
+ echo $res
+ count=`echo $res | awk '{print $2}'`
+ [ -z "$res" ] && error "The counter for $2 on $1 was not incremented"
+ # if the argument $3 is zero, it means any stat increment is ok.
+ if [ $3 -gt 0 ] ; then
+ [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3"
+ fi
+}
+
+test_133a() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p $DIR/${tdir}
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
+
+ # verify mdt stats first.
+ mkdir ${testdir} || error "mkdir failed"
+ check_stats $SINGLEMDS "mkdir" 1
+ touch ${testdir}/${tfile} || "touch failed"
+ check_stats $SINGLEMDS "open" 1
+ check_stats $SINGLEMDS "close" 1
+ mknod ${testdir}/${tfile}-pipe p || "mknod failed"
+ check_stats $SINGLEMDS "mknod" 1
+ rm -f ${testdir}/${tfile}-pipe || "pipe remove failed"
+ check_stats $SINGLEMDS "unlink" 1
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats $SINGLEMDS "unlink" 2
+
+ # remove working dir and check mdt stats again.
+ rmdir ${testdir} || error "rmdir failed"
+ check_stats $SINGLEMDS "rmdir" 1
+
+ local testdir1=$DIR/${tdir}/stats_testdir1
+ mkdir -p ${testdir}
+ mkdir -p ${testdir1}
+ touch ${testdir1}/test1
+ mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
+ check_stats $SINGLEMDS "crossdir_rename" 1
+
+ mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
+ check_stats $SINGLEMDS "samedir_rename" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133a "Verifying MDT stats ========================================"
+
+test_133b() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+ touch ${testdir}/${tfile} || "touch failed"
+ cancel_lru_locks mdc
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
+
+ # extra mdt stats verification.
+ chmod 444 ${testdir}/${tfile} || error "chmod failed"
+ check_stats $SINGLEMDS "setattr" 1
+ $LFS df || error "lfs failed"
+ check_stats $SINGLEMDS "statfs" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133b "Verifying extra MDT stats =================================="
+
+test_133c() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+
+ # verify obdfilter stats.
+ $LFS setstripe -c 1 -o 0 ${testdir}/${tfile}
+ sync
+ cancel_lru_locks osc
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
+
+ dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=512k count=1 || error "dd failed"
+ sync
+ cancel_lru_locks osc
+ check_stats ost "write" 1
+
+ dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed"
+ check_stats ost "read" 1
+
+ > ${testdir}/${tfile} || error "truncate failed"
+ check_stats ost "punch" 1
+
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats ost "destroy" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133c "Verifying OST stats ========================================"
+
+order_2() {
+ local value=$1
+ local orig=$value
+ local order=1
+
+ while [ $value -ge 2 ]; do
+ order=$((order*2))
+ value=$((value/2))
+ done
+
+ if [ $orig -gt $order ]; then
+ order=$((order*2))
+ fi
+ echo $order
+}
+
+size_in_KMGT() {
+ local value=$1
+ local size=('K' 'M' 'G' 'T');
+ local i=0
+ local size_string=$value
+
+ while [ $value -ge 1024 ]; do
+ if [ $i -gt 3 ]; then
+ #T is the biggest unit we get here, if that is bigger,
+ #just return XXXT
+ size_string=${value}T
+ break
+ fi
+ value=$((value >> 10))
+ if [ $value -lt 1024 ]; then
+ size_string=${value}${size[$i]}
+ break
+ fi
+ i=$((i + 1))
+ done
+
+ echo $size_string
+}
+
+get_rename_size() {
+ local size=$1
+ local sample=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
+ echo $sample
+}
+
+test_133d() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir1=$DIR/${tdir}/stats_testdir1
+ local testdir2=$DIR/${tdir}/stats_testdir2
+
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
+
+ mkdir -p ${testdir1} || error "mkdir failed"
+ mkdir -p ${testdir2} || error "mkdir failed"
+
+ createmany -o $testdir1/test 512 || error "createmany failed"
+ local testdir1_size=$(ls -l $DIR/${tdir} | \
+ awk '/stats_testdir1/ {print $5}')
+ local testdir2_size=$(ls -l $DIR/${tdir} | \
+ awk '/stats_testdir2/ {print $5}')
+
+ testdir1_size=$(order_2 $testdir1_size)
+ testdir2_size=$(order_2 $testdir2_size)
+
+ testdir1_size=$(size_in_KMGT $testdir1_size)
+ testdir2_size=$(size_in_KMGT $testdir2_size)
+
+ # check samedir rename size
+ mv ${testdir1}/test0 ${testdir1}/test_0
+ local samedir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ grep 'same_dir')
+ local same_sample=$(get_rename_size $testdir1_size)
+ [ -z "$samedir" ] && error "samedir_rename_size count error"
+ [ $same_sample -eq 1 ] || error "samedir_rename_size count error"
+ echo "Check same dir rename stats success"
+
+ # check crossdir rename size
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
+ mv ${testdir1}/test_0 ${testdir2}/test_0
+ local crossdir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ grep 'crossdir')
+ local src_sample=$(get_rename_size $testdir1_size)
+ local tgt_sample=$(get_rename_size $testdir2_size)
+ [ -z "$crossdir" ] && error "crossdir_rename_size count error"
+ [ $src_sample -eq 1 ] || error "crossdir_rename_size count error"
+ [ $tgt_sample -eq 1 ] || error "crossdir_rename_size count error"
+ echo "Check cross dir rename stats success"
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133d "Verifying rename_stats ========================================"
+