diff options
author | Venkatesh Somyajulu <vsomyaju@redhat.com> | 2014-01-03 13:54:25 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2014-01-13 20:42:05 -0800 |
commit | ce86c132347f0a788ab50ffbd6795a2eb982074e (patch) | |
tree | fa5d191d28b0da0f6b4359618de207409778a2c3 /xlators/cluster/afr | |
parent | 5a26daaea96aa3f7855b8d75b6568449f5466cc2 (diff) |
cluster/afr: Unable to self heal symbolic links
Problem:
Under the entry self heal, readlink is done at the
source and sink. When readlink is done at the sink,
because link is not present at the sink, afr expects
ENOENT. AFR translator takes decisions for new link
creation based on ENOENT but server translator is modified
to return ESTALE because of which afr xlator is not able
to heal.
Fix:
The check for inode absence at server includes ESTALE as
well.
Change-Id: I319e4cb4156a243afee79365b7b7a5a7823e9a24
BUG: 1046624
Signed-off-by: Venkatesh Somyajulu <vsomyaju@redhat.com>
Reviewed-on: http://review.gluster.org/6599
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/afr')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 4 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 2 |
2 files changed, 4 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index 0ca06aaa382..00f1a9cb91b 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -1530,7 +1530,7 @@ afr_sh_entry_impunge_readlink_sink_cbk (call_frame_t *impunge_frame, void *cooki child_index = (long) cookie; - if ((op_ret == -1) && (op_errno != ENOENT)) { + if ((op_ret == -1) && (!afr_inode_missing(op_errno))) { gf_log (this->name, GF_LOG_INFO, "readlink of %s on %s failed (%s)", impunge_local->loc.path, @@ -1541,7 +1541,7 @@ afr_sh_entry_impunge_readlink_sink_cbk (call_frame_t *impunge_frame, void *cooki /* symlink doesn't exist on the sink */ - if ((op_ret == -1) && (op_errno == ENOENT)) { + if ((op_ret == -1) && (afr_inode_missing(op_errno))) { afr_sh_entry_impunge_symlink (impunge_frame, this, child_index, impunge_sh->linkname); return 0; diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index dc0bc06fb70..9196a1f271d 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -33,6 +33,8 @@ #define AFR_LOCKEE_COUNT_MAX 3 #define AFR_DOM_COUNT_MAX 3 +#define afr_inode_missing(op_errno) (op_errno == ENOENT || op_errno == ESTALE) + struct _pump_private; typedef int (*afr_expunge_done_cbk_t) (call_frame_t *frame, xlator_t *this, |