summaryrefslogtreecommitdiffstats
path: root/xlators/features/index/src/index.c
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-06-15 16:02:44 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-06-28 03:47:03 -0700
commit2fe7b9ddefd33d64e601254bbf740b24e2b85469 (patch)
tree3e7cd2f1cc6d81da06f4b80b9f846cedfd2afcff /xlators/features/index/src/index.c
parent4b9132de1710be9b437b0dfbfdcf2bfeecee9db3 (diff)
features/index: Do deletion of name-index in unwind path
Backport of: http://review.gluster.org/14742 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: If0d713645858c9dce6d4a9c5d9ea27ccb0cfa29f BUG: 1349711 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/14787 Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Ravishankar N <ravishankar@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/features/index/src/index.c')
-rw-r--r--xlators/features/index/src/index.c113
1 files changed, 82 insertions, 31 deletions
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;
}