From ac108947b0f25293c154707b70ea01eb3774f542 Mon Sep 17 00:00:00 2001 From: Ravishankar N Date: Thu, 7 Nov 2019 15:18:30 +0530 Subject: afr: make heal info lockless Changes in locks xlator: Added support for per-domain inodelk count requests. Caller needs to set GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS key in the dict and then set each key with name 'GLUSTERFS_INODELK_DOM_PREFIX:'. In the response dict, the xlator will send the per domain count as values for each of these keys. Changes in AFR: Replaced afr_selfheal_locked_inspect() with afr_lockless_inspect(). Logic has been added to make the latter behave same as the former, thus not breaking the current heal info output behaviour. fixes: bz#1783858 Change-Id: Ie9e83c162aa77f44a39c2ba7115de558120ada4d Signed-off-by: Ravishankar N (cherry picked from commit d7e049160a9dea988ded5816491c2234d40ab6b3) --- heal/src/glfs-heal.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'heal') diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c index 3ebf79eee14..20372316edd 100644 --- a/heal/src/glfs-heal.c +++ b/heal/src/glfs-heal.c @@ -773,7 +773,8 @@ 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) + gf_boolean_t ignore_dirty, glfsh_fail_mode_t mode, + dict_t *xattr_req) { gf_dirent_t *entry = NULL; gf_dirent_t *tmp = NULL; @@ -805,7 +806,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, NULL, NULL); + ret = syncop_getxattr(this, &loc, &dict, GF_HEAL_INFO, xattr_req, NULL); if (ret) { if ((mode != GLFSH_MODE_CONTINUE_ON_ERROR) && (ret == -ENOTCONN)) goto out; @@ -874,19 +875,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); + ignore, mode, xattr_req); 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); + ignore, mode, xattr_req); 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); + ignore, mode, xattr_req); if (ret < 0) goto out; } else if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) { @@ -895,7 +896,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); + ignore, mode, xattr_req); if (ret < 0) goto out; } @@ -949,6 +950,10 @@ 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; -- cgit