diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2014-01-09 16:55:11 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-04-28 09:44:58 -0700 |
commit | 800258b54a4a776430410eb949cfded147c4ae8a (patch) | |
tree | 81bd10a6e873868822e4271c43ddfe90f19c6132 /heal | |
parent | 26843b00447cc14427b4f02ca136033b56ca093f (diff) |
cluster/afr: Prevent heal info hang when data-self-heal in progress.
Problem:
For determining whether data-self-heal is needed afr takes blocking
locks. So if self-heal is indeed in progress on the file, this leads
to hangs. heal info hung for almost 50 minutes when a 50G file
is undergoing heal.
Fix:
When self-heal is in progress there is a live self-heal-domain lock.
In this stage if a non-blocking inodelk for self-heal-domain lock
is performed it will fail with EAGAIN. For heal info we can use this
logic to determing that the file is possibly undergoing heal and inform
it to user instead of waiting for the completion of self-heal.
Change-Id: I18527c59e429602bae49c98ff45502833ab8e1f0
BUG: 1039544
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/7482
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'heal')
-rw-r--r-- | heal/src/glfs-heal.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c index f198cbee00e..665c76d1b77 100644 --- a/heal/src/glfs-heal.c +++ b/heal/src/glfs-heal.c @@ -127,6 +127,20 @@ _is_self_heal_pending (dict_t *xattr_rsp) return _gf_false; } +static gf_boolean_t +_is_possibly_healing (dict_t *xattr_rsp) +{ + int ret = 0; + int healing = 0; + + ret = dict_get_int32 (xattr_rsp, "possibly-healing", &healing); + if ((ret == 0) && healing) { + return _gf_true; + } + + return _gf_false; +} + #define RESET_ENTRIES(loc, shf, ope, rsp, grsp) \ do { \ loc_wipe (&loc); \ @@ -188,7 +202,7 @@ glfsh_process_entries (xlator_t *xl, loc_t *parentloc, gf_dirent_t *entries, dict_t *xattr_rsp = NULL; dict_t *getxattr_rsp = NULL; int32_t sh_failed = 0; - int32_t sh_pending = 0; + gf_boolean_t sh_pending = _gf_false; char *path = NULL; int32_t op_errno = 0; @@ -239,7 +253,12 @@ glfsh_process_entries (xlator_t *xl, loc_t *parentloc, gf_dirent_t *entries, (*num_entries)++; - printf ("%s\n", path ? path : uuid_utoa (entry_loc.gfid)); + if (_is_possibly_healing (xattr_rsp)) { + printf ("%s - Possibly undergoing heal\n", + path ? path : uuid_utoa (entry_loc.gfid)); + } else { + printf ("%s\n", path ? path : uuid_utoa (entry_loc.gfid)); + } } ret = 0; out: |