summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-07-07 14:33:20 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-07-15 19:12:36 -0700
commit8dccf7e222fa01c5e15a0ec1f0bc422abcde3779 (patch)
treecc2d8b994877634a87d1b010ea07e75aacb9fdc5
parentddcfe83b06b6498710c2d9d36027a8ad305b686e (diff)
features/index: Ignore regular files when examining state of the inode wrt ENTRY_CHANGES
Backport of: http://review.gluster.org/14870 This prevents unnecessary sys_lstat() syscall when xattrop is operating on regular files. Also, to avoid (even) the one-time execution of sys_lstat() syscalls on disperse volumes or replicate volumes when granular entry self-heal is disabled, we pass a key in afr_selfheal_undo_pending() indicating to index that this xattrop is on a granular directory index. Index will accordingly decide whether or not to attempt the index state initialization. Change-Id: I86b69e83b6216c3371d997a4983d75d4be6a28b2 BUG: 1355609 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/14921 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
-rw-r--r--xlators/features/index/src/index.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c
index 4f431648913..7b8713c89ef 100644
--- a/xlators/features/index/src/index.c
+++ b/xlators/features/index/src/index.c
@@ -945,6 +945,7 @@ xattrop_index_action (xlator_t *this, index_local_t *local, dict_t *xattr,
int i = 0;
int ret = 0;
int zfilled[XATTROP_TYPE_END] = {0,};
+ int8_t value = 0;
char *subdir = NULL;
dict_t *req_xdata = NULL;
inode_t *inode = NULL;
@@ -959,22 +960,32 @@ xattrop_index_action (xlator_t *this, index_local_t *local, dict_t *xattr,
_check_key_is_zero_filled, zfilled);
_index_action (this, inode, zfilled);
- if (req_xdata)
+ if (req_xdata) {
ret = index_entry_action (this, inode, req_xdata,
GF_XATTROP_ENTRY_OUT_KEY);
- if (zfilled[XATTROP] == 1) {
- subdir = index_get_subdir_from_type (ENTRY_CHANGES);
- ret = index_inode_ctx_get (inode, this, &ctx);
- if (ctx->state[ENTRY_CHANGES] == UNKNOWN)
- index_init_state (this, inode, ctx, subdir);
- if (ctx->state[ENTRY_CHANGES] == IN) {
- ret = index_del (this, inode->gfid, subdir,
- ENTRY_CHANGES);
- ctx->state[ENTRY_CHANGES] = NOTIN;
- }
+ ret = dict_get_int8 (req_xdata, GF_XATTROP_PURGE_INDEX, &value);
+ if ((ret) || (value == 0))
+ goto out;
+ }
+
+ if (zfilled[XATTROP] != 1)
+ goto out;
+
+ if (inode->ia_type != IA_IFDIR)
+ goto out;
+
+ subdir = index_get_subdir_from_type (ENTRY_CHANGES);
+ ret = index_inode_ctx_get (inode, this, &ctx);
+ if (ctx->state[ENTRY_CHANGES] == UNKNOWN)
+ index_init_state (this, inode, ctx, subdir);
+ if (ctx->state[ENTRY_CHANGES] == IN) {
+ ret = index_del (this, inode->gfid, subdir,
+ ENTRY_CHANGES);
+ ctx->state[ENTRY_CHANGES] = NOTIN;
}
+out:
return;
}