Linux NFS development
 help / color / mirror / Atom feed
From: Gabriel Barazer <gabriel@oxeva.fr>
To: nfs@lists.sourceforge.net
Subject: patch: nfsstat signed counter bug
Date: Fri, 29 Jun 2007 23:45:34 +0200	[thread overview]
Message-ID: <46857D7E.1080002@oxeva.fr> (raw)

[-- Attachment #1: Type: text/plain, Size: 1421 bytes --]

Hello,

This is not a critical bug as it is about an informational only tool, 
but I observed a counter bug in nfsstat :
# nfsstat -s
Server rpc stats:
calls      badcalls   badauth    badclnt    xdrcall
1647216427   0          0          0          0

Server nfs v3:
null         getattr      setattr      lookup       access       readlink
3668      0% 1642587440 27% 1636642   0% 160803697  2% -219165970 68% 
54477     0%
read         write        create       mkdir        symlink      mknod
39195344  0% 8113663   0% 3336779   0% 36784     0% 0         0% 
0         0%
remove       rmdir        rename       link         readdir      readdirplus
3981274   0% 37602     0% 310174    0% 220157    0% 1180237   0% 
1907416   0%
fsstat       fsinfo       pathconf     commit
43        0% 1841      0% 0         0% 644317    0%

---------
It is very clear that counters are looping and displaying negative 
values after counting 2^31 calls even on x86_64 platform with 64-bit Linux.
Looking at the code shows some printf's with incorrect format such as %-8d

Attached patch against nfs-utils 1.1.0 corrects this behavior to allow 
numbers with a length of 11, and reformats the display (align numbers 
and headers on the right, much easier to read). Now, up to 99 billions 
can be counted on 64-bit systems (2^32 on 32-bit), which is a very 
higher limit than ~2 billions on a moderate used NFS client/server.

Gabriel

[-- Attachment #2: nfs-utils-1.1.0-nfsstat-format.diff --]
[-- Type: text/plain, Size: 2493 bytes --]

--- nfs-utils-1.1.0.orig/utils/nfsstat/nfsstat.c	2007-05-11 05:40:57.000000000 +0200
+++ nfs-utils-1.1.0/utils/nfsstat/nfsstat.c	2007-06-29 23:10:13.982044000 +0200
@@ -335,7 +335,7 @@
 		if (opt_prt & PRNT_NET) {
 			print_numbers(
 			"Server packet stats:\n"
-			"packets    udp        tcp        tcpconn\n",
+			"    packets         udp         tcp     tcpconn\n",
 			svcnetinfo, 4
 			);
 			printf("\n");
@@ -343,7 +343,7 @@
 		if (opt_prt & PRNT_RPC) {
 			print_numbers(
 			"Server rpc stats:\n"
-			"calls      badcalls   badauth    badclnt    xdrcall\n",
+			"      calls    badcalls     badauth     badclnt     xdrcall\n",
 			svcrpcinfo, 5
 			);
 			printf("\n");
@@ -351,7 +351,7 @@
 		if (opt_prt & PRNT_RC) {
 			print_numbers(
 			"Server reply cache:\n"
-			"hits       misses     nocache\n",
+			"       hits      misses     nocache\n",
 			svcrcinfo, 3
 			);
 			printf("\n");
@@ -373,12 +373,12 @@
 				
 				print_numbers(
 					"Server file handle cache:\n"
-					"lookup     anon       ncachedir  ncachedir  stale\n",
+					"     lookup        anon   ncachedir   ncachedir       stale\n",
 					svcfhinfo + 1, 5);
 			} else					/* < 2.4 */
 				print_numbers(
 					"Server file handle cache:\n"
-					"lookup     anon       ncachedir  ncachedir  stale\n",
+					"     lookup        anon   ncachedir   ncachedir       stale\n",
 					svcrcinfo + 3, 5);
 			printf("\n");
 		}
@@ -410,7 +410,7 @@
 		if (opt_prt & PRNT_NET) {
 			print_numbers(
 			"Client packet stats:\n"
-			"packets    udp        tcp        tcpconn\n",
+			"    packets         udp         tcp     tcpconn\n",
 			cltnetinfo, 4
 			);
 			printf("\n");
@@ -418,7 +418,7 @@
 		if (opt_prt & PRNT_RPC) {
 			print_numbers(
 			"Client rpc stats:\n"
-			"calls      retrans    authrefrsh\n",
+			"      calls     retrans  authrefrsh\n",
 			cltrpcinfo, 3
 			);
 			printf("\n");
@@ -465,7 +465,7 @@
 
 	fputs(hdr, stdout);
 	for (i = 0; i < nr; i++)
-		printf("%s%-8d", i? "   " : "", info[i]);
+		printf("%s%11u", i ? " " : "", info[i]);
 	printf("\n");
 }
 
@@ -484,11 +484,11 @@
 		total = 1;
 	for (i = 0; i < nr; i += 6) {
 		for (j = 0; j < 6 && i + j < nr; j++)
-			printf("%-13s", names[i+j]);
+			printf("%s%11s", j ? "     " : "", names[i+j]);
 		printf("\n");
 		for (j = 0; j < 6 && i + j < nr; j++) {
 			pct = ((unsigned long long) info[i+j]*100)/total;
-			printf("%-8d%3llu%% ", info[i+j], pct);
+			printf("%s%11u%3llu%%", j ? " " : "", info[i+j], pct);
 		}
 		printf("\n");
 	}

[-- Attachment #3: Type: text/plain, Size: 286 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

[-- Attachment #4: Type: text/plain, Size: 140 bytes --]

_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

                 reply	other threads:[~2007-06-29 21:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46857D7E.1080002@oxeva.fr \
    --to=gabriel@oxeva.fr \
    --cc=nfs@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox