changeset 1267:eb2ea1fc3c03

client: save the last 128 RPCs in a circular buffer This will (hopefully) make it easier to debug some issues. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Wed, 14 Dec 2022 23:21:47 -0500
parents 681892f1d3f7
children 4105b14950bc
files src/client/cmds.c src/client/cmds.h src/client/main.c
diffstat 3 files changed, 27 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/client/cmds.c	Wed Dec 14 23:14:55 2022 -0500
+++ b/src/client/cmds.c	Wed Dec 14 23:21:47 2022 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2015-2019,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  * Copyright (c) 2015 Holly Sipek
  * Copyright (c) 2016 Steve Dougherty
  *
@@ -25,6 +25,7 @@
 #include <stddef.h>
 
 #include <jeffpc/error.h>
+#include <jeffpc/time.h>
 
 #include <nomad/rpc_fs.h>
 
@@ -190,11 +191,14 @@
 	if (!xdr_rpc_header_req(&xdr, &hdr))
 		goto out;
 
+	conn->trace.ents[conn->trace.next].ts = gettime();
+	conn->trace.ents[conn->trace.next].op = hdr.opcode;
+	conn->trace.ents[conn->trace.next].ret = 1; /* running */
+
 	ret = -ENOTSUP;
 
 	for (i = 0; i < ARRAY_LEN(cmdtbl); i++) {
 		const struct cmdtbl *def = &cmdtbl[i];
-		int ret;
 
 		if (def->opcode != hdr.opcode)
 			continue;
@@ -208,7 +212,7 @@
 		ok = process_args(&xdr, def, &cmd);
 		if (!ok) {
 			cmn_err(CE_ERROR, "failed to fetch args");
-			goto out;
+			goto out_log;
 		}
 
 		/* if login is required, make sure it happened */
@@ -243,7 +247,7 @@
 			process_returns(&xdr, def, &cmd);
 		}
 
-		goto out;
+		goto out_log;
 	}
 
 	if (i == ARRAY_LEN(cmdtbl))
@@ -254,6 +258,10 @@
 
 	send_response(&xdr, conn->fd, ret);
 
+out_log:
+	conn->trace.ents[conn->trace.next].ret = ret;
+	conn->trace.next = (conn->trace.next + 1) % ARRAY_LEN(conn->trace.ents);
+
 out:
 	xdr_destroy(&xdr);
 
--- a/src/client/cmds.h	Wed Dec 14 23:14:55 2022 -0500
+++ b/src/client/cmds.h	Wed Dec 14 23:21:47 2022 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2015-2019,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  * Copyright (c) 2015 Holly Sipek
  * Copyright (c) 2016 Steve Dougherty
  *
@@ -138,6 +138,16 @@
 
 	struct rb_tree open_handles;
 	struct inode_map inode_map;
+
+	/* debug info */
+	struct {
+		size_t next;
+		struct {
+			uint64_t ts;
+			enum nrpc_opcode op;
+			int ret;
+		} ents[128];
+	} trace;
 };
 
 extern bool process_handshake(struct fsconn *conn);
--- a/src/client/main.c	Wed Dec 14 23:14:55 2022 -0500
+++ b/src/client/main.c	Wed Dec 14 23:21:47 2022 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2015-2020,2022 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  * Copyright (c) 2015 Holly Sipek
  * Copyright (c) 2016 Steve Dougherty
  *
@@ -54,6 +54,9 @@
 	buffer_init_static(&conn.rpc_buffer, conn._rpc_buffer,
 			   0, sizeof(conn._rpc_buffer), true);
 
+	conn.trace.next = 0;
+	memset(conn.trace.ents, 0, sizeof(conn.trace.ents));
+
 	cmn_err(CE_DEBUG, "%s: fd = %d, arg = %p", __func__, fd, arg);
 
 	if (process_handshake(&conn))