]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Make dbufstat work on FreeBSD
authorRyan Moeller <ryan@iXsystems.com>
Thu, 8 Oct 2020 16:40:23 +0000 (12:40 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 16 Oct 2020 20:00:28 +0000 (13:00 -0700)
With procfs_list kstats implemented for FreeBSD, dbufs are now exposed
as kstat.zfs.misc.dbufs.

On FreeBSD, dbufstats can use the sysctl instead of procfs when no
input file has been given.

Enable the dbufstats tests on FreeBSD.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ryan Moeller <freqlabs@FreeBSD.org>
Closes #11008

cmd/dbufstat/dbufstat.in
module/os/freebsd/spl/spl_kstat.c
tests/runfiles/common.run
tests/runfiles/linux.run
tests/zfs-tests/include/libtest.shlib
tests/zfs-tests/tests/functional/arc/dbufstats_001_pos.ksh
tests/zfs-tests/tests/functional/arc/dbufstats_002_pos.ksh

index 98eb7905738861eec8c46e9c76dc5b30de514341..1d4eb39d7242cbe0e7719b4e7560c8ea648c431d 100755 (executable)
@@ -113,6 +113,21 @@ cmd = ("Usage: dbufstat [-bdhnrtvx] [-i file] [-f fields] [-o file] "
 raw = 0
 
 
+if sys.platform.startswith("freebsd"):
+    import io
+    # Requires py-sysctl on FreeBSD
+    import sysctl
+
+    def default_ifile():
+        dbufs = sysctl.filter("kstat.zfs.misc.dbufs")[0].value
+        sys.stdin = io.StringIO(dbufs)
+        return "-"
+
+elif sys.platform.startswith("linux"):
+    def default_ifile():
+        return "/proc/spl/kstat/zfs/dbufs"
+
+
 def print_incompat_helper(incompat):
     cnt = 0
     for key in sorted(incompat):
@@ -645,7 +660,7 @@ def main():
             sys.exit(1)
 
     if not ifile:
-        ifile = '/proc/spl/kstat/zfs/dbufs'
+        ifile = default_ifile()
 
     if ifile is not "-":
         try:
index 4cc77e20a4eb603b8ef78d6c97796f60cf400c64..b26753bacc217c25401edf3262cbe90d7f9a8f78 100644 (file)
@@ -231,6 +231,7 @@ restart:
        }
        free(ksp->ks_raw_buf, M_TEMP);
        mutex_exit(ksp->ks_lock);
+       sbuf_trim(sb);
        rc = sbuf_finish(sb);
        if (rc == 0)
                rc = SYSCTL_OUT(req, sbuf_data(sb), sbuf_len(sb));
index e06281648e7011b0473b46fec79590ec0d22d726..d2e22f8681dc8e38b4272bf4680f7572a981ad56 100644 (file)
@@ -30,6 +30,11 @@ tests = ['alloc_class_001_pos', 'alloc_class_002_neg', 'alloc_class_003_pos',
     'alloc_class_013_pos']
 tags = ['functional', 'alloc_class']
 
+[tests/functional/arc]
+tests = ['dbufstats_001_pos', 'dbufstats_002_pos', 'dbufstats_003_pos',
+    'arcstats_runtime_tuning']
+tags = ['functional', 'arc']
+
 [tests/functional/atime]
 tests = ['atime_001_pos', 'atime_002_neg', 'root_atime_off', 'root_atime_on']
 tags = ['functional', 'atime']
index b6508a5cb3cfc902a4ed785da6c3c029200b07c4..94964434e9e637f54e3f9c42f8df2ab544b64de5 100644 (file)
@@ -26,11 +26,6 @@ tags = ['functional']
 tests = ['posix_001_pos', 'posix_002_pos', 'posix_003_pos']
 tags = ['functional', 'acl', 'posix']
 
-[tests/functional/arc:Linux]
-tests = ['dbufstats_001_pos', 'dbufstats_002_pos', 'dbufstats_003_pos',
-    'arcstats_runtime_tuning']
-tags = ['functional', 'arc']
-
 [tests/functional/atime:Linux]
 tests = ['atime_003_pos', 'root_relatime_on']
 tags = ['functional', 'atime']
index 1618c92bd57f931c72368d60df9623a988d4c758..dec723e9a477939eea2621ac541fc7340af6b4a2 100644 (file)
@@ -4154,18 +4154,36 @@ function ls_xattr # path
        esac
 }
 
+function kstat # stat flags?
+{
+       typeset stat=$1
+       typeset flags=${2-"-n"}
+
+       case $(uname) in
+       FreeBSD)
+               sysctl $flags kstat.zfs.misc.$stat
+               ;;
+       Linux)
+               typeset zfs_kstat="/proc/spl/kstat/zfs/$stat"
+               [[ -f "$zfs_kstat" ]] || return 1
+               cat $zfs_kstat
+               ;;
+       *)
+               false
+               ;;
+       esac
+}
+
 function get_arcstat # stat
 {
        typeset stat=$1
 
        case $(uname) in
        FreeBSD)
-               sysctl -n kstat.zfs.misc.arcstats.$stat
+               kstat arcstats.$stat
                ;;
        Linux)
-               typeset zfs_arcstats="/proc/spl/kstat/zfs/arcstats"
-               [[ -f "$zfs_arcstats" ]] || return 1
-               grep $stat $zfs_arcstats | awk '{print $3}'
+               kstat arcstats | awk "/$stat/ { print \$3 }"
                ;;
        *)
                false
index 4884f11bb811e195daaf64afa405bfb107609fbd..0577a6b80c0488fe398f26878cffc4f72d1d988a 100755 (executable)
@@ -55,7 +55,13 @@ function testdbufstat # stat_name dbufstat_filter
 
         [[ -n "$2" ]] && filter="-F $2"
 
-       from_dbufstat=$(grep -w "$name" "$DBUFSTATS_FILE" | awk '{ print $3 }')
+       if is_linux; then
+               from_dbufstat=$(grep -w "$name" "$DBUFSTATS_FILE" |
+                   awk '{ print $3 }')
+       else
+               from_dbufstat=$(awk "/dbufstats\.$name:/ { print \$2 }" \
+                   "$DBUFSTATS_FILE")
+       fi
        from_dbufs=$(dbufstat -bxn -i "$DBUFS_FILE" "$filter" | wc -l)
 
        within_tolerance $from_dbufstat $from_dbufs 15 \
@@ -71,8 +77,8 @@ log_onexit cleanup
 log_must file_write -o create -f "$TESTDIR/file" -b 1048576 -c 20 -d R
 log_must zpool sync
 
-log_must eval "cat /proc/spl/kstat/zfs/dbufs > $DBUFS_FILE"
-log_must eval "cat /proc/spl/kstat/zfs/dbufstats > $DBUFSTATS_FILE"
+log_must eval "kstat dbufs > $DBUFS_FILE"
+log_must eval "kstat dbufstats '' > $DBUFSTATS_FILE"
 
 for level in {0..11}; do
        testdbufstat "cache_level_$level" "dbc=1,level=$level"
index dc30b660656da1e4b08ed0ffd5d11be84efea51c..58d401539ed178fdcdcab470405fc3ceee818e87 100755 (executable)
@@ -58,10 +58,10 @@ log_onexit cleanup
 log_must file_write -o create -f "$TESTDIR/file" -b 1048576 -c 1 -d R
 log_must zpool sync
 
-objid=$(stat --format="%i" "$TESTDIR/file")
+objid=$(get_objnum "$TESTDIR/file")
 log_note "Object ID for $TESTDIR/file is $objid"
 
-log_must eval "cat /proc/spl/kstat/zfs/dbufs > $DBUFS_FILE"
+log_must eval "kstat dbufs > $DBUFS_FILE"
 dbuf=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid" | wc -l)
 mru=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid,list=1" | wc -l)
 mfu=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid,list=3" | wc -l)
@@ -70,7 +70,7 @@ verify_ne "0" "$mru" "mru count"
 verify_eq "0" "$mfu" "mfu count"
 
 log_must eval "cat $TESTDIR/file > /dev/null"
-log_must eval "cat /proc/spl/kstat/zfs/dbufs > $DBUFS_FILE"
+log_must eval "kstat dbufs > $DBUFS_FILE"
 dbuf=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid" | wc -l)
 mru=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid,list=1" | wc -l)
 mfu=$(dbufstat -bxn -i "$DBUFS_FILE" -F "object=$objid,list=3" | wc -l)