Blob Blame History Raw
From aad0d32376e6ca56770e5c2d4dc5a1462b1e7167 Mon Sep 17 00:00:00 2001
From: N Balachandran <nbalacha@redhat.com>
Date: Thu, 13 Dec 2018 12:06:10 +0530
Subject: [PATCH 457/493] cluster/dht: sync brick root perms on add brick

If a single brick is added to the volume and the
newly added brick is the first to respond to a
dht_revalidate call, its stbuf will not be merged
into local->stbuf as the brick does not yet have
a layout. The is_permission_different check therefore
fails to detect that an attr heal is required as it
only considers the stbuf values from existing bricks.
To fix this, merge all stbuf values into local->stbuf
and use local->prebuf to store the correct directory
attributes.

upstream patch: https://review.gluster.org/#/c/glusterfs/+/21611/

> Change-Id: Ic9e8b04a1ab9ed1248b6b056e3450bbafe32e1bc
> fixes: bz#1648298
> Signed-off-by: N Balachandran <nbalacha@redhat.com>

Change-Id: I329ce48555d15f741d7247290e749f0800d12df8
BUG: 1648296
Signed-off-by: N Balachandran <nbalacha@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/158493
Tested-by: RHGS Build Bot <nigelb@redhat.com>
Reviewed-by: Susant Palai <spalai@redhat.com>
Reviewed-by: Raghavendra Gowdappa <rgowdapp@redhat.com>
---
 tests/bugs/distribute/bug-1368012.t  | 11 +++++------
 xlators/cluster/dht/src/dht-common.c | 26 ++++++++------------------
 2 files changed, 13 insertions(+), 24 deletions(-)

diff --git a/tests/bugs/distribute/bug-1368012.t b/tests/bugs/distribute/bug-1368012.t
index b861554..0b62635 100644
--- a/tests/bugs/distribute/bug-1368012.t
+++ b/tests/bugs/distribute/bug-1368012.t
@@ -15,7 +15,7 @@ TEST pidof glusterd;
 TEST $CLI volume info;
 
 ## Lets create volume
-TEST $CLI volume create $V0 $H0:/${V0}{1,2};
+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};
 
 ## Verify volume is created
 EXPECT "$V0" volinfo_field $V0 'Volume Name';
@@ -36,17 +36,16 @@ TEST chmod 444 $M0
 TEST permission_root=`stat -c "%A" $M0`
 TEST echo $permission_root
 #Add-brick
-TEST $CLI volume add-brick $V0 $H0:/${V0}3
+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3
 EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" online_brick_count
 
 #Allow one lookup to happen
-TEST pushd $M0
-TEST ls
+TEST ls $M0
 #Generate another lookup
 echo 3 > /proc/sys/vm/drop_caches
-TEST ls
+TEST ls $M0
 #check root permission
 EXPECT_WITHIN "5" $permission_root get_permission $M0
 #check permission on the new-brick
-EXPECT $permission_root get_permission /${V0}3
+EXPECT $permission_root get_permission $B0/${V0}3
 cleanup
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index d3a0c8b..2e19036 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -1717,14 +1717,17 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
                 if (is_dir) {
                         ret = dht_dir_has_layout (xattr, conf->xattr_name);
                         if (ret >= 0) {
-                                if (is_greater_time(local->stbuf.ia_ctime,
-                                                    local->stbuf.ia_ctime_nsec,
+                                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;
+
                                         if (__is_root_gfid (stbuf->ia_gfid))
                                                 local->prebuf.ia_prot = stbuf->ia_prot;
                                 }
@@ -1792,22 +1795,9 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
                         }
                 }
 
-
-                /* Update stbuf from the servers where layout is present. This
-                 * is an indication that the server is not a newly added brick.
-                 * Merging stbuf from newly added brick may result in the added
-                 * brick being the source of heal for uid/gid */
-                if (!is_dir || (is_dir &&
-                    dht_dir_has_layout (xattr, conf->xattr_name) >= 0)
-                    || conf->subvolume_cnt == 1) {
-
-                        dht_iatt_merge (this, &local->stbuf, stbuf, prev);
-                        dht_iatt_merge (this, &local->postparent, postparent,
-                                        prev);
-                } else {
-                        /* copy the gfid anyway */
-                        gf_uuid_copy (local->stbuf.ia_gfid, stbuf->ia_gfid);
-                }
+                gf_uuid_copy (local->stbuf.ia_gfid, stbuf->ia_gfid);
+                dht_iatt_merge (this, &local->stbuf, stbuf, prev);
+                dht_iatt_merge (this, &local->postparent, postparent, prev);
 
                 local->op_ret = 0;
 
-- 
1.8.3.1