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-12 00:22:44 -0700
commit633d88ea7ef621bcce9a408188bc57858f6ca942 (patch)
tree8b0b851f42e9fc8044a6a9759faf999dcaa7e999
parentceac3b4172e7c689941ec3e734eca6c537e69368 (diff)
features/index: Ignore regular files when examining state of the inode wrt ENTRY_CHANGES
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: I616d9a4b3704066f4a2770d3ca307f7dca9122e0 BUG: 1331323 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/14870 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: Anuradha Talur <atalur@redhat.com> 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;
}