You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.7 KiB
146 lines
4.7 KiB
From 8cc721ee43ac8038eecb712278378710ad0745ed Mon Sep 17 00:00:00 2001 |
|
From: root <root@localhost.localdomain> |
|
Date: Sun, 7 Apr 2019 19:31:17 +0530 |
|
Subject: [PATCH 146/169] dht: Custom xattrs are not healed in case of |
|
add-brick |
|
|
|
Problem: If any custom xattrs are set on the directory before |
|
add a brick, xattrs are not healed on the directory |
|
after adding a brick. |
|
|
|
Solution: xattr are not healed because dht_selfheal_dir_mkdir_lookup_cbk |
|
checks the value of MDS and if MDS value is not negative |
|
selfheal code path does not take reference of MDS xattrs.Change the |
|
condition to take reference of MDS xattr so that custom xattrs are |
|
populated on newly added brick |
|
|
|
> Updates: bz#1702299 |
|
> Change-Id: Id14beedb98cce6928055f294e1594b22132e811c |
|
> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com> |
|
> (Cherry pick from commit aa52259de7b50625b754ce9fb5c0f38e22d79dd6) |
|
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22520/) |
|
|
|
BUG: 1702298 |
|
Change-Id: Id14beedb98cce6928055f294e1594b22132e811c |
|
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com> |
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/171591 |
|
Tested-by: RHGS Build Bot <nigelb@redhat.com> |
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com> |
|
--- |
|
tests/bugs/bug-1702299.t | 67 ++++++++++++++++++++++++++++++++++ |
|
xlators/cluster/dht/src/dht-selfheal.c | 9 +---- |
|
2 files changed, 68 insertions(+), 8 deletions(-) |
|
create mode 100644 tests/bugs/bug-1702299.t |
|
|
|
diff --git a/tests/bugs/bug-1702299.t b/tests/bugs/bug-1702299.t |
|
new file mode 100644 |
|
index 0000000..1cff2ed |
|
--- /dev/null |
|
+++ b/tests/bugs/bug-1702299.t |
|
@@ -0,0 +1,67 @@ |
|
+#!/bin/bash |
|
+. $(dirname $0)/../include.rc |
|
+. $(dirname $0)/../volume.rc |
|
+. $(dirname $0)/../dht.rc |
|
+cleanup; |
|
+ |
|
+function get_getfattr { |
|
+ local path=$1 |
|
+ echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//' -e 's/"$//' |
|
+} |
|
+ |
|
+function set_fattr { |
|
+ for i in `seq 1 10` |
|
+ do |
|
+ setfattr -n user.foo -v "newabc" ./tmp${i} |
|
+ if [ "$?" = "0" ] |
|
+ then |
|
+ succ=$((succ+1)) |
|
+ else |
|
+ fail=$((fail+1)) |
|
+ fi |
|
+ done |
|
+} |
|
+ |
|
+ |
|
+ |
|
+TEST glusterd |
|
+TEST pidof glusterd |
|
+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3} |
|
+TEST $CLI volume start $V0 |
|
+ |
|
+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0; |
|
+ |
|
+cd $M0 |
|
+TEST mkdir tmp{1..10} |
|
+ |
|
+succ=fail=0 |
|
+## set user.foo xattr with value newabc after kill one brick |
|
+set_fattr |
|
+count=10 |
|
+EXPECT "$succ" echo $count |
|
+count=0 |
|
+EXPECT "$fail" echo $count |
|
+ |
|
+cd - |
|
+ |
|
+# Add-brick |
|
+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5} |
|
+ |
|
+cd $M0 |
|
+## At this point dht code will heal xattr on down brick only for those dirs |
|
+## hashed subvol was up at the time of update xattr |
|
+TEST stat ./tmp{1..10} |
|
+ |
|
+ |
|
+## Count the user.foo xattr value with newabc on brick and compare with succ value |
|
+count=`getfattr -n user.foo $B0/${V0}4/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l` |
|
+EXPECT "$succ" echo $count |
|
+ |
|
+## Count the user.foo xattr value with newabc on brick and compare with succ value |
|
+count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l` |
|
+EXPECT "$succ" echo $count |
|
+ |
|
+ |
|
+cd - |
|
+TEST umount $M0 |
|
+cleanup |
|
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c |
|
index 5420fca..f5dfff9 100644 |
|
--- a/xlators/cluster/dht/src/dht-selfheal.c |
|
+++ b/xlators/cluster/dht/src/dht-selfheal.c |
|
@@ -1310,12 +1310,8 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie, |
|
int this_call_cnt = 0; |
|
int missing_dirs = 0; |
|
dht_layout_t *layout = NULL; |
|
- dht_conf_t *conf = 0; |
|
xlator_t *prev = 0; |
|
loc_t *loc = NULL; |
|
- int check_mds = 0; |
|
- int errst = 0; |
|
- int32_t mds_xattr_val[1] = {0}; |
|
char gfid_local[GF_UUID_BUF_SIZE] = {0}; |
|
int index = -1; |
|
|
|
@@ -1324,7 +1320,6 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie, |
|
local = frame->local; |
|
layout = local->layout; |
|
loc = &local->loc; |
|
- conf = this->private; |
|
prev = cookie; |
|
|
|
if (!gf_uuid_is_null(local->gfid)) |
|
@@ -1347,9 +1342,7 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie, |
|
|
|
if (!op_ret) { |
|
dht_iatt_merge(this, &local->stbuf, stbuf); |
|
- check_mds = dht_dict_get_array(xattr, conf->mds_xattr_key, |
|
- mds_xattr_val, 1, &errst); |
|
- if (dict_get(xattr, conf->mds_xattr_key) && check_mds && !errst) { |
|
+ if (prev == local->mds_subvol) { |
|
dict_unref(local->xattr); |
|
local->xattr = dict_ref(xattr); |
|
} |
|
-- |
|
1.8.3.1 |
|
|
|
|