diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2016-06-15 16:02:44 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-06-23 21:14:08 -0700 |
commit | 59523a782d7ed00b31c8cdf8da74310384272355 (patch) | |
tree | a445e8888acc42bd7836233a5307e9975ee323c0 /xlators/features | |
parent | ec3ea75513347deb95960f49d58fc19478a7ad17 (diff) |
features/index: Do deletion of name-index in unwind path
Previously the deletion of name index was being done before
winding the xattrop to posix. This order needs to be changed
to ensure we don't lose the index in the event the xattrop fails
in posix xl.
Change-Id: I4aa892b102cbf5269cede041b871064563cb7348
BUG: 1331323
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/14742
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Ravishankar N <ravishankar@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/features')
-rw-r--r-- | xlators/features/index/src/index-mem-types.h | 1 | ||||
-rw-r--r-- | xlators/features/index/src/index.c | 113 | ||||
-rw-r--r-- | xlators/features/index/src/index.h | 15 |
3 files changed, 96 insertions, 33 deletions
diff --git a/xlators/features/index/src/index-mem-types.h b/xlators/features/index/src/index-mem-types.h index 553d492dfbf..ca291cfba7e 100644 --- a/xlators/features/index/src/index-mem-types.h +++ b/xlators/features/index/src/index-mem-types.h @@ -17,6 +17,7 @@ enum gf_index_mem_types_ { gf_index_mt_priv_t = gf_common_mt_end + 1, gf_index_inode_ctx_t = gf_common_mt_end + 2, gf_index_fd_ctx_t = gf_common_mt_end + 3, + gf_index_mt_local_t = gf_common_mt_end + 4, gf_index_mt_end }; #endif diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index 2c8813b2959..b6bd5e87b73 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -791,6 +791,8 @@ index_entry_create (xlator_t *this, uuid_t gfid, char *filename) } } + op_errno = 0; + snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, filename); index_get_index (priv, index); @@ -800,6 +802,8 @@ index_entry_create (xlator_t *this, uuid_t gfid, char *filename) sizeof (entry_base_index_path), entry_path, ENTRY_CHANGES_SUBDIR); out: + if (op_errno) + ret = -op_errno; return ret; } @@ -836,24 +840,23 @@ out: } int -index_entry_action (xlator_t *this, inode_t *inode, dict_t *xdata) +index_entry_action (xlator_t *this, inode_t *inode, dict_t *xdata, char *key) { - char *filename = NULL; - char *pargfid = NULL; - int ret = 0; + int ret = 0; + char *filename = NULL; + char *pargfid = NULL; - ret = dict_get_str (xdata, GF_XATTROP_ENTRY_IN_KEY, &filename); - if (ret == 0) { - ret = index_entry_create (this, inode->gfid, filename); + ret = dict_get_str (xdata, key, &filename); + if (ret != 0) { + ret = 0; goto out; } - ret = dict_get_str (xdata, GF_XATTROP_ENTRY_OUT_KEY, &filename); - if (ret == 0) { + if (strcmp (key, GF_XATTROP_ENTRY_IN_KEY) == 0) + ret = index_entry_create (this, inode->gfid, filename); + else if (strcmp (key, GF_XATTROP_ENTRY_OUT_KEY) == 0) ret = index_entry_delete (this, inode->gfid, filename); - goto out; - } - ret = 0; + out: return ret; } @@ -894,17 +897,27 @@ out: } void -xattrop_index_action (xlator_t *this, inode_t *inode, dict_t *xattr, +xattrop_index_action (xlator_t *this, index_local_t *local, dict_t *xattr, dict_match_t match, void *match_data) { - gf_boolean_t zero_xattr = _gf_true; - int ret = 0, i = 0; - int zfilled[XATTROP_TYPE_END] = {0,}; + int i = 0; + int ret = 0; + int zfilled[XATTROP_TYPE_END] = {0,}; + dict_t *req_xdata = NULL; + inode_t *inode = NULL; + gf_boolean_t zero_xattr = _gf_true; + + inode = local->inode; + req_xdata = local->xdata; memset (zfilled, -1, sizeof (zfilled)); ret = dict_foreach_match (xattr, match, match_data, _check_key_is_zero_filled, zfilled); _index_action (this, inode, zfilled); + + if (req_xdata) + ret = index_entry_action (this, inode, req_xdata, + GF_XATTROP_ENTRY_OUT_KEY); return; } @@ -1092,13 +1105,16 @@ xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xattr, dict_t *xdata, dict_match_t match, dict_t *matchdata) { - inode_t *inode = NULL; + inode_t *inode = NULL; + index_local_t *local = NULL; + + local = frame->local; + inode = inode_ref (local->inode); - inode = inode_ref (frame->local); if (op_ret < 0) goto out; - xattrop_index_action (this, frame->local, xattr, match, matchdata); + xattrop_index_action (this, local, xattr, match, matchdata); out: INDEX_STACK_UNWIND (xattrop, frame, op_ret, op_errno, xattr, xdata); index_queue_process (this, inode, NULL); @@ -1136,10 +1152,15 @@ index_xattrop_do (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata) { - fop_xattrop_cbk_t x_cbk = NULL; - int zfilled[XATTROP_TYPE_END] = {0,}; - int ret = -1, i = 0; - index_priv_t *priv = this->private; + int i = 0; + int ret = -1; + int zfilled[XATTROP_TYPE_END] = {0,}; + index_priv_t *priv = NULL; + index_local_t *local = NULL; + fop_xattrop_cbk_t x_cbk = NULL; + + local = frame->local; + priv = this->private; if (optype == GF_XATTROP_ADD_ARRAY) x_cbk = index_xattrop_cbk; @@ -1165,9 +1186,10 @@ index_xattrop_do (call_frame_t *frame, xlator_t *this, loc_t *loc, */ ret = dict_foreach (xattr, index_fill_zero_array, zfilled); - _index_action (this, frame->local, zfilled); + _index_action (this, local->inode, zfilled); if (xdata) - ret = index_entry_action (this, frame->local, xdata); + ret = index_entry_action (this, local->inode, xdata, + GF_XATTROP_ENTRY_IN_KEY); if (ret < 0) { x_cbk (frame, NULL, this, -1, -ret, NULL, NULL); return; @@ -1203,15 +1225,25 @@ int32_t index_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata) { - call_stub_t *stub = NULL; + call_stub_t *stub = NULL; + index_local_t *local = NULL; if (!index_xattrop_track (this, flags, dict)) goto out; - frame->local = inode_ref (loc->inode); + local = mem_get0 (this->local_pool); + if (!local) + goto err; + + frame->local = local; + local->inode = inode_ref (loc->inode); + if (xdata) + local->xdata = dict_ref (xdata); stub = fop_xattrop_stub (frame, index_xattrop_wrapper, loc, flags, dict, xdata); - if (!stub) { + +err: + if ((!local) || (!stub)) { INDEX_STACK_UNWIND (xattrop, frame, -1, ENOMEM, NULL, NULL); return 0; } @@ -1228,15 +1260,25 @@ int32_t index_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd, gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata) { - call_stub_t *stub = NULL; + call_stub_t *stub = NULL; + index_local_t *local = NULL; if (!index_xattrop_track (this, flags, dict)) goto out; - frame->local = inode_ref (fd->inode); + local = mem_get0 (this->local_pool); + if (!local) + goto err; + + frame->local = local; + local->inode = inode_ref (fd->inode); + if (xdata) + local->xdata = dict_ref (xdata); stub = fop_fxattrop_stub (frame, index_fxattrop_wrapper, fd, flags, dict, xdata); - if (!stub) { + +err: + if ((!local) || (!stub)) { INDEX_STACK_UNWIND (fxattrop, frame, -1, ENOMEM, NULL, xdata); return 0; } @@ -2086,6 +2128,12 @@ init (xlator_t *this) INIT_LIST_HEAD (&priv->callstubs); + this->local_pool = mem_pool_new (index_local_t, 64); + if (!this->local_pool) { + ret = -1; + goto out; + } + this->private = priv; ret = index_dir_create (this, XATTROP_SUBDIR); @@ -2129,6 +2177,7 @@ out: if (priv) GF_FREE (priv); this->private = NULL; + mem_pool_destroy (this->local_pool); } if (attr_inited) @@ -2155,6 +2204,8 @@ fini (xlator_t *this) if (priv->complete_watchlist) dict_unref (priv->complete_watchlist); GF_FREE (priv); + mem_pool_destroy (this->local_pool); + this->local_pool = NULL; out: return; } diff --git a/xlators/features/index/src/index.h b/xlators/features/index/src/index.h index 24fd293db70..5fb5a65cd8e 100644 --- a/xlators/features/index/src/index.h +++ b/xlators/features/index/src/index.h @@ -62,14 +62,25 @@ typedef struct index_priv { int64_t pending_count; } index_priv_t; +typedef struct index_local { + inode_t *inode; + dict_t *xdata; +} index_local_t; + #define INDEX_STACK_UNWIND(fop, frame, params ...) \ do { \ + index_local_t *__local = NULL; \ if (frame) { \ - inode_t *_inode = frame->local; \ + __local = frame->local; \ frame->local = NULL; \ - inode_unref (_inode); \ } \ STACK_UNWIND_STRICT (fop, frame, params); \ + if (__local) { \ + inode_unref (__local->inode); \ + if (__local->xdata) \ + dict_unref (__local->xdata); \ + mem_put (__local); \ + } \ } while (0) #endif |