From 9a1d45c82534df1f8d1cd8bb97edbfd52298fef1 Mon Sep 17 00:00:00 2001 From: manu Date: Tue, 30 Jan 2018 09:59:52 +0000 Subject: [PATCH] nfsstat: Add libxo output Add libxo output support Merge exp41_intpr and exp_intpr function. The only difference is to print NFSV4.1 operations in exp41, add a third arguement to control that. printtitle was set to 1 and don't have a switch, add a -q options to control it. Reviewed by: bapt Sponsored by: Gandi.net Differential Revision: https://reviews.freebsd.org/D14012 --- usr.bin/nfsstat/Makefile | 2 +- usr.bin/nfsstat/nfsstat.1 | 12 +- usr.bin/nfsstat/nfsstat.c | 1062 ++++++++++++++++--------------------- 3 files changed, 479 insertions(+), 597 deletions(-) diff --git a/usr.bin/nfsstat/Makefile b/usr.bin/nfsstat/Makefile index c74815ac0e46..76b701f73c7d 100644 --- a/usr.bin/nfsstat/Makefile +++ b/usr.bin/nfsstat/Makefile @@ -4,6 +4,6 @@ PROG= nfsstat CFLAGS+=-DNFS -LIBADD+= devstat +LIBADD+= devstat xo .include diff --git a/usr.bin/nfsstat/nfsstat.1 b/usr.bin/nfsstat/nfsstat.1 index c537c82d6a15..5a2030cb88ad 100644 --- a/usr.bin/nfsstat/nfsstat.1 +++ b/usr.bin/nfsstat/nfsstat.1 @@ -28,7 +28,7 @@ .\" From: @(#)nfsstat.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd November 23, 2016 +.Dd January 22, 2018 .Dt NFSSTAT 1 .Os .Sh NAME @@ -38,6 +38,7 @@ statistics .Sh SYNOPSIS .Nm +.Op Fl -libxo .Op Fl cdEemszW .Op Fl M Ar core .Op Fl N Ar system @@ -124,6 +125,15 @@ activity for both the client and server at second intervals. .It Fl z Reset statistics after displaying them. +.It Fl q +Do not print header +.It Fl -libxo +Generate output via +.Xr libxo 3 +in a selection of different human and machine readable formats. +See +.Xr xo_parse_args 3 +for details on command line arguments. .El .Sh FILES .Bl -tag -width ".Pa /boot/kernel/kernel" -compact diff --git a/usr.bin/nfsstat/nfsstat.c b/usr.bin/nfsstat/nfsstat.c index f1fa12cb3300..45aeaedaedbb 100644 --- a/usr.bin/nfsstat/nfsstat.c +++ b/usr.bin/nfsstat/nfsstat.c @@ -101,6 +101,8 @@ static const char rcsid[] = #include #include +#include + static int widemode = 0; static int zflag = 0; static int printtitle = 1; @@ -112,8 +114,7 @@ static void printhdr(int, int, int); static void usage(void); static char *sperc1(int, int); static char *sperc2(int, int); -static void exp_intpr(int, int); -static void exp41_intpr(int, int); +static void exp_intpr(int, int, int); static void exp_sidewaysintpr(u_int, int, int, int); static void compute_new_stats(struct nfsstatsv1 *cur_stats, struct nfsstatsv1 *prev_stats, int curop, long double etime, @@ -140,6 +141,8 @@ static struct stattypes statstruct[] = { #define STAT_TYPE_TO_NFS(stat_type) statstruct[stat_type].nfs_type +#define NFSSTAT_XO_VERSION "1" + int main(int argc, char **argv) { @@ -156,7 +159,14 @@ main(int argc, char **argv) interval = 0; memf = nlistf = NULL; - while ((ch = getopt(argc, argv, "cdEesWM:mN:w:z")) != -1) + + argc = xo_parse_args(argc, argv); + if (argc < 0) + exit(1); + + xo_set_version(NFSSTAT_XO_VERSION); + + while ((ch = getopt(argc, argv, "cdEesWM:mN:w:zq")) != -1) switch(ch) { case 'M': memf = optarg; @@ -211,14 +221,17 @@ main(int argc, char **argv) break; case 'E': if (extra_output != 0) - errx(1, "-e and -E are mutually exclusive"); + xo_err(1, "-e and -E are mutually exclusive"); extra_output = 2; break; case 'e': if (extra_output != 0) - errx(1, "-e and -E are mutually exclusive"); + xo_err(1, "-e and -E are mutually exclusive"); extra_output = 1; break; + case 'q': + printtitle = 0; + break; case '?': default: usage(); @@ -238,19 +251,21 @@ main(int argc, char **argv) } #endif if (modfind("nfscommon") < 0) - errx(1, "NFS client/server not loaded"); + xo_err(1, "NFS client/server not loaded"); if (interval) { exp_sidewaysintpr(interval, clientOnly, serverOnly, newStats); } else { - if (extra_output == 2) - exp41_intpr(clientOnly, serverOnly); - else if (extra_output == 1) - exp_intpr(clientOnly, serverOnly); + xo_open_container("nfsstat"); + if (extra_output != 0) + exp_intpr(clientOnly, serverOnly, extra_output - 1); else intpr(clientOnly, serverOnly); + xo_close_container("nfsstat"); } + + xo_finish(); exit(0); } @@ -271,14 +286,24 @@ intpr(int clientOnly, int serverOnly) } ext_nfsstats.vers = NFSSTATS_V1; if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) - err(1, "Can't get stats"); + xo_err(1, "Can't get stats"); if (clientOnly) { - printf("Client Info:\n"); - printf("Rpc Counts:\n"); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Getattr", "Setattr", "Lookup", "Readlink", "Read", - "Write", "Create", "Remove"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", + xo_open_container("clientstats"); + + if (printtitle) + xo_emit("{T:Client Info:\n"); + + xo_open_container("operations"); + xo_emit("{T:Rpc Counts:}\n"); + + xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}" + "{T:Lookup/%13.13s}{T:Readlink/%13.13s}" + "{T:Read/%13.13s}{T:Write/%13.13s}" + "{T:Create/%13.13s}{T:Remove/%13.13s}\n"); + xo_emit("{:getattr/%13ju}{:setattr/%13ju}" + "{:lookup/%13ju}{:readlink/%13ju}" + "{:read/%13ju}{:write/%13ju}" + "{:create/%13ju}{:remove/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], @@ -287,125 +312,188 @@ intpr(int clientOnly, int serverOnly) (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Rename", "Link", "Symlink", "Mkdir", "Rmdir", - "Readdir", "RdirPlus", "Access"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); - printf("%9ju %9ju %9ju %9ju %9ju\n", + + xo_emit("{T:Rename/%13.13s}{T:Link/%13.13s}" + "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}" + "{T:Rmdir/%13.13s}{T:Readdir/%13.13s}" + "{T:RdirPlus/%13.13s}{T:Access/%13.13s}\n"); + xo_emit("{:rename/%13ju}{:link/%13ju}" + "{:symlink/%13ju}{:mkdir/%13ju}" + "{:rmdir/%13ju}{:readdir/%13ju}" + "{:rdirplus/%13ju}{:access/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]); + + xo_emit("{T:Mknod/%13.13s}{T:Fsstat/%13.13s}" + "{T:Fsinfo/%13.13s}{T:PathConf/%13.13s}" + "{T:Commit/%13.13s}\n"); + xo_emit("{:mknod/%13ju}{:fsstat/%13ju}" + "{:fsinfo/%13ju}{:pathconf/%13ju}" + "{:commit/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT]); - printf("Rpc Info:\n"); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", - "TimedOut", "Invalid", "X Replies", "Retries", - "Requests"); - printf("%9ju %9ju %9ju %9ju %9ju\n", + + xo_close_container("operations"); + + xo_open_container("rpcs"); + xo_emit("{T:Rpc Info:}\n"); + + xo_emit("{T:TimedOut/%13.13s}{T:Invalid/%13.13s}" + "{T:X Replies/%13.13s}{T:Retries/%13.13s}" + "{T:Requests/%13.13s}\n"); + xo_emit("{:timedout/%13ju}{:invalid/%13ju}" + "{:xreplies/%13ju}{:retries/%13ju}" + "{:requests/%13ju}\n", (uintmax_t)ext_nfsstats.rpctimeouts, (uintmax_t)ext_nfsstats.rpcinvalid, (uintmax_t)ext_nfsstats.rpcunexpected, (uintmax_t)ext_nfsstats.rpcretries, (uintmax_t)ext_nfsstats.rpcrequests); - printf("Cache Info:\n"); - printf("%9.9s %9.9s %9.9s %9.9s", - "Attr Hits", "Misses", "Lkup Hits", "Misses"); - printf(" %9.9s %9.9s %9.9s %9.9s\n", - "BioR Hits", "Misses", "BioW Hits", "Misses"); - printf("%9ju %9ju %9ju %9ju", - (uintmax_t)ext_nfsstats.attrcache_hits, - (uintmax_t)ext_nfsstats.attrcache_misses, - (uintmax_t)ext_nfsstats.lookupcache_hits, - (uintmax_t)ext_nfsstats.lookupcache_misses); - printf(" %9ju %9ju %9ju %9ju\n", - (uintmax_t)(ext_nfsstats.biocache_reads - - ext_nfsstats.read_bios), - (uintmax_t)ext_nfsstats.read_bios, - (uintmax_t)(ext_nfsstats.biocache_writes - - ext_nfsstats.write_bios), - (uintmax_t)ext_nfsstats.write_bios); - printf("%9.9s %9.9s %9.9s %9.9s", - "BioRLHits", "Misses", "BioD Hits", "Misses"); - printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); - printf("%9ju %9ju %9ju %9ju", - (uintmax_t)(ext_nfsstats.biocache_readlinks - - ext_nfsstats.readlink_bios), - (uintmax_t)ext_nfsstats.readlink_bios, - (uintmax_t)(ext_nfsstats.biocache_readdirs - - ext_nfsstats.readdir_bios), - (uintmax_t)ext_nfsstats.readdir_bios); - printf(" %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.direofcache_hits, - (uintmax_t)ext_nfsstats.direofcache_misses, - (uintmax_t)ext_nfsstats.accesscache_hits, - (uintmax_t)ext_nfsstats.accesscache_misses); + xo_close_container("rpcs"); + + xo_open_container("cache"); + xo_emit("{T:Cache Info:}\n"); + + xo_emit("{T:Attr Hits/%13.13s}{T:Attr Misses/%13.13s}" + "{T:Lkup Hits/%13.13s}{T:Lkup Misses/%13.13s}" + "{T:BioR Hits/%13.13s}{T:BioR Misses/%13.13s}" + "{T:BioW Hits/%13.13s}{T:BioW Misses/%13.13s}\n"); + xo_emit("{:attrhits/%13ju}{:attrmisses/%13ju}" + "{:lkuphits/%13ju}{:lkupmisses/%13ju}" + "{:biorhits/%13ju}{:biormisses/%13ju}" + "{:biowhits/%13ju}{:biowmisses/%13ju}\n", + (uintmax_t)ext_nfsstats.attrcache_hits, + (uintmax_t)ext_nfsstats.attrcache_misses, + (uintmax_t)ext_nfsstats.lookupcache_hits, + (uintmax_t)ext_nfsstats.lookupcache_misses, + (uintmax_t)(ext_nfsstats.biocache_reads - + ext_nfsstats.read_bios), + (uintmax_t)ext_nfsstats.read_bios, + (uintmax_t)(ext_nfsstats.biocache_writes - + ext_nfsstats.write_bios), + (uintmax_t)ext_nfsstats.write_bios); + + xo_emit("{T:BioRL Hits/%13.13s}{T:BioRL Misses/%13.13s}" + "{T:BioD Hits/%13.13s}{T:BioD Misses/%13.13s}" + "{T:DirE Hits/%13.13s}{T:DirE Misses/%13.13s}" + "{T:Accs Hits/%13.13s}{T:Accs Misses/%13.13s}\n"); + xo_emit("{:biosrlhits/%13ju}{:biorlmisses/%13ju}" + "{:biodhits/%13ju}{:biodmisses/%13ju}" + "{:direhits/%13ju}{:diremisses/%13ju}" + "{:accshits/%13ju}{:accsmisses/%13ju}\n", + (uintmax_t)(ext_nfsstats.biocache_readlinks - + ext_nfsstats.readlink_bios), + (uintmax_t)ext_nfsstats.readlink_bios, + (uintmax_t)(ext_nfsstats.biocache_readdirs - + ext_nfsstats.readdir_bios), + (uintmax_t)ext_nfsstats.readdir_bios, + (uintmax_t)ext_nfsstats.direofcache_hits, + (uintmax_t)ext_nfsstats.direofcache_misses, + (uintmax_t)ext_nfsstats.accesscache_hits, + (uintmax_t)ext_nfsstats.accesscache_misses); + + xo_close_container("cache"); + + xo_close_container("clientstats"); } if (serverOnly) { - printf("\nServer Info:\n"); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Getattr", "Setattr", "Lookup", "Readlink", "Read", - "Write", "Create", "Remove"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Rename", "Link", "Symlink", "Mkdir", "Rmdir", - "Readdir", "RdirPlus", "Access"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); - printf("%9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); - printf("Server Ret-Failed\n"); - printf("%17ju\n", (uintmax_t)ext_nfsstats.srvrpc_errs); - printf("Server Faults\n"); - printf("%13ju\n", (uintmax_t)ext_nfsstats.srv_errs); - printf("Server Cache Stats:\n"); - printf("%9.9s %9.9s %9.9s %9.9s\n", - "Inprog", "Idem", "Non-idem", "Misses"); - printf("%9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvcache_inproghits, - (uintmax_t)ext_nfsstats.srvcache_idemdonehits, - (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, - (uintmax_t)ext_nfsstats.srvcache_misses); - printf("Server Write Gathering:\n"); - printf("%9.9s %9.9s %9.9s\n", - "WriteOps", "WriteRPC", "Opsaved"); + xo_open_container("serverstats"); + + xo_emit("{T:Server Info:}\n"); + xo_open_container("operations"); + + xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}" + "{T:Lookup/%13.13s}{T:Readlink/%13.13s}" + "{T:Read/%13.13s}{T:Write/%13.13s}" + "{T:Create/%13.13s}{T:Remove/%13.13s}\n"); + xo_emit("{:getattr/%13ju}{:setattr/%13ju}" + "{:lookup/%13ju}{:readlink/%13ju}" + "{:read/%13ju}{:write/%13ju}" + "{:create/%13ju}{:remove/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); + + xo_emit("{T:Rename/%13.13s}{T:Link/%13.13s}" + "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}" + "{T:Rmdir/%13.13s}{T:Readdir/%13.13s}" + "{T:RdirPlus/%13.13s}{T:Access/%13.13s}\n"); + xo_emit("{:rename/%13ju}{:link/%13ju}" + "{:symlink/%13ju}{:mkdir/%13ju}" + "{:rmdir/%13ju}{:readdir/%13ju}" + "{:rdirplus/%13ju}{:access/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); + + xo_emit("{T:Mknod/%13.13s}{T:Fsstat/%13.13s}" + "{T:Fsinfo/%13.13s}{T:PathConf/%13.13s}" + "{T:Commit/%13.13s}\n"); + xo_emit("{:mknod/%13ju}{:fsstat/%13ju}" + "{:fsinfo/%13ju}{:pathconf/%13ju}" + "{:commit/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); + + xo_close_container("operations"); + + xo_open_container("server"); + xo_emit("{T:Server Re-Failed:}\n"); + xo_emit("{T:retfailed/%17ju}\n", (uintmax_t)ext_nfsstats.srvrpc_errs); + + xo_emit("{T:Server Faults:}\n"); + xo_emit("{T:faults/%13ju}\n", (uintmax_t)ext_nfsstats.srv_errs); + + xo_emit("{T:Server Write Gathering:/%13.13s}\n"); + + xo_emit("{T:WriteOps/%13.13s}{T:WriteRPC/%13.13s}" + "{T:Opsaved/%13.13s}\n"); + xo_emit("{:writeops/%13ju}{:writerpc/%13ju}" + "{:opsaved/%13ju}\n", /* * The new client doesn't do write gathering. It was * only useful for NFSv2. */ - printf("%9ju %9ju %9d\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); + + xo_close_container("server"); + + xo_open_container("cache"); + xo_emit("{T:Server Cache Stats:/%13.13s}\n"); + xo_emit("{T:Inprog/%13.13s}{T:Idem/%13.13s}" + "{T:Non-Idem/%13.13s}{T:Misses/%13.13s}\n"); + xo_emit("{:inprog/%13ju}{:idem/%13ju}" + "{:nonidem/%13ju}{:misses/%13ju}\n", + (uintmax_t)ext_nfsstats.srvcache_inproghits, + (uintmax_t)ext_nfsstats.srvcache_idemdonehits, + (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, + (uintmax_t)ext_nfsstats.srvcache_misses); + xo_close_container("cache"); + + xo_close_container("serverstats"); } } @@ -549,271 +637,17 @@ compute_new_stats(struct nfsstatsv1 *cur_stats, *queue_len = cur_stats->srvstartcnt - cur_stats->srvdonecnt; } -/* - * Print a description of the nfs stats for the experimental client/server. - */ -static void -exp_intpr(int clientOnly, int serverOnly) -{ - int nfssvc_flag; - - nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; - if (zflag != 0) { - if (clientOnly != 0) - nfssvc_flag |= NFSSVC_ZEROCLTSTATS; - if (serverOnly != 0) - nfssvc_flag |= NFSSVC_ZEROSRVSTATS; - } - ext_nfsstats.vers = NFSSTATS_V1; - if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) - err(1, "Can't get stats"); - if (clientOnly != 0) { - if (printtitle) { - printf("Client Info:\n"); - printf("Rpc Counts:\n"); - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Getattr", "Setattr", "Lookup", "Readlink", - "Read", "Write", "Create", "Remove"); - } - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", - "Readdir", "RdirPlus", "Access"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Mknod", "Fsstat", "Fsinfo", "PathConf", - "Commit", "SetClId", "SetClIdCf", "Lock"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]); - if (printtitle) - printf("%9.9s %9.9s %9.9s %9.9s\n", - "LockT", "LockU", "Open", "OpenCfr"); - printf("%9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "OpenOwner", "Opens", "LockOwner", - "Locks", "Delegs", "LocalOwn", - "LocalOpen", "LocalLOwn"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.clopenowners, - (uintmax_t)ext_nfsstats.clopens, - (uintmax_t)ext_nfsstats.cllockowners, - (uintmax_t)ext_nfsstats.cllocks, - (uintmax_t)ext_nfsstats.cldelegates, - (uintmax_t)ext_nfsstats.cllocalopenowners, - (uintmax_t)ext_nfsstats.cllocalopens, - (uintmax_t)ext_nfsstats.cllocallockowners); - if (printtitle) - printf("%9.9s\n", "LocalLock"); - printf("%9ju\n", (uintmax_t)ext_nfsstats.cllocallocks); - if (printtitle) { - printf("Rpc Info:\n"); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", - "TimedOut", "Invalid", "X Replies", "Retries", - "Requests"); - } - printf("%9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.rpctimeouts, - (uintmax_t)ext_nfsstats.rpcinvalid, - (uintmax_t)ext_nfsstats.rpcunexpected, - (uintmax_t)ext_nfsstats.rpcretries, - (uintmax_t)ext_nfsstats.rpcrequests); - if (printtitle) { - printf("Cache Info:\n"); - printf("%9.9s %9.9s %9.9s %9.9s", - "Attr Hits", "Misses", "Lkup Hits", "Misses"); - printf(" %9.9s %9.9s %9.9s %9.9s\n", - "BioR Hits", "Misses", "BioW Hits", "Misses"); - } - printf("%9ju %9ju %9ju %9ju", - (uintmax_t)ext_nfsstats.attrcache_hits, - (uintmax_t)ext_nfsstats.attrcache_misses, - (uintmax_t)ext_nfsstats.lookupcache_hits, - (uintmax_t)ext_nfsstats.lookupcache_misses); - printf(" %9ju %9ju %9ju %9ju\n", - (uintmax_t)(ext_nfsstats.biocache_reads - - ext_nfsstats.read_bios), - (uintmax_t)ext_nfsstats.read_bios, - (uintmax_t)(ext_nfsstats.biocache_writes - - ext_nfsstats.write_bios), - (uintmax_t)ext_nfsstats.write_bios); - if (printtitle) { - printf("%9.9s %9.9s %9.9s %9.9s", - "BioRLHits", "Misses", "BioD Hits", "Misses"); - printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); - } - printf("%9ju %9ju %9ju %9ju", - (uintmax_t)(ext_nfsstats.biocache_readlinks - - ext_nfsstats.readlink_bios), - (uintmax_t)ext_nfsstats.readlink_bios, - (uintmax_t)(ext_nfsstats.biocache_readdirs - - ext_nfsstats.readdir_bios), - (uintmax_t)ext_nfsstats.readdir_bios); - printf(" %9ju %9ju\n", - (uintmax_t)ext_nfsstats.direofcache_hits, - (uintmax_t)ext_nfsstats.direofcache_misses); - } - if (serverOnly != 0) { - if (printtitle) { - printf("\nServer Info:\n"); - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Getattr", "Setattr", "Lookup", "Readlink", - "Read", "Write", "Create", "Remove"); - } - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", - "Readdir", "RdirPlus", "Access"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Mknod", "Fsstat", "Fsinfo", "PathConf", - "Commit", "LookupP", "SetClId", "SetClIdCf"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", - "DelePurge", "DeleRet", "GetFH", "Lock"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); - if (printtitle) - printf( - "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" - , "LockT", "LockU", "Close", "Verify", "NVerify", - "PutFH", "PutPubFH", "PutRootFH"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); - if (printtitle) - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Renew", "RestoreFH", "SaveFH", "Secinfo", - "RelLckOwn", "V4Create"); - printf("%9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); - if (printtitle) { - printf("Server:\n"); - printf("%9.9s %9.9s %9.9s\n", - "Retfailed", "Faults", "Clients"); - } - printf("%9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srv_errs, - (uintmax_t)ext_nfsstats.srvrpc_errs, - (uintmax_t)ext_nfsstats.srvclients); - if (printtitle) - printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", - "OpenOwner", "Opens", "LockOwner", - "Locks", "Delegs"); - printf("%9ju %9ju %9ju %9ju %9ju \n", - (uintmax_t)ext_nfsstats.srvopenowners, - (uintmax_t)ext_nfsstats.srvopens, - (uintmax_t)ext_nfsstats.srvlockowners, - (uintmax_t)ext_nfsstats.srvlocks, - (uintmax_t)ext_nfsstats.srvdelegates); - if (printtitle) { - printf("Server Cache Stats:\n"); - printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", - "Inprog", "Idem", "Non-idem", "Misses", - "CacheSize", "TCPPeak"); - } - printf("%9ju %9ju %9ju %9ju %9ju %9ju\n", - (uintmax_t)ext_nfsstats.srvcache_inproghits, - (uintmax_t)ext_nfsstats.srvcache_idemdonehits, - (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, - (uintmax_t)ext_nfsstats.srvcache_misses, - (uintmax_t)ext_nfsstats.srvcache_size, - (uintmax_t)ext_nfsstats.srvcache_tcppeak); - } -} - /* * Print a description of the nfs stats for the client/server, * including NFSv4.1. */ static void -exp41_intpr(int clientOnly, int serverOnly) +exp_intpr(int clientOnly, int serverOnly, int nfs41) { int nfssvc_flag; + xo_open_container("nfsv4"); + nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; if (zflag != 0) { if (clientOnly != 0) @@ -823,349 +657,387 @@ exp41_intpr(int clientOnly, int serverOnly) } ext_nfsstats.vers = NFSSTATS_V1; if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) - err(1, "Can't get stats"); + xo_err(1, "Can't get stats"); if (clientOnly != 0) { + xo_open_container("clientstats"); + + xo_open_container("operations"); if (printtitle) { - printf("Client Info:\n"); - printf("RPC Counts:\n"); - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Getattr", "Setattr", "Lookup", "Readlink", "Read", - "Write"); + xo_emit("{T:Client Info:}\n"); + xo_emit("{T:RPC Counts:}\n"); } - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}" + "{T:Lookup/%13.13s}{T:Readlink/%13.13s}" + "{T:Read/%13.13s}{T:Write/%13.13s}\n"); + xo_emit("{:getattr/%13ju}{:setattr/%13ju}{:lookup/%13ju}" + "{:readlink/%13ju}{:read/%13ju}{:write/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Create", "Remove", "Rename", "Link", "Symlink", - "Mkdir"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Create/%13.13s}{T:Remove/%13.13s}" + "{T:Rename/%13.13s}{T:Link/%13.13s}" + "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}\n"); + xo_emit("{:create/%13ju}{:remove/%13ju}{:rename/%13ju}" + "{:link/%13ju}{:symlink/%13ju}{:mkdir/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", - "Fsstat"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Rmdir/%13.13s}{T:Readdir/%13.13s}" + "{T:RdirPlus/%13.13s}{T:Access/%13.13s}" + "{T:Mknod/%13.13s}{T:Fsstat/%13.13s}\n"); + xo_emit("{:rmdir/%13ju}{:readdir/%13ju}{:rdirplus/%13ju}" + "{:access/%13ju}{:mknod/%13ju}{:fsstat/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Fsinfo", "PathConf", "Commit", "SetClId", - "SetClIdCf", "Lock"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:FSinfo/%13.13s}{T:pathConf/%13.13s}" + "{T:Commit/%13.13s}{T:SetClId/%13.13s}" + "{T:SetClIdCf/%13.13s}{T:Lock/%13.13s}\n"); + xo_emit("{:fsinfo/%13ju}{:pathconf/%13ju}{:commit/%13ju}" + "{:setclientid/%13ju}{:setclientidcf/%13ju}{:lock/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "LockT", "LockU", "Open", "OpenCfr", "OpenDownGr", - "Close"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:LockT/%13.13s}{T:LockU/%13.13s}" + "{T:Open/%13.13s}{T:OpenCfr/%13.13s}\n"); + xo_emit("{:lockt/%13ju}{:locku/%13ju}" + "{:open/%13ju}{:opencfr/%13ju}\n", (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU], (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "RelLckOwn", "FreeStateID", "PutRootFH", "DelegRet", - "GetACL", "SetACL"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "ExchangeID", "CreateSess", "DestroySess", - "DestroyClId", "LayoutGet", "GetDevInfo"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "LayoutCommit", "LayoutReturn", "ReclaimCompl", - "ReadDataS", "WriteDataS", "CommitDataS"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]); - if (printtitle) - printf( - "%12.12s %12.12s\n", - "OpenLayout", "CreateLayout"); - printf("%12ju %12ju\n", - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENLAYGET], - (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATELAYGET]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "OpenOwner", "Opens", "LockOwner", "Locks", - "Delegs", "LocalOwn"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); + + if (nfs41) { + xo_open_container("nfsv41"); + + xo_emit("{T:OpenDownGr/%13.13s}{T:Close/%13.13s}\n"); + xo_emit("{:opendowngr/%13ju}{:close/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]); + + xo_emit("{T:RelLckOwn/%13.13s}{T:FreeStateID/%13.13s}" + "{T:PutRootFH/%13.13s}{T:DelegRet/%13.13s}" + "{T:GetAcl/%13.13s}{T:SetAcl/%13.13s}\n"); + xo_emit("{:rellckown/%13ju}{:freestateid/%13ju}" + "{:getacl/%13ju}{:delegret/%13ju}" + "{:getacl/%13ju}{:setacl/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]); + + xo_emit("{T:ExchangeId/%13.13s}{T:CreateSess/%13.13s}" + "{T:DestroySess/%13.13s}{T:DestroyClId/%13.13s}" + "{T:LayoutGet/%13.13s}{T:GetDevInfo/%13.13s}\n"); + xo_emit("{:exchangeid/%13ju}{:createsess/%13ju}" + "{:destroysess/%13ju}{:destroyclid/%13ju}" + "{:layoutget/%13ju}{:getdevinfo/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]); + + xo_emit("{T:LayoutCommit/%13.13s}{T:LayoutReturn/%13.13s}" + "{T:ReclaimCompl/%13.13s}{T:ReadDataS/%13.13s}" + "{T:WriteDataS/%13.13s}{T:CommitDataS/%13.13s}\n"); + xo_emit("{:layoutcomit/%13ju}{:layoutreturn/%13ju}" + "{:reclaimcompl/%13ju}{:readdatas/%13ju}" + "{:writedatas/%13ju}{:commitdatas/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]); + + xo_emit("{T:OpenLayout/%13.13s}{T:CreateLayout/%13.13s}\n"); + xo_emit("{:openlayout/%13ju}{:createlayout/%13ju}\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENLAYGET], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATELAYGET]); + + xo_close_container("nfsv41"); + } + xo_close_container("operations"); + + xo_open_container("client"); + xo_emit("{T:OpenOwner/%13.13s}{T:Opens/%13.13s}" + "{T:LockOwner/%13.13s}{T:Locks/%13.13s}" + "{T:Delegs/%13.13s}{T:LocalOwn/%13.13s}\n"); + xo_emit("{:openowner/%13ju}{:opens/%13ju}" + "{:lockowner/%13ju}{:locks/%13ju}" + "{:delegs/%13ju}{:localown/%13ju}\n", (uintmax_t)ext_nfsstats.clopenowners, (uintmax_t)ext_nfsstats.clopens, (uintmax_t)ext_nfsstats.cllockowners, (uintmax_t)ext_nfsstats.cllocks, (uintmax_t)ext_nfsstats.cldelegates, (uintmax_t)ext_nfsstats.cllocalopenowners); - if (printtitle) - printf("%12.12s %12.12s %12.12s\n", - "LocalOpen", "LocalLOwn", "LocalLock"); - printf("%12ju %12ju %12ju\n", + + xo_emit("{T:LocalOpen/%13.13s}{T:LocalLown/%13.13s}" + "{T:LocalLock\n"); + xo_emit("{:localopen/%13ju}{:locallown/%13ju}" + "{:locallock/%13ju}\n", (uintmax_t)ext_nfsstats.cllocalopens, (uintmax_t)ext_nfsstats.cllocallockowners, (uintmax_t)ext_nfsstats.cllocallocks); - if (printtitle) { - printf("Rpc Info:\n"); - printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", - "TimedOut", "Invalid", "X Replies", "Retries", - "Requests"); - } - printf("%12ju %12ju %12ju %12ju %12ju\n", + xo_close_container("client"); + + xo_open_container("rpc"); + if (printtitle) + xo_emit("{T:Rpc Info:}\n"); + xo_emit("{T:TimedOut/%13.13s}{T:Invalid/%13.13s}" + "{T:X Replies/%13.13s}{T:Retries/%13.13s}" + "{T:Requests/%13.13s}\n"); + xo_emit("{:timedout/%13ju}{:invalid/%13ju}" + "{:xreplies/%13ju}{:retries/%13ju}" + "{:requests/%13ju}\n", (uintmax_t)ext_nfsstats.rpctimeouts, (uintmax_t)ext_nfsstats.rpcinvalid, (uintmax_t)ext_nfsstats.rpcunexpected, (uintmax_t)ext_nfsstats.rpcretries, (uintmax_t)ext_nfsstats.rpcrequests); - if (printtitle) { - printf("Cache Info:\n"); - printf("%12.12s %12.12s %12.12s %12.12s\n", - "Attr Hits", "Misses", "Lkup Hits", "Misses"); - } - printf("%12ju %12ju %12ju %12ju\n", + xo_close_container("rpc"); + + xo_open_container("cache"); + if (printtitle) + xo_emit("{T:Cache Info:}\n"); + xo_emit("{T:Attr Hits/%13.13s}{T:Attr Misses/%13.13s}" + "{T:Lkup Hits/%13.13s}{T:Lkup Misses/%13.13s}\n"); + xo_emit("{:attrhits/%13ju}{:attrmisses/%13ju}" + "{:lkuphits/%13ju}{:lkupmisses/%13ju}\n", (uintmax_t)ext_nfsstats.attrcache_hits, (uintmax_t)ext_nfsstats.attrcache_misses, (uintmax_t)ext_nfsstats.lookupcache_hits, (uintmax_t)ext_nfsstats.lookupcache_misses); - if (printtitle) - printf("%12.12s %12.12s %12.12s %12.12s\n", - "BioR Hits", "Misses", "BioW Hits", "Misses"); - printf("%12ju %12ju %12ju %12ju\n", + + xo_emit("{T:BioR Hits/%13.13s}{T:BioR Misses/%13.13s}" + "{T:BioW Hits/%13.13s}{T:BioW Misses/%13.13s}\n"); + xo_emit("{:biorhits/%13ju}{:biormisses/%13ju}" + "{:biowhits/%13ju}{:biowmisses/%13ju}\n", (uintmax_t)(ext_nfsstats.biocache_reads - ext_nfsstats.read_bios), (uintmax_t)ext_nfsstats.read_bios, (uintmax_t)(ext_nfsstats.biocache_writes - ext_nfsstats.write_bios), (uintmax_t)ext_nfsstats.write_bios); - if (printtitle) - printf("%12.12s %12.12s %12.12s %12.12s\n", - "BioRLHits", "Misses", "BioD Hits", "Misses"); - printf("%12ju %12ju %12ju %12ju\n", + + xo_emit("{T:BioRL Hits/%13.13s}{T:BioRL Misses/%13.13s}" + "{T:BioD Hits/%13.13s}{T:BioD Misses/%13.13s}\n"); + xo_emit("{:biorlhits/%13ju}{:biorlmisses/%13ju}" + "{:biodhits/%13ju}{:biodmisses/%13ju}\n", (uintmax_t)(ext_nfsstats.biocache_readlinks - ext_nfsstats.readlink_bios), (uintmax_t)ext_nfsstats.readlink_bios, (uintmax_t)(ext_nfsstats.biocache_readdirs - ext_nfsstats.readdir_bios), (uintmax_t)ext_nfsstats.readdir_bios); - if (printtitle) - printf("%12.12s %12.12s\n", "DirE Hits", "Misses"); - printf("%12ju %12ju\n", + + xo_emit("{T:DirE Hits/%13.13s}{T:DirE Misses/%13.13s}\n"); + xo_emit("{:direhits/%13ju}{:diremisses/%13ju}\n", (uintmax_t)ext_nfsstats.direofcache_hits, (uintmax_t)ext_nfsstats.direofcache_misses); + xo_open_container("cache"); + + xo_close_container("clientstats"); } if (serverOnly != 0) { - if (printtitle) { - printf("\nServer Info:\n"); - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Getattr", "Setattr", "Lookup", "Readlink", - "Read", "Write"); - } - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_open_container("serverstats"); + + xo_open_container("operations"); + if (printtitle) + xo_emit("{T:Server Info:}\n"); + xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}" + "{T:Lookup/%13.13s}{T:Readlink/%13.13s}" + "{T:Read/%13.13s}{T:Write/%13.13s}\n"); + xo_emit("{:getattr/%13ju}{:setattr/%13ju}{:lookup/%13ju}" + "{:readlink/%13ju}{:read/%13ju}{:write/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Create", "Remove", "Rename", "Link", "Symlink", - "Mkdir"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Create/%13.13s}{T:Remove/%13.13s}" + "{T:Rename/%13.13s}{T:Link/%13.13s}" + "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}\n"); + xo_emit("{:create/%13ju}{:remove/%13ju}{:rename/%13ju}" + "{:link/%13ju}{:symlink/%13ju}{:mkdir/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", - "Fsstat"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Rmdir/%13.13s}{T:Readdir/%13.13s}" + "{T:RdirPlus/%13.13s}{T:Access/%13.13s}" + "{T:Mknod/%13.13s}{T:Fsstat/%13.13s}\n"); + xo_emit("{:rmdir/%13ju}{:readdir/%13ju}{:rdirplus/%13ju}" + "{:access/%13ju}{:mknod/%13ju}{:fsstat/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Fsinfo", "PathConf", "Commit", "LookupP", - "SetClId", "SetClIdCf"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:FSinfo/%13.13s}{T:pathConf/%13.13s}" + "{T:Commit/%13.13s}{T:LookupP/%13.13s}" + "{T:SetClId/%13.13s}{T:SetClIdCf/%13.13s}\n"); + xo_emit("{:fsinfo/%13ju}{:pathconf/%13ju}{:commit/%13ju}" + "{:lookupp/%13ju}{:setclientid/%13ju}{:setclientidcfrm/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", - "DelePurge", "DeleRet"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:Open/%13.13s}{T:OpenAttr/%13.13s}" + "{T:OpenDwnGr/%13.13s}{T:OpenCfrm/%13.13s}" + "{T:DelePurge/%13.13s}{T:DelRet/%13.13s}\n"); + xo_emit("{:open/%13ju}{:openattr/%13ju}{:opendwgr/%13ju}" + "{:opencfrm/%13ju}{:delepurge/%13ju}{:delreg/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "GetFH", "Lock", "LockT", "LockU", "Close", - "Verify"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:GetFH/%13.13s}{T:Lock/%13.13s}" + "{T:LockT/%13.13s}{T:LockU/%13.13s}" + "{T:Close/%13.13s}{T:Verify/%13.13s}\n"); + xo_emit("{:getfh/%13ju}{:lock/%13ju}{:lockt/%13ju}" + "{:locku/%13ju}{:close/%13ju}{:verify/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "NVerify", "PutFH", "PutPubFH", "PutRootFH", - "Renew", "RestoreFH"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:NVerify/%13.13s}{T:PutFH/%13.13s}" + "{T:PutPubFH/%13.13s}{T:PutRootFH/%13.13s}" + "{T:Renew/%13.13s}{T:RestoreFH/%13.13s}\n"); + xo_emit("{:nverify/%13ju}{:putfh/%13ju}{:putpubfh/%13ju}" + "{:putrootfh/%13ju}{:renew/%13ju}{:restore/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "SaveFH", "Secinfo", "RelLckOwn", "V4Create", - "BackChannelCtrl", "BindConnToSess"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:SaveFH/%13.13s}{T:Secinfo/%13.13s}" + "{T:RelLockOwn/%13.13s}{T:V4Create/%13.13s}\n"); + xo_emit("{:savefh/%13ju}{:secinfo/%13ju}{:rellockown/%13ju}" + "{:v4create/%13ju}\n", (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BACKCHANNELCTL], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BINDCONNTOSESS]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "ExchangeID", "CreateSess", "DestroySess", - "FreeStateID", "GetDirDeleg", "GetDevInfo"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_EXCHANGEID], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATESESSION], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYSESSION], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FREESTATEID], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDIRDELEG], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVINFO]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "GetDevList", "LayoutCommit", "LayoutGet", - "LayoutReturn", "SecInfNoName", "Sequence"); - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVLIST], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTCOMMIT], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTGET], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTRETURN], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFONONAME], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SEQUENCE]); - if (printtitle) - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s\n", - "SetSSV", "TestStateID", "WantDeleg", - "DestroyClID", "ReclaimCompl"); - printf("%12ju %12ju %12ju %12ju %12ju\n", - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETSSV], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_TESTSTATEID], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WANTDELEG], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYCLIENTID], - (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RECLAIMCOMPL]); - if (printtitle) { - printf("Server:\n"); - printf("%12.12s %12.12s %12.12s\n", - "Retfailed", "Faults", "Clients"); + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); + if (nfs41) { + xo_open_container("nfsv41"); + xo_emit("{T:BackChannelCtrl/%13.13s}{T:BindConnToSess/%13.13s}" + "{T:ExchangeID/%13.13s}{T:CreateSess/%13.13s}" + "{T:DestroySess/%13.13s}{T:FreeStateID/%13.13s}\n"); + xo_emit("{:backchannelctrl/%13ju}{:bindconntosess/%13ju}" + "{:exchangeid/%13ju}{:createsess/%13ju}" + "{:destroysess/%13ju}{:freestateid/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BACKCHANNELCTL], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BINDCONNTOSESS], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_EXCHANGEID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATESESSION], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYSESSION], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FREESTATEID]), + + xo_emit("{T:GetDirDeleg/%13.13s}{T:GetDevInfo/%13.13s}" + "{T:GetDevList/%13.13s}{T:layoutCommit/%13.13s}" + "{T:LayoutGet/%13.13s}{T:LayoutReturn/%13.13s}\n"); + xo_emit("{:getdirdeleg/%13ju}{:getdevinfo/%13ju}" + "{:getdevlist/%13ju}{:layoutcommit/%13ju}" + "{:layoutget/%13ju}{:layoutreturn/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDIRDELEG], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVINFO], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVLIST], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTCOMMIT], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTGET], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTRETURN]); + + xo_emit("{T:SecInfNoName/%13.13s}{T:Sequence/%13.13s}" + "{T:SetSSV/%13.13s}{T:TestStateID/%13.13s}" + "{T:WantDeleg/%13.13s}{T:DestroyClId/%13.13s}\n"); + xo_emit("{:secinfnoname/%13ju}{:sequence/%13ju}" + "{:setssv/%13ju}{:teststateid/%13ju}{:wantdeleg/%13ju}" + "{:destroyclid/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFONONAME], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SEQUENCE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETSSV], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_TESTSTATEID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WANTDELEG], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYCLIENTID]); + + xo_emit("{T:ReclaimCompl/%13.13s}\n"); + xo_emit("{:reclaimcompl/%13ju}\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RECLAIMCOMPL]); + + xo_close_container("nfsv41"); } - printf("%12ju %12ju %12ju\n", + + xo_close_container("operations"); + + if (printtitle) + xo_emit("{T:Server:}\n"); + xo_open_container("server"); + xo_emit("{T:Retfailed/%13.13s}{T:Faults/%13.13s}" + "{T:Clients/%13.13s}\n"); + xo_emit("{:retfailed/%13ju}{:faults/%13ju}{:clients/%13ju}\n", (uintmax_t)ext_nfsstats.srv_errs, (uintmax_t)ext_nfsstats.srvrpc_errs, (uintmax_t)ext_nfsstats.srvclients); - if (printtitle) - printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", - "OpenOwner", "Opens", "LockOwner", - "Locks", "Delegs"); - printf("%12ju %12ju %12ju %12ju %12ju\n", + xo_emit("{T:OpenOwner/%13.13s}{T:Opens/%13.13s}" + "{T:LockOwner/%13.13s}{T:Locks/%13.13s}" + "{T:Delegs/%13.13s}\n"); + xo_emit("{:openowner/%13ju}{:opens/%13ju}{:lockowner/%13ju}" + "{:locks/%13ju}{:delegs/%13ju}\n", (uintmax_t)ext_nfsstats.srvopenowners, (uintmax_t)ext_nfsstats.srvopens, (uintmax_t)ext_nfsstats.srvlockowners, (uintmax_t)ext_nfsstats.srvlocks, (uintmax_t)ext_nfsstats.srvdelegates); - if (printtitle) { - printf("Server Cache Stats:\n"); - printf( - "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", - "Inprog", "Idem", "Non-idem", "Misses", - "CacheSize", "TCPPeak"); - } - printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + xo_close_container("server"); + + if (printtitle) + xo_emit("{T:Server Cache Stats:}\n"); + xo_open_container("cache"); + xo_emit("{T:Inprog/%13.13s}{T:Idem/%13.13s}" + "{T:Non-idem/%13.13s}{T:Misses/%13.13s}" + "{T:CacheSize/%13.13s}{T:TCPPeak/%13.13s}\n"); + xo_emit("{:inprog/%13ju}{:idem/%13ju}{:nonidem/%13ju}" + "{:misses/%13ju}{:cachesize/%13ju}{:tcppeak/%13ju}\n", (uintmax_t)ext_nfsstats.srvcache_inproghits, (uintmax_t)ext_nfsstats.srvcache_idemdonehits, (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, (uintmax_t)ext_nfsstats.srvcache_misses, (uintmax_t)ext_nfsstats.srvcache_size, (uintmax_t)ext_nfsstats.srvcache_tcppeak); + xo_close_container("cache"); + + xo_close_container("serverstats"); } + + xo_close_container("nfsv4"); } static void