From f413cc257c6c1e60090c72163152ae7fd2180c41 Mon Sep 17 00:00:00 2001
From: Alexander Scheel <ascheel@redhat.com>
Date: Fri, 4 Aug 2017 16:09:20 -0400
Subject: [PATCH] [server] Add detailed request logging
Add request logging to track requests through gssproxy. Requests are
logged as they are read, processed, handled, and replies sent. These
are identified by buffer memory address and size.
Signed-off-by: Alexander Scheel <ascheel@redhat.com>
Reviewed-by: Simo Sorce <simo@redhat.com>
[rharwood@redhat.com: commit message cleanups, rebase]
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
Merges: #205
(cherry picked from commit 4097dafad3f276c3cf7b1255fe0540e16d59ae03)
---
proxy/src/gp_rpc_process.c | 6 ++++++
proxy/src/gp_socket.c | 12 ++++++++++++
proxy/src/gp_workers.c | 5 +++++
3 files changed, 23 insertions(+)
diff --git a/proxy/src/gp_rpc_process.c b/proxy/src/gp_rpc_process.c
index 0ea17f0..eaffc55 100644
--- a/proxy/src/gp_rpc_process.c
+++ b/proxy/src/gp_rpc_process.c
@@ -372,9 +372,12 @@ int gp_rpc_process_call(struct gp_call_ctx *gpcall,
xdrmem_create(&xdr_reply_ctx, reply_buffer, MAX_RPC_SIZE, XDR_ENCODE);
/* decode request */
+ GPDEBUGN(3, "[status] Processing request [%p (%zu)]\n", inbuf, inlen);
ret = gp_rpc_decode_call(&xdr_call_ctx, &xid, &proc, &arg, &acc, &rej);
if (!ret) {
/* execute request */
+ GPDEBUGN(3, "[status] Executing request %d (%s) from [%p (%zu)]\n",
+ proc, gp_rpc_procname(proc), inbuf, inlen);
ret = gp_rpc_execute(gpcall, proc, &arg, &res);
if (ret) {
acc = GP_RPC_SYSTEM_ERR;
@@ -388,6 +391,9 @@ int gp_rpc_process_call(struct gp_call_ctx *gpcall,
/* return encoded buffer */
ret = gp_rpc_return_buffer(&xdr_reply_ctx,
reply_buffer, outbuf, outlen);
+ GPDEBUGN(3, "[status] Returned buffer %d (%s) from [%p (%zu)]: "
+ "[%p (%zu)]\n", proc, gp_rpc_procname(proc), inbuf, inlen,
+ *outbuf, *outlen);
}
/* free resources */
gp_rpc_free_xdrs(proc, &arg, &res);
diff --git a/proxy/src/gp_socket.c b/proxy/src/gp_socket.c
index 5064e51..8675a0e 100644
--- a/proxy/src/gp_socket.c
+++ b/proxy/src/gp_socket.c
@@ -441,6 +441,8 @@ void gp_socket_send_data(verto_ctx *vctx, struct gp_conn *conn,
wbuf = calloc(1, sizeof(struct gp_buffer));
if (!wbuf) {
+ GPDEBUGN(3, "[status] OOM in gp_socket_send_data: %p (%zu)\n",
+ buffer, buflen);
/* too bad, must kill the client connection now */
gp_conn_free(conn);
return;
@@ -467,6 +469,8 @@ static void gp_socket_write(verto_ctx *vctx, verto_ev *ev)
vecs = 0;
+ GPDEBUGN(3, "[status] Sending data: %p (%zu)\n", wbuf->data, wbuf->size);
+
if (wbuf->pos == 0) {
/* first write, send the buffer size as packet header */
size = wbuf->size | FRAGMENT_BIT;
@@ -489,6 +493,9 @@ static void gp_socket_write(verto_ctx *vctx, verto_ev *ev)
gp_socket_schedule_write(vctx, wbuf);
} else {
/* error on socket, close and release it */
+ GPDEBUGN(3, "[status] Error %d in gp_socket_write on writing for "
+ "[%p (%zu:%zu)]\n", errno, wbuf->data, wbuf->pos,
+ wbuf->size);
gp_conn_free(wbuf->conn);
gp_buffer_free(wbuf);
}
@@ -498,6 +505,8 @@ static void gp_socket_write(verto_ctx *vctx, verto_ev *ev)
if (wn < (ssize_t) sizeof(size)) {
/* don't bother trying to handle sockets that can't
* buffer even 4 bytes */
+ GPDEBUGN(3, "[status] Sending data [%p (%zu)]: failed with short "
+ "write of %d\n", wbuf->data, wbuf->size, wn);
gp_conn_free(wbuf->conn);
gp_buffer_free(wbuf);
return;
@@ -505,6 +514,9 @@ static void gp_socket_write(verto_ctx *vctx, verto_ev *ev)
wn -= sizeof(size);
}
+ GPDEBUGN(3, "[status] Sending data [%p (%zu)]: successful write of %d\n",
+ wbuf->data, wbuf->size, wn);
+
wbuf->pos += wn;
if (wbuf->size > wbuf->pos) {
/* short write, reschedule */
diff --git a/proxy/src/gp_workers.c b/proxy/src/gp_workers.c
index d37e57c..2a33c21 100644
--- a/proxy/src/gp_workers.c
+++ b/proxy/src/gp_workers.c
@@ -319,6 +319,7 @@ static void gp_handle_reply(verto_ctx *vctx, verto_ev *ev)
break;
case GP_QUERY_OUT:
+ GPDEBUGN(3, "[status] Handling query reply: %p (%zu)\n", q->buffer, q->buflen);
gp_socket_send_data(vctx, q->conn, q->buffer, q->buflen);
gp_query_free(q, false);
break;
@@ -381,7 +382,11 @@ static void *gp_worker_main(void *pvt)
gp_debug_set_conn_id(gp_conn_get_cid(q->conn));
/* handle the client request */
+ GPDEBUGN(3, "[status] Handling query input: %p (%zu)\n", q->buffer,
+ q->buflen);
gp_handle_query(t->pool, q);
+ GPDEBUGN(3 ,"[status] Handling query output: %p (%zu)\n", q->buffer,
+ q->buflen);
/* now get lock on main queue, to play with the reply list */
/* ======> POOL LOCK */