diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2016-07-07 14:33:20 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-07-15 19:12:36 -0700 |
commit | 8dccf7e222fa01c5e15a0ec1f0bc422abcde3779 (patch) | |
tree | cc2d8b994877634a87d1b010ea07e75aacb9fdc5 | |
parent | ddcfe83b06b6498710c2d9d36027a8ad305b686e (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.c | 33 |
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; } |