summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-self-heal-data.c
diff options
context:
space:
mode:
authorKaushal M <kaushal@gluster.com>2011-10-20 10:53:58 +0530
committerVijay Bellur <vijay@gluster.com>2011-10-31 05:53:24 -0700
commit32173e1c70dcb53470b0738ed4d0022388193113 (patch)
treed45cd390607d5375b509efac4850e91297244699 /xlators/cluster/afr/src/afr-self-heal-data.c
parenta29f1a0e36bde5ca7b8f3762f10b210b5e12a875 (diff)
cluster/afr : Fix self-heal of special files
Fixes self-heal of special files like device files, fifo files, socket files etc. Does it by doing the following: * Prevent setting of pending data xattr on a special file during entry self-heal when a new fils is created. * Allow data self-heal to be started on all file types other than directories. During data self-heal, for special files just erase pending xattrs, if those xattrs were set by previous releases of glusterfs. Change-Id: I34d8121e23ad00e85371ae2a36ef30cf3bd5db7a BUG: 3525 Reviewed-on: http://review.gluster.com/618 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pranithk@gluster.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-data.c')
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-data.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c
index 216017cbb..97d578c9b 100644
--- a/xlators/cluster/afr/src/afr-self-heal-data.c
+++ b/xlators/cluster/afr/src/afr-self-heal-data.c
@@ -366,6 +366,10 @@ afr_sh_data_erase_pending_cbk (call_frame_t *frame, void *cookie,
if (call_count == 0) {
local = frame->local;
sh = &local->self_heal;
+ if (!IA_ISREG (sh->type)) {
+ afr_sh_data_finish (frame, this);
+ goto out;
+ }
if (NULL == sh->old_loop_frame) {
GF_ASSERT (sh->data_lock_held);
afr_sh_data_fxattrop (frame, this,
@@ -850,6 +854,27 @@ out:
}
int
+afr_sh_data_special_file_fix (call_frame_t *frame, xlator_t *this)
+{
+ afr_private_t *priv = NULL;
+ afr_self_heal_t *sh = NULL;
+ afr_local_t *local = NULL;
+ int i = 0;
+
+ local = frame->local;
+ sh = &local->self_heal;
+ priv = this->private;
+
+ for (i = 0; i < priv->child_count ; i++)
+ if (1 == local->child_up[i])
+ sh->success[i] = 1;
+
+ afr_sh_data_erase_pending (frame, this);
+
+ return 0;
+}
+
+int
afr_sh_data_fstat_cbk (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret, int32_t op_errno,
struct iatt *buf)
@@ -882,7 +907,14 @@ afr_sh_data_fstat_cbk (call_frame_t *frame, void *cookie,
call_count = afr_frame_return (frame);
if (call_count == 0) {
- afr_sh_data_fix (frame, this);
+ /* Previous versions of glusterfs might have set
+ * the pending data xattrs which need to be erased
+ */
+ if (IA_ISREG (buf->ia_type))
+ afr_sh_data_fix (frame, this);
+ else
+ afr_sh_data_special_file_fix (frame, this);
+
}
return 0;