diff options
-rw-r--r-- | tests/bugs/distribute/bug-1368012.t | 13 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 26 |
2 files changed, 15 insertions, 24 deletions
diff --git a/tests/bugs/distribute/bug-1368012.t b/tests/bugs/distribute/bug-1368012.t index f89314b1f2e..0b626353aab 100644 --- a/tests/bugs/distribute/bug-1368012.t +++ b/tests/bugs/distribute/bug-1368012.t @@ -15,13 +15,14 @@ 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'; EXPECT 'Created' volinfo_field $V0 'Status'; ## Start volume and verify TEST $CLI volume start $V0; +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" online_brick_count TEST $CLI volume set $V0 performance.stat-prefetch off EXPECT 'Started' volinfo_field $V0 'Status'; TEST glusterfs -s $H0 --volfile-id=$V0 $M0 @@ -35,16 +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 5a5ddacd7f6..561e75d0415 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1659,14 +1659,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; } @@ -1734,22 +1737,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; |