50dc83
From 783f53b0b09845cd6c38f145eac685a094767ce0 Mon Sep 17 00:00:00 2001
50dc83
From: Pranith Kumar K <pkarampu@redhat.com>
50dc83
Date: Mon, 27 May 2019 11:43:26 +0530
50dc83
Subject: [PATCH 194/221] stack: Make sure to have unique call-stacks in all
50dc83
 cases
50dc83
50dc83
At the moment new stack doesn't populate frame->root->unique in all cases. This
50dc83
makes it difficult to debug hung frames by examining successive state dumps.
50dc83
Fuse and server xlators populate it whenever they can, but other xlators won't
50dc83
be able to assign 'unique' when they need to create a new frame/stack because
50dc83
they don't know what 'unique' fuse/server xlators already used. What we need is
50dc83
for unique to be correct. If a stack with same unique is present in successive
50dc83
statedumps, that means the same operation is still in progress. This makes
50dc83
'finding hung frames' part of debugging hung frames easier.
50dc83
50dc83
 >upstream: bz#1714098
50dc83
 >Upstream-patch: https://review.gluster.org/c/glusterfs/+/22773
50dc83
fixes bz#1716760
50dc83
Change-Id: I3e9a8f6b4111e260106c48a2ac3a41ef29361b9e
50dc83
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
50dc83
Reviewed-on: https://code.engineering.redhat.com/gerrit/172304
50dc83
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
50dc83
Tested-by: RHGS Build Bot <nigelb@redhat.com>
50dc83
---
50dc83
 libglusterfs/src/stack.c                     |  2 ++
50dc83
 xlators/features/quota/src/quotad-helpers.c  |  3 ---
50dc83
 xlators/mount/fuse/src/fuse-bridge.c         | 15 ++++++++-------
50dc83
 xlators/mount/fuse/src/fuse-helpers.c        |  1 -
50dc83
 xlators/protocol/server/src/server-helpers.c |  3 ---
50dc83
 5 files changed, 10 insertions(+), 14 deletions(-)
50dc83
50dc83
diff --git a/libglusterfs/src/stack.c b/libglusterfs/src/stack.c
50dc83
index 82b3577..371f60c 100644
50dc83
--- a/libglusterfs/src/stack.c
50dc83
+++ b/libglusterfs/src/stack.c
50dc83
@@ -17,6 +17,7 @@ create_frame(xlator_t *xl, call_pool_t *pool)
50dc83
 {
50dc83
     call_stack_t *stack = NULL;
50dc83
     call_frame_t *frame = NULL;
50dc83
+    static uint64_t unique = 0;
50dc83
 
50dc83
     if (!xl || !pool) {
50dc83
         return NULL;
50dc83
@@ -52,6 +53,7 @@ create_frame(xlator_t *xl, call_pool_t *pool)
50dc83
     {
50dc83
         list_add(&stack->all_frames, &pool->all_frames);
50dc83
         pool->cnt++;
50dc83
+        stack->unique = unique++;
50dc83
     }
50dc83
     UNLOCK(&pool->lock);
50dc83
     GF_ATOMIC_INC(pool->total_count);
50dc83
diff --git a/xlators/features/quota/src/quotad-helpers.c b/xlators/features/quota/src/quotad-helpers.c
50dc83
index be8f908..d9f0351 100644
50dc83
--- a/xlators/features/quota/src/quotad-helpers.c
50dc83
+++ b/xlators/features/quota/src/quotad-helpers.c
50dc83
@@ -73,7 +73,6 @@ quotad_aggregator_alloc_frame(rpcsvc_request_t *req)
50dc83
         goto out;
50dc83
 
50dc83
     frame->root->state = state;
50dc83
-    frame->root->unique = 0;
50dc83
 
50dc83
     frame->this = this;
50dc83
 out:
50dc83
@@ -93,8 +92,6 @@ quotad_aggregator_get_frame_from_req(rpcsvc_request_t *req)
50dc83
 
50dc83
     frame->root->op = req->procnum;
50dc83
 
50dc83
-    frame->root->unique = req->xid;
50dc83
-
50dc83
     frame->root->uid = req->uid;
50dc83
     frame->root->gid = req->gid;
50dc83
     frame->root->pid = req->pid;
50dc83
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c
50dc83
index c3945d7..c05866b 100644
50dc83
--- a/xlators/mount/fuse/src/fuse-bridge.c
50dc83
+++ b/xlators/mount/fuse/src/fuse-bridge.c
50dc83
@@ -3270,11 +3270,11 @@ fuse_release(xlator_t *this, fuse_in_header_t *finh, void *msg,
50dc83
 
50dc83
     priv = this->private;
50dc83
 
50dc83
-    fuse_log_eh(this, "RELEASE(): %" PRIu64 ":, fd: %p, gfid: %s", finh->unique,
50dc83
-                fd, uuid_utoa(fd->inode->gfid));
50dc83
+    fuse_log_eh(this, "RELEASE(): finh->unique: %" PRIu64 ":, fd: %p, gfid: %s",
50dc83
+                finh->unique, fd, uuid_utoa(fd->inode->gfid));
50dc83
 
50dc83
-    gf_log("glusterfs-fuse", GF_LOG_TRACE, "%" PRIu64 ": RELEASE %p",
50dc83
-           finh->unique, state->fd);
50dc83
+    gf_log("glusterfs-fuse", GF_LOG_TRACE,
50dc83
+           "finh->unique: %" PRIu64 ": RELEASE %p", finh->unique, state->fd);
50dc83
 
50dc83
     fuse_fd_ctx_destroy(this, state->fd);
50dc83
     fd_unref(fd);
50dc83
@@ -3759,11 +3759,12 @@ fuse_releasedir(xlator_t *this, fuse_in_header_t *finh, void *msg,
50dc83
 
50dc83
     priv = this->private;
50dc83
 
50dc83
-    fuse_log_eh(this, "RELEASEDIR (): %" PRIu64 ": fd: %p, gfid: %s",
50dc83
+    fuse_log_eh(this,
50dc83
+                "RELEASEDIR (): finh->unique: %" PRIu64 ": fd: %p, gfid: %s",
50dc83
                 finh->unique, state->fd, uuid_utoa(state->fd->inode->gfid));
50dc83
 
50dc83
-    gf_log("glusterfs-fuse", GF_LOG_TRACE, "%" PRIu64 ": RELEASEDIR %p",
50dc83
-           finh->unique, state->fd);
50dc83
+    gf_log("glusterfs-fuse", GF_LOG_TRACE,
50dc83
+           "finh->unique: %" PRIu64 ": RELEASEDIR %p", finh->unique, state->fd);
50dc83
 
50dc83
     fuse_fd_ctx_destroy(this, state->fd);
50dc83
     fd_unref(state->fd);
50dc83
diff --git a/xlators/mount/fuse/src/fuse-helpers.c b/xlators/mount/fuse/src/fuse-helpers.c
50dc83
index cf4f8e1..5bfc40c 100644
50dc83
--- a/xlators/mount/fuse/src/fuse-helpers.c
50dc83
+++ b/xlators/mount/fuse/src/fuse-helpers.c
50dc83
@@ -358,7 +358,6 @@ get_call_frame_for_req(fuse_state_t *state)
50dc83
         frame->root->uid = finh->uid;
50dc83
         frame->root->gid = finh->gid;
50dc83
         frame->root->pid = finh->pid;
50dc83
-        frame->root->unique = finh->unique;
50dc83
         set_lk_owner_from_uint64(&frame->root->lk_owner, state->lk_owner);
50dc83
     }
50dc83
 
50dc83
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c
50dc83
index 1a34239..e74a24d 100644
50dc83
--- a/xlators/protocol/server/src/server-helpers.c
50dc83
+++ b/xlators/protocol/server/src/server-helpers.c
50dc83
@@ -459,7 +459,6 @@ server_alloc_frame(rpcsvc_request_t *req)
50dc83
 
50dc83
     frame->root->client = client;
50dc83
     frame->root->state = state; /* which socket */
50dc83
-    frame->root->unique = 0;    /* which call */
50dc83
 
50dc83
     frame->this = client->this;
50dc83
 out:
50dc83
@@ -487,8 +486,6 @@ get_frame_from_request(rpcsvc_request_t *req)
50dc83
 
50dc83
     frame->root->op = req->procnum;
50dc83
 
50dc83
-    frame->root->unique = req->xid;
50dc83
-
50dc83
     client = req->trans->xl_private;
50dc83
     this = req->trans->xl;
50dc83
     priv = this->private;
50dc83
-- 
50dc83
1.8.3.1
50dc83