diff options
| author | Mohammed Rafi KC <rkavunga@redhat.com> | 2019-07-10 21:44:38 +0530 | 
|---|---|---|
| committer | hari gowtham <hari.gowtham005@gmail.com> | 2019-09-23 07:00:22 +0000 | 
| commit | 850f20c5aeb0c935be99bef13e8a49bd52f186ff (patch) | |
| tree | 4a421af790969624abb8be2656cd57e2fde4b309 | |
| parent | 78dcb37405be16f529d2efaaebcedd461d4f987c (diff) | |
afr/lookup: Pass xattr_req in while doing a selfheal in lookup
We were not passing xattr_req when doing a name self heal
as well as a meta data heal. Because of this, some xdata
was missing which causes i/o errors
Backport of > https://review.gluster.org/#/c/glusterfs/+/23024/
>Change-Id: Ibfb1205a7eb0195632dc3820116ffbbb8043545f
>Fixes: bz#1728770
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Fixes: bz#1749307
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
(cherry picked from commit d026f0bcfd301712e4f0671ccf238f43f2e6dd30)
Change-Id: Ibfb1205a7eb0195632dc3820116ffbbb8043545f
| -rw-r--r-- | tests/bugs/replicate/bug-1728770-pass-xattrs.t | 52 | ||||
| -rw-r--r-- | tests/include.rc | 1 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 8 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 11 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal.h | 2 | 
5 files changed, 69 insertions, 5 deletions
| diff --git a/tests/bugs/replicate/bug-1728770-pass-xattrs.t b/tests/bugs/replicate/bug-1728770-pass-xattrs.t new file mode 100644 index 00000000000..159c4fcc6a1 --- /dev/null +++ b/tests/bugs/replicate/bug-1728770-pass-xattrs.t @@ -0,0 +1,52 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../snapshot.rc + +cleanup; + +function fop_on_bad_disk { +    local path=$1 +    mkdir $path/dir{1..1000} 2>/dev/null +    mv $path/dir1 $path/newdir +    touch $path/foo.txt +    echo $? +} + +function ls_fop_on_bad_disk { +    local path=$1 +    ls $path +    echo $? +} + +TEST init_n_bricks 6; +TEST setup_lvm 6; + +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 replica 3 $H0:$L1 $H0:$L2 $H0:$L3 $H0:$L4 $H0:$L5 $H0:$L6; +TEST $CLI volume set $V0 health-check-interval 1000; + +TEST $CLI volume start $V0; + +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; +#corrupt last disk +dd if=/dev/urandom of=/dev/mapper/patchy_snap_vg_6-brick_lvm bs=512K count=200 status=progress && sync + + +# Test the disk is now returning EIO for touch and ls +EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^1$" fop_on_bad_disk "$L6" +EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^2$" ls_fop_on_bad_disk "$L6" + +TEST touch $M0/foo{1..100} +TEST $CLI volume remove-brick $V0 replica 3 $H0:$L4 $H0:$L5 $H0:$L6 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$L4 $H0:$L5 $H0:$L6"; + +#check that remove-brick status should not have any failed or skipped files +var=`$CLI volume remove-brick $V0 $H0:$L4 $H0:$L5 $H0:$L6 status | grep completed` +TEST [ `echo $var | awk '{print $5}'` = "0"  ] +TEST [ `echo $var | awk '{print $6}'` = "0"  ] + +cleanup; diff --git a/tests/include.rc b/tests/include.rc index 762c5e23251..c9259410e51 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -89,6 +89,7 @@ GRAPH_SWITCH_TIMEOUT=10  UNLINK_TIMEOUT=5  MDC_TIMEOUT=5  IO_WAIT_TIMEOUT=5 +DISK_FAIL_TIMEOUT=80  LOGDIR=$(gluster --print-logdir) diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 5f8159304cf..9a6475b6ec8 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -2609,6 +2609,10 @@ afr_lookup_sh_metadata_wrap(void *opaque)      dict = dict_new();      if (!dict)          goto out; +    if (local->xattr_req) { +        dict_copy(local->xattr_req, dict); +    } +      ret = dict_set_sizen_str_sizen(dict, "link-count", GF_XATTROP_INDEX_COUNT);      if (ret) {          gf_msg_debug(this->name, -ret, "Unable to set link-count in dict "); @@ -2617,7 +2621,7 @@ afr_lookup_sh_metadata_wrap(void *opaque)      if (loc_is_nameless(&local->loc)) {          ret = afr_selfheal_unlocked_discover_on(frame, local->inode,                                                  local->loc.gfid, local->replies, -                                                local->child_up); +                                                local->child_up, dict);      } else {          inode = afr_selfheal_unlocked_lookup_on(frame, local->loc.parent,                                                  local->loc.name, local->replies, @@ -2791,7 +2795,7 @@ afr_lookup_selfheal_wrap(void *opaque)      inode = afr_selfheal_unlocked_lookup_on(frame, local->loc.parent,                                              local->loc.name, local->replies, -                                            local->child_up, NULL); +                                            local->child_up, local->xattr_req);      if (inode)          inode_unref(inode); diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 595bed4d2dd..5115248aefa 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1827,7 +1827,7 @@ afr_selfheal_unlocked_lookup_on(call_frame_t *frame, inode_t *parent,  int  afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode,                                    uuid_t gfid, struct afr_reply *replies, -                                  unsigned char *discover_on) +                                  unsigned char *discover_on, dict_t *dict)  {      loc_t loc = {          0, @@ -1842,6 +1842,8 @@ afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode,      xattr_req = dict_new();      if (!xattr_req)          return -ENOMEM; +    if (dict) +        dict_copy(dict, xattr_req);      if (afr_xattr_req_prepare(frame->this, xattr_req) != 0) {          dict_unref(xattr_req); @@ -1867,11 +1869,16 @@ afr_selfheal_unlocked_discover(call_frame_t *frame, inode_t *inode, uuid_t gfid,                                 struct afr_reply *replies)  {      afr_private_t *priv = NULL; +    afr_local_t *local = NULL; +    dict_t *dict = NULL;      priv = frame->this->private; +    local = frame->local; +    if (local && local->xattr_req) +        dict = local->xattr_req;      return afr_selfheal_unlocked_discover_on(frame, inode, gfid, replies, -                                             priv->child_up); +                                             priv->child_up, dict);  }  unsigned int diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h index 6555ec55771..703f80e05cb 100644 --- a/xlators/cluster/afr/src/afr-self-heal.h +++ b/xlators/cluster/afr/src/afr-self-heal.h @@ -187,7 +187,7 @@ afr_selfheal_unlocked_discover(call_frame_t *frame, inode_t *inode, uuid_t gfid,  int  afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode,                                    uuid_t gfid, struct afr_reply *replies, -                                  unsigned char *discover_on); +                                  unsigned char *discover_on, dict_t *dict);  inode_t *  afr_selfheal_unlocked_lookup_on(call_frame_t *frame, inode_t *parent,                                  const char *name, struct afr_reply *replies, | 
