diff options
author | Vikas Gorur <vikas@gluster.com> | 2009-10-22 05:37:36 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-22 04:15:43 -0700 |
commit | d5009323b3031122508fbd8daa61025b7c397e3c (patch) | |
tree | 66ed1dc2cdba7f8bda17b2d8ea12b61f4e066b57 | |
parent | 1fe48896b950e74b589a8ed2c62bfb8571a0bf16 (diff) |
cluster/afr: entry self-heal: Set parent directory's attributes using a new frame.
There was a race condition in assuming that afr_sh_entry_impunge_parent_setattr_cbk will
always return before impunge_xattrop_cbk and impunge_setattr_cbk.
This patch fixes two additional problems:
1) Building the parent_loc from impunge_local->loc after STACK_WIND to
impunge_xattrop_cbk has happened. In a simple afr-posix configuration
the stack will have been destroyed by the time building of parent_loc is
attempted.
2) parent_loc built in impunge_newfile_cbk was not being loc_wipe'd.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 137 (Parent directory mtime not reset after a create in self-heal)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=137
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index deaf24f07..579915f78 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -488,7 +488,6 @@ afr_sh_entry_expunge_remove_cbk (call_frame_t *expunge_frame, void *cookie, int active_src = 0; call_frame_t *frame = NULL; - loc_t parent_loc; int32_t valid = 0; priv = this->private; @@ -512,13 +511,13 @@ afr_sh_entry_expunge_remove_cbk (call_frame_t *expunge_frame, void *cookie, } valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME; - afr_build_parent_loc (&parent_loc, &expunge_local->loc); + afr_build_parent_loc (&expunge_sh->parent_loc, &expunge_local->loc); STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_parent_setattr_cbk, (void *) (long) active_src, priv->children[active_src], priv->children[active_src]->fops->setattr, - &parent_loc, + &expunge_sh->parent_loc, &expunge_sh->parentbuf, valid); @@ -1086,26 +1085,20 @@ afr_sh_entry_impunge_xattrop_cbk (call_frame_t *impunge_frame, void *cookie, int -afr_sh_entry_impunge_parent_setattr_cbk (call_frame_t *impunge_frame, +afr_sh_entry_impunge_parent_setattr_cbk (call_frame_t *setattr_frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, struct stat *preop, struct stat *postop) { - afr_private_t *priv = NULL; - afr_local_t *impunge_local = NULL; + loc_t *parent_loc = cookie; - int child_index = (long) cookie; - - priv = this->private; - impunge_local = impunge_frame->local; + gf_log (this->name, GF_LOG_DEBUG, + "setattr on directory %s failed: %s", + parent_loc->path, strerror (op_errno)); - if (op_ret != 0) { - gf_log (this->name, GF_LOG_DEBUG, - "setattr on parent directory of %s on subvolume %s failed: %s", - impunge_local->loc.path, - priv->children[child_index]->name, strerror (op_errno)); - } + loc_wipe (parent_loc); + AFR_STACK_DESTROY (setattr_frame); return 0; } @@ -1132,8 +1125,10 @@ afr_sh_entry_impunge_newfile_cbk (call_frame_t *impunge_frame, void *cookie, afr_local_t *local = NULL; afr_self_heal_t *sh = NULL; + call_frame_t *setattr_frame = NULL; loc_t parent_loc; int32_t valid = 0; + struct stat parentbuf; priv = this->private; impunge_local = impunge_frame->local; @@ -1170,22 +1165,23 @@ afr_sh_entry_impunge_newfile_cbk (call_frame_t *impunge_frame, void *cookie, ret = dict_set_static_bin (xattr, priv->pending_key[child_index], pending_array, sizeof (pending_array)); + valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME; + parentbuf = impunge_sh->parentbuf; + setattr_frame = copy_frame (impunge_frame); + + afr_build_parent_loc (&parent_loc, &impunge_local->loc); + STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_xattrop_cbk, (void *) (long) child_index, priv->children[active_src], priv->children[active_src]->fops->xattrop, &impunge_local->loc, GF_XATTROP_ADD_ARRAY, xattr); - valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME; - afr_build_parent_loc (&parent_loc, &impunge_local->loc); - - STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_parent_setattr_cbk, - (void *) (long) child_index, + STACK_WIND_COOKIE (setattr_frame, afr_sh_entry_impunge_parent_setattr_cbk, + (void *) (long) &parent_loc, priv->children[child_index], priv->children[child_index]->fops->setattr, - &parent_loc, - &impunge_sh->parentbuf, - valid); + &parent_loc, &parentbuf, valid); dict_unref (xattr); |