Mercurial > nomad > experimental
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))