1df6c8
From 341d75642ecc4e27bc6fecb56eb98a0ba03d8544 Mon Sep 17 00:00:00 2001
1df6c8
From: Krutika Dhananjay <kdhananj@redhat.com>
1df6c8
Date: Mon, 23 Mar 2020 11:47:10 +0530
1df6c8
Subject: [PATCH 376/379] features/shard: Fix crash during shards cleanup in
1df6c8
 error cases
1df6c8
1df6c8
Backport of:
1df6c8
> https://review.gluster.org/c/glusterfs/+/24244
1df6c8
> Change-Id: I0b49f2b58becd0d8874b3d4b14ff8d92a89d02d5
1df6c8
> Fixes: #1127
1df6c8
> Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
1df6c8
1df6c8
A crash is seen during a reattempt to clean up shards in background
1df6c8
upon remount. And this happens even on remount (which means a remount
1df6c8
is no workaround for the crash).
1df6c8
1df6c8
In such a situation, the in-memory base inode object will not be
1df6c8
existent (new process, non-existent base shard).
1df6c8
So local->resolver_base_inode will be NULL.
1df6c8
1df6c8
In the event of an error (in this case, of space running out), the
1df6c8
process would crash at the time of logging the error in the following line -
1df6c8
1df6c8
        gf_msg(this->name, GF_LOG_ERROR, local->op_errno, SHARD_MSG_FOP_FAILED,
1df6c8
               "failed to delete shards of %s",
1df6c8
               uuid_utoa(local->resolver_base_inode->gfid));
1df6c8
1df6c8
Fixed that by using local->base_gfid as the source of gfid when
1df6c8
local->resolver_base_inode is NULL.
1df6c8
1df6c8
Change-Id: I0b49f2b58becd0d8874b3d4b14ff8d92a89d02d5
1df6c8
BUG: 1836233
1df6c8
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
1df6c8
Reviewed-on: https://code.engineering.redhat.com/gerrit/200689
1df6c8
Tested-by: RHGS Build Bot <nigelb@redhat.com>
1df6c8
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
1df6c8
---
1df6c8
 xlators/features/shard/src/shard.c | 11 +++++++++--
1df6c8
 1 file changed, 9 insertions(+), 2 deletions(-)
1df6c8
1df6c8
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
1df6c8
index 9ed597b..ee38ed2 100644
1df6c8
--- a/xlators/features/shard/src/shard.c
1df6c8
+++ b/xlators/features/shard/src/shard.c
1df6c8
@@ -2729,13 +2729,20 @@ int shard_unlink_shards_do(call_frame_t *frame, xlator_t *this, inode_t *inode);
1df6c8
 int shard_post_lookup_shards_unlink_handler(call_frame_t *frame,
1df6c8
                                             xlator_t *this) {
1df6c8
   shard_local_t *local = NULL;
1df6c8
+    uuid_t gfid = {
1df6c8
+        0,
1df6c8
+    };
1df6c8
 
1df6c8
   local = frame->local;
1df6c8
 
1df6c8
+    if (local->resolver_base_inode)
1df6c8
+        gf_uuid_copy(gfid, local->resolver_base_inode->gfid);
1df6c8
+    else
1df6c8
+        gf_uuid_copy(gfid, local->base_gfid);
1df6c8
+
1df6c8
   if ((local->op_ret < 0) && (local->op_errno != ENOENT)) {
1df6c8
     gf_msg(this->name, GF_LOG_ERROR, local->op_errno, SHARD_MSG_FOP_FAILED,
1df6c8
-           "failed to delete shards of %s",
1df6c8
-           uuid_utoa(local->resolver_base_inode->gfid));
1df6c8
+           "failed to delete shards of %s", uuid_utoa(gfid));
1df6c8
     return 0;
1df6c8
   }
1df6c8
   local->op_ret = 0;
1df6c8
-- 
1df6c8
1.8.3.1
1df6c8