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;  }  | 
