summaryrefslogtreecommitdiff
path: root/0502-dht-fixing-a-permission-update-issue.patch
diff options
context:
space:
mode:
Diffstat (limited to '0502-dht-fixing-a-permission-update-issue.patch')
-rw-r--r--0502-dht-fixing-a-permission-update-issue.patch225
1 files changed, 225 insertions, 0 deletions
diff --git a/0502-dht-fixing-a-permission-update-issue.patch b/0502-dht-fixing-a-permission-update-issue.patch
new file mode 100644
index 0000000..7c136d0
--- /dev/null
+++ b/0502-dht-fixing-a-permission-update-issue.patch
@@ -0,0 +1,225 @@
+From 3f1eee125a35c33ecb078e5d3bfd80d80e63881d Mon Sep 17 00:00:00 2001
+From: Barak Sason Rofman <bsasonro@redhat.com>
+Date: Wed, 15 Jan 2020 12:02:05 +0200
+Subject: [PATCH 502/511] dht - fixing a permission update issue
+
+When bringing back a downed brick and performing lookup from the client
+side, the permission on said brick aren't updated on the first lookup,
+but only on the second.
+
+This patch modifies permission update logic so the first lookup will
+trigger a permission update on the downed brick.
+
+LIMITATIONS OF THE PATCH:
+As the choice of source depends on whether the directory has layout or not.
+Even the directories on the newly added brick will have layout xattr[zeroed], but the same is not true for a root directory.
+Hence, in case in the entire cluster only the newly added bricks are up [and others are down], then any change in permission during this time will be overwritten by the older permissions when the cluster is restarted.
+
+Upstream:
+> Reviewed-on: https://review.gluster.org/#/c/glusterfs/+/24020/
+> fixes: #999
+> Change-Id: Ieb70246d41e59f9cae9f70bc203627a433dfbd33
+> Signed-off-by: Barak Sason Rofman <bsasonro@redhat.com>
+
+BUG: 1663821
+Change-Id: Ieb70246d41e59f9cae9f70bc203627a433dfbd33
+Signed-off-by: Barak Sason Rofman <bsasonro@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/221116
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
+---
+ tests/bugs/bug-1064147.t | 71 ++++++++++++++++++++++++++++++++
+ xlators/cluster/dht/src/dht-common.c | 28 ++++++++++---
+ xlators/cluster/dht/src/dht-selfheal.c | 15 +++++--
+ xlators/storage/posix/src/posix-common.c | 16 +++----
+ 4 files changed, 111 insertions(+), 19 deletions(-)
+ create mode 100755 tests/bugs/bug-1064147.t
+
+diff --git a/tests/bugs/bug-1064147.t b/tests/bugs/bug-1064147.t
+new file mode 100755
+index 0000000..617a1aa
+--- /dev/null
++++ b/tests/bugs/bug-1064147.t
+@@ -0,0 +1,71 @@
++#!/bin/bash
++
++. $(dirname $0)/../include.rc
++. $(dirname $0)/../volume.rc
++
++# Initialize
++#------------------------------------------------------------
++cleanup;
++
++# Start glusterd
++TEST glusterd;
++TEST pidof glusterd;
++TEST $CLI volume info;
++
++# Create a volume
++TEST $CLI volume create $V0 $H0:/${V0}{1,2};
++
++# Verify volume creation
++ EXPECT "$V0" volinfo_field $V0 'Volume Name';
++ EXPECT 'Created' volinfo_field $V0 'Status';
++
++# Start volume and verify successful start
++ TEST $CLI volume start $V0;
++ EXPECT 'Started' volinfo_field $V0 'Status';
++ TEST glusterfs -s $H0 --volfile-id=$V0 $M0
++#------------------------------------------------------------
++
++# Test case 1 - Subvolume down + Healing
++#------------------------------------------------------------
++# Kill 2nd brick process
++TEST kill -9 `ps aux | grep glusterfsd | grep ${V0}2 | grep -v grep | awk '{print $2}'`;
++
++# Change root permissions
++TEST chmod 444 $M0
++
++# Store permission for comparision
++TEST permission_new=`stat -c "%A" $M0`
++
++# Bring up the killed brick process
++TEST $CLI volume start $V0 force
++
++# Perform lookup
++sleep 5
++TEST ls $M0
++
++# Check brick permissions
++TEST brick_perm=`stat -c "%A" /${V0}2`
++TEST [ ${brick_perm} = ${permission_new} ]
++#------------------------------------------------------------
++
++# Test case 2 - Add-brick + Healing
++#------------------------------------------------------------
++# Change root permissions
++TEST chmod 777 $M0
++
++# Store permission for comparision
++TEST permission_new_2=`stat -c "%A" $M0`
++
++# Add a 3rd brick
++TEST $CLI volume add-brick $V0 $H0:/${V0}3
++
++# Perform lookup
++sleep 5
++TEST ls $M0
++
++# Check permissions on the new brick
++TEST brick_perm2=`stat -c "%A" /${V0}3`
++
++TEST [ ${brick_perm2} = ${permission_new_2} ]
++
++cleanup;
+diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
+index 4db89df..fe1d0ee 100644
+--- a/xlators/cluster/dht/src/dht-common.c
++++ b/xlators/cluster/dht/src/dht-common.c
+@@ -1363,13 +1363,29 @@ dht_lookup_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
+ dht_aggregate_xattr(local->xattr, xattr);
+ }
+
++ if (__is_root_gfid(stbuf->ia_gfid)) {
++ ret = dht_dir_has_layout(xattr, conf->xattr_name);
++ if (ret >= 0) {
++ if (is_greater_time(local->prebuf.ia_ctime,
++ local->prebuf.ia_ctime_nsec,
++ stbuf->ia_ctime, stbuf->ia_ctime_nsec)) {
++ /* Choose source */
++ local->prebuf.ia_gid = stbuf->ia_gid;
++ local->prebuf.ia_uid = stbuf->ia_uid;
++
++ local->prebuf.ia_ctime = stbuf->ia_ctime;
++ local->prebuf.ia_ctime_nsec = stbuf->ia_ctime_nsec;
++ local->prebuf.ia_prot = stbuf->ia_prot;
++ }
++ }
++ }
++
+ if (local->stbuf.ia_type != IA_INVAL) {
+ /* This is not the first subvol to respond */
+- if (!__is_root_gfid(stbuf->ia_gfid) &&
+- ((local->stbuf.ia_gid != stbuf->ia_gid) ||
+- (local->stbuf.ia_uid != stbuf->ia_uid) ||
+- (is_permission_different(&local->stbuf.ia_prot,
+- &stbuf->ia_prot)))) {
++ if ((local->stbuf.ia_gid != stbuf->ia_gid) ||
++ (local->stbuf.ia_uid != stbuf->ia_uid) ||
++ (is_permission_different(&local->stbuf.ia_prot,
++ &stbuf->ia_prot))) {
+ local->need_attrheal = 1;
+ }
+ }
+@@ -10969,7 +10985,7 @@ dht_notify(xlator_t *this, int event, void *data, ...)
+ if ((cmd == GF_DEFRAG_CMD_STATUS) ||
+ (cmd == GF_DEFRAG_CMD_STATUS_TIER) ||
+ (cmd == GF_DEFRAG_CMD_DETACH_STATUS))
+- gf_defrag_status_get(conf, output, _gf_false);
++ gf_defrag_status_get(conf, output, _gf_false);
+ else if (cmd == GF_DEFRAG_CMD_START_DETACH_TIER)
+ gf_defrag_start_detach_tier(defrag);
+ else if (cmd == GF_DEFRAG_CMD_DETACH_START)
+diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
+index f5dfff9..f4e17d1 100644
+--- a/xlators/cluster/dht/src/dht-selfheal.c
++++ b/xlators/cluster/dht/src/dht-selfheal.c
+@@ -2097,9 +2097,18 @@ dht_selfheal_directory(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,
+ local->selfheal.dir_cbk = dir_cbk;
+ local->selfheal.layout = dht_layout_ref(this, layout);
+
+- if (local->need_attrheal && !IA_ISINVAL(local->mds_stbuf.ia_type)) {
+- /*Use the one in the mds_stbuf*/
+- local->stbuf = local->mds_stbuf;
++ if (local->need_attrheal) {
++ if (__is_root_gfid(local->stbuf.ia_gfid)) {
++ local->stbuf.ia_gid = local->prebuf.ia_gid;
++ local->stbuf.ia_uid = local->prebuf.ia_uid;
++
++ local->stbuf.ia_ctime = local->prebuf.ia_ctime;
++ local->stbuf.ia_ctime_nsec = local->prebuf.ia_ctime_nsec;
++ local->stbuf.ia_prot = local->prebuf.ia_prot;
++
++ } else if (!IA_ISINVAL(local->mds_stbuf.ia_type)) {
++ local->stbuf = local->mds_stbuf;
++ }
+ }
+
+ if (!__is_root_gfid(local->stbuf.ia_gfid)) {
+diff --git a/xlators/storage/posix/src/posix-common.c b/xlators/storage/posix/src/posix-common.c
+index c5a43a1..e5c6e62 100644
+--- a/xlators/storage/posix/src/posix-common.c
++++ b/xlators/storage/posix/src/posix-common.c
+@@ -598,6 +598,7 @@ posix_init(xlator_t *this)
+ int force_directory = -1;
+ int create_mask = -1;
+ int create_directory_mask = -1;
++ char value;
+
+ dir_data = dict_get(this->options, "directory");
+
+@@ -654,16 +655,11 @@ posix_init(xlator_t *this)
+ }
+
+ /* Check for Extended attribute support, if not present, log it */
+- op_ret = sys_lsetxattr(dir_data->data, "trusted.glusterfs.test", "working",
+- 8, 0);
+- if (op_ret != -1) {
+- ret = sys_lremovexattr(dir_data->data, "trusted.glusterfs.test");
+- if (ret) {
+- gf_msg(this->name, GF_LOG_DEBUG, errno, P_MSG_INVALID_OPTION,
+- "failed to remove xattr: "
+- "trusted.glusterfs.test");
+- }
+- } else {
++ size = sys_lgetxattr(dir_data->data, "user.x", &value, sizeof(value));
++
++ if ((size == -1) && (errno == EOPNOTSUPP)) {
++ gf_msg(this->name, GF_LOG_DEBUG, 0, P_MSG_XDATA_GETXATTR,
++ "getxattr returned %zd", size);
+ tmp_data = dict_get(this->options, "mandate-attribute");
+ if (tmp_data) {
+ if (gf_string2boolean(tmp_data->data, &tmp_bool) == -1) {
+--
+1.8.3.1
+