diff options
Diffstat (limited to '0425-tests-Fix-spurious-self-heald.t-failure.patch')
-rw-r--r-- | 0425-tests-Fix-spurious-self-heald.t-failure.patch | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/0425-tests-Fix-spurious-self-heald.t-failure.patch b/0425-tests-Fix-spurious-self-heald.t-failure.patch new file mode 100644 index 0000000..7bfc04a --- /dev/null +++ b/0425-tests-Fix-spurious-self-heald.t-failure.patch @@ -0,0 +1,187 @@ +From 2c582ea6c76031463501b31d9250e739d5aeda79 Mon Sep 17 00:00:00 2001 +From: Ravishankar N <ravishankar@redhat.com> +Date: Fri, 5 Jun 2020 14:28:11 +0530 +Subject: [PATCH 425/449] tests: Fix spurious self-heald.t failure + +Problem: +heal-info code assumes that all indices in xattrop directory +definitely need heal. There is one corner case. +The very first xattrop on the file will lead to adding the +gfid to 'xattrop' index in fop path and in _cbk path it is +removed because the fop is zero-xattr xattrop in success case. +These gfids could be read by heal-info and shown as needing heal. + +Fix: +Check the pending flag to see if the file definitely needs or +not instead of which index is being crawled at the moment. + +> Upstream patch: https://review.gluster.org/#/c/glusterfs/+/24110/ +> fixes: bz#1801623 +> Change-Id: I79f00dc7366fedbbb25ec4bec838dba3b34c7ad5 +> Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> + +BUG: 1721355 +Change-Id: I7efdf45a5158fadfdbdd21c91837f193d80fa6c7 +Signed-off-by: Ravishankar N <ravishankar@redhat.com> +Reviewed-on: https://code.engineering.redhat.com/gerrit/202491 +Tested-by: RHGS Build Bot <nigelb@redhat.com> +Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> +--- + heal/src/glfs-heal.c | 17 ++++++---------- + xlators/cluster/afr/src/afr-common.c | 38 ++++++++++++++---------------------- + 2 files changed, 21 insertions(+), 34 deletions(-) + +diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c +index 5af9e31..125b12c 100644 +--- a/heal/src/glfs-heal.c ++++ b/heal/src/glfs-heal.c +@@ -775,8 +775,7 @@ static int + glfsh_process_entries(xlator_t *xl, fd_t *fd, gf_dirent_t *entries, + uint64_t *offset, num_entries_t *num_entries, + print_status glfsh_print_status, +- gf_boolean_t ignore_dirty, glfsh_fail_mode_t mode, +- dict_t *xattr_req) ++ gf_boolean_t ignore_dirty, glfsh_fail_mode_t mode) + { + gf_dirent_t *entry = NULL; + gf_dirent_t *tmp = NULL; +@@ -808,7 +807,7 @@ glfsh_process_entries(xlator_t *xl, fd_t *fd, gf_dirent_t *entries, + + gf_uuid_parse(entry->d_name, gfid); + gf_uuid_copy(loc.gfid, gfid); +- ret = syncop_getxattr(this, &loc, &dict, GF_HEAL_INFO, xattr_req, NULL); ++ ret = syncop_getxattr(this, &loc, &dict, GF_HEAL_INFO, NULL, NULL); + if (ret) { + if ((mode != GLFSH_MODE_CONTINUE_ON_ERROR) && (ret == -ENOTCONN)) + goto out; +@@ -877,19 +876,19 @@ glfsh_crawl_directory(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc, + if (heal_op == GF_SHD_OP_INDEX_SUMMARY) { + ret = glfsh_process_entries(readdir_xl, fd, &entries, &offset, + num_entries, glfsh_print_heal_status, +- ignore, mode, xattr_req); ++ ignore, mode); + if (ret < 0) + goto out; + } else if (heal_op == GF_SHD_OP_SPLIT_BRAIN_FILES) { + ret = glfsh_process_entries(readdir_xl, fd, &entries, &offset, + num_entries, glfsh_print_spb_status, +- ignore, mode, xattr_req); ++ ignore, mode); + if (ret < 0) + goto out; + } else if (heal_op == GF_SHD_OP_HEAL_SUMMARY) { + ret = glfsh_process_entries(readdir_xl, fd, &entries, &offset, + num_entries, glfsh_print_summary_status, +- ignore, mode, xattr_req); ++ ignore, mode); + if (ret < 0) + goto out; + } else if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) { +@@ -898,7 +897,7 @@ glfsh_crawl_directory(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc, + } else if (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) { + ret = glfsh_process_entries(readdir_xl, fd, &entries, &offset, + num_entries, glfsh_heal_status_boolean, +- ignore, mode, xattr_req); ++ ignore, mode); + if (ret < 0) + goto out; + } +@@ -952,10 +951,6 @@ glfsh_print_pending_heals_type(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc, + int32_t op_errno = 0; + gf_boolean_t ignore = _gf_false; + +- ret = dict_set_str(xattr_req, "index-vgfid", vgfid); +- if (ret) +- return ret; +- + if (!strcmp(vgfid, GF_XATTROP_DIRTY_GFID)) + ignore = _gf_true; + +diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c +index c355ec5..89e2483 100644 +--- a/xlators/cluster/afr/src/afr-common.c ++++ b/xlators/cluster/afr/src/afr-common.c +@@ -5995,8 +5995,8 @@ afr_is_dirty_count_non_unary(xlator_t *this, struct afr_reply *replies, + + static int + afr_update_heal_status(xlator_t *this, struct afr_reply *replies, +- char *index_vgfid, ia_type_t ia_type, gf_boolean_t *esh, +- gf_boolean_t *dsh, gf_boolean_t *msh) ++ ia_type_t ia_type, gf_boolean_t *esh, gf_boolean_t *dsh, ++ gf_boolean_t *msh, unsigned char pending) + { + int ret = -1; + GF_UNUSED int ret1 = 0; +@@ -6026,14 +6026,7 @@ afr_update_heal_status(xlator_t *this, struct afr_reply *replies, + } + } + +- if (!strcmp(index_vgfid, GF_XATTROP_INDEX_GFID)) { +- if (shd_domain_lk_count) { +- ret = -EAGAIN; /*For 'possibly-healing'. */ +- } else { +- ret = 0; /*needs heal. Just set a non -ve value so that it is +- assumed as the source index.*/ +- } +- } else if (!strcmp(index_vgfid, GF_XATTROP_DIRTY_GFID)) { ++ if (!pending) { + if ((afr_is_dirty_count_non_unary(this, replies, ia_type)) || + (!io_domain_lk_count)) { + /* Needs heal. */ +@@ -6042,6 +6035,13 @@ afr_update_heal_status(xlator_t *this, struct afr_reply *replies, + /* No heal needed. */ + *dsh = *esh = *msh = 0; + } ++ } else { ++ if (shd_domain_lk_count) { ++ ret = -EAGAIN; /*For 'possibly-healing'. */ ++ } else { ++ ret = 0; /*needs heal. Just set a non -ve value so that it is ++ assumed as the source index.*/ ++ } + } + return ret; + } +@@ -6049,8 +6049,8 @@ afr_update_heal_status(xlator_t *this, struct afr_reply *replies, + /*return EIO, EAGAIN or pending*/ + int + afr_lockless_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, +- inode_t **inode, char *index_vgfid, +- gf_boolean_t *entry_selfheal, gf_boolean_t *data_selfheal, ++ inode_t **inode, gf_boolean_t *entry_selfheal, ++ gf_boolean_t *data_selfheal, + gf_boolean_t *metadata_selfheal, unsigned char *pending) + { + int ret = -1; +@@ -6109,8 +6109,8 @@ afr_lockless_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid, + goto out; + } + +- ret = afr_update_heal_status(this, replies, index_vgfid, (*inode)->ia_type, +- &esh, &dsh, &msh); ++ ret = afr_update_heal_status(this, replies, (*inode)->ia_type, &esh, &dsh, ++ &msh, *pending); + out: + *data_selfheal = dsh; + *entry_selfheal = esh; +@@ -6133,16 +6133,8 @@ afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc) + inode_t *inode = NULL; + char *substr = NULL; + char *status = NULL; +- afr_local_t *local = NULL; +- char *index_vgfid = NULL; +- +- local = frame->local; +- if (dict_get_str(local->xdata_req, "index-vgfid", &index_vgfid)) { +- ret = -1; +- goto out; +- } + +- ret = afr_lockless_inspect(frame, this, loc->gfid, &inode, index_vgfid, ++ ret = afr_lockless_inspect(frame, this, loc->gfid, &inode, + &entry_selfheal, &data_selfheal, + &metadata_selfheal, &pending); + +-- +1.8.3.1 + |