summaryrefslogtreecommitdiff
path: root/0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch
diff options
context:
space:
mode:
Diffstat (limited to '0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch')
-rw-r--r--0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch b/0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch
new file mode 100644
index 0000000..94e0b64
--- /dev/null
+++ b/0536-dht-Ongoing-IO-is-failed-during-volume-shrink-operat.patch
@@ -0,0 +1,102 @@
+From 32281b4b5cf79d0ef6f0c65775bb81093e1ba479 Mon Sep 17 00:00:00 2001
+From: Mohit Agrawal <moagrawa@redhat.com>
+Date: Wed, 24 Feb 2021 18:44:12 +0530
+Subject: [PATCH 536/538] dht: Ongoing IO is failed during volume shrink
+ operation (#2188)
+
+In the commit (c878174) we have introduced a check
+to avoid stale layout issue.To avoid a stale layout
+issue dht has set a key along with layout at the time
+of wind a create fop and posix validates the parent
+layout based on the key value. If layout does not match
+it throw and error.In case of volume shrink layout has
+been changed by reabalance daemon and if layout does not
+matches dht is not able to wind a create fop successfully.
+
+Solution: To avoid the issue populate a key only while
+ dht has wind a fop first time. After got an
+ error in 2nd attempt dht takes a lock and then
+ reattempt to wind a fop again.
+
+> Fixes: #2187
+> Change-Id: Ie018386e7823a11eea415496bb226ca032453a55
+> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
+> (Cherry pick from commit da6ce622b722f7d12619c5860293faf03f7cd00c
+> Reviewed on upstream link https://github.com/gluster/glusterfs/pull/2188
+
+Bug: 1924044
+Change-Id: I7670dbe2d562b83db0af3753f994653ffdd49591
+Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/228941
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
+---
+ xlators/cluster/dht/src/dht-common.c | 41 ++++++++++++++++++++++++++----------
+ 1 file changed, 30 insertions(+), 11 deletions(-)
+
+diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
+index fe1d0ee..7425c1a 100644
+--- a/xlators/cluster/dht/src/dht-common.c
++++ b/xlators/cluster/dht/src/dht-common.c
+@@ -8526,15 +8526,32 @@ dht_create_wind_to_avail_subvol(call_frame_t *frame, xlator_t *this,
+ {
+ dht_local_t *local = NULL;
+ xlator_t *avail_subvol = NULL;
++ int lk_count = 0;
+
+ local = frame->local;
+
+ if (!dht_is_subvol_filled(this, subvol)) {
+- gf_msg_debug(this->name, 0, "creating %s on %s", loc->path,
+- subvol->name);
+-
+- dht_set_parent_layout_in_dict(loc, this, local);
+-
++ lk_count = local->lock[0].layout.parent_layout.lk_count;
++ gf_msg_debug(this->name, 0, "creating %s on %s with lock_count %d",
++ loc->path, subvol->name, lk_count);
++ /*The function dht_set_parent_layout_in_dict sets the layout
++ in dictionary and posix_create validates a layout before
++ creating a file.In case if parent layout does not match
++ with disk layout posix xlator throw an error but in case
++ if volume is shrunk layout has been changed by rebalance daemon
++ so we need to call this function only while a function is calling
++ without taking any lock otherwise we would not able to populate a
++ layout on disk in case if layout has changed.
++ */
++ if (!lk_count) {
++ dht_set_parent_layout_in_dict(loc, this, local);
++ } else {
++ /* Delete a key to avoid layout validate if it was set by
++ previous STACK_WIND attempt when a lock was not taken
++ by dht_create
++ */
++ (void)dict_del_sizen(local->params, GF_PREOP_PARENT_KEY);
++ }
+ STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,
+ subvol->fops->create, loc, flags, mode, umask, fd,
+ params);
+@@ -8554,12 +8571,14 @@ dht_create_wind_to_avail_subvol(call_frame_t *frame, xlator_t *this,
+
+ goto out;
+ }
+-
+- gf_msg_debug(this->name, 0, "creating %s on %s", loc->path,
+- subvol->name);
+-
+- dht_set_parent_layout_in_dict(loc, this, local);
+-
++ lk_count = local->lock[0].layout.parent_layout.lk_count;
++ gf_msg_debug(this->name, 0, "creating %s on %s with lk_count %d",
++ loc->path, subvol->name, lk_count);
++ if (!lk_count) {
++ dht_set_parent_layout_in_dict(loc, this, local);
++ } else {
++ (void)dict_del_sizen(local->params, GF_PREOP_PARENT_KEY);
++ }
+ STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,
+ subvol->fops->create, loc, flags, mode, umask, fd,
+ params);
+--
+1.8.3.1
+