summaryrefslogtreecommitdiffstats
path: root/xlators/performance/md-cache/src/md-cache.c
diff options
context:
space:
mode:
authorPoornima G <pgurusid@redhat.com>2016-11-08 10:32:29 +0530
committerRajesh Joseph <rjoseph@redhat.com>2016-12-02 02:46:58 -0800
commit4536f7bdf16f8286d67598eda9a46c029f0c0bf4 (patch)
tree5e62c0cc93c5ab941a83ac43b90530aed5243856 /xlators/performance/md-cache/src/md-cache.c
parent91e72a0f2e4e51ce20550946578a6d50cbb88e26 (diff)
dht/md-cache: Filter invalidate if the file is made a linkto file
Upcall as a part of setattr, sends an invalidation and the invalidation carries the resulting stat value. When a file is converted to linkto files, even then an invalidation is set and as a result the mountpoint shows the sticky bit in the stat of the file. eg: ---------T. 945 root root 0 Nov 8 10:14 hardlink.999 Fix: When dht recieves a notification of sticky bit change, it updates the flag, to indicate md-cache to send the subsequent lookup. Change-Id: Ic2fd7a5b196db0754f9b97072e644e6bf69da606 BUG: 1392713 Signed-off-by: Poornima G <pgurusid@redhat.com> Reviewed-on: http://review.gluster.org/15789 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Niels de Vos <ndevos@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Susant Palai <spalai@redhat.com> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Diffstat (limited to 'xlators/performance/md-cache/src/md-cache.c')
-rw-r--r--xlators/performance/md-cache/src/md-cache.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c
index aa1c22ade51..9edbdf4aebe 100644
--- a/xlators/performance/md-cache/src/md-cache.c
+++ b/xlators/performance/md-cache/src/md-cache.c
@@ -40,6 +40,8 @@ struct mdc_statistics {
sent to bricks */
uint64_t stat_invals; /* No. of invalidates recieved from upcall*/
uint64_t xattr_invals; /* No. of invalidates recieved from upcall*/
+ uint64_t need_lookup; /* No. of lookups issued, because other xlators
+ * requested for explicit lookup */
gf_lock_t lock;
};
@@ -153,6 +155,7 @@ struct md_cache {
char *linkname;
time_t ia_time;
time_t xa_time;
+ gf_boolean_t need_lookup;
gf_lock_t lock;
};
@@ -791,6 +794,43 @@ out:
return ret;
}
+gf_boolean_t
+mdc_inode_reset_need_lookup (xlator_t *this, inode_t *inode)
+{
+ struct md_cache *mdc = NULL;
+ gf_boolean_t need = _gf_false;
+
+ if (mdc_inode_ctx_get (this, inode, &mdc) != 0)
+ goto out;
+
+ LOCK (&mdc->lock);
+ {
+ need = mdc->need_lookup;
+ mdc->need_lookup = _gf_false;
+ }
+ UNLOCK (&mdc->lock);
+
+out:
+ return need;
+}
+
+void
+mdc_inode_set_need_lookup (xlator_t *this, inode_t *inode, gf_boolean_t need)
+{
+ struct md_cache *mdc = NULL;
+
+ if (mdc_inode_ctx_get (this, inode, &mdc) != 0)
+ goto out;
+
+ LOCK (&mdc->lock);
+ {
+ mdc->need_lookup = need;
+ }
+ UNLOCK (&mdc->lock);
+
+out:
+ return;
+}
void
mdc_inode_iatt_invalidate (xlator_t *this, inode_t *inode)
@@ -1034,6 +1074,12 @@ mdc_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
goto uncached;
}
+ if (mdc_inode_reset_need_lookup (this, loc->inode)) {
+ INCREMENT_ATOMIC (conf->mdc_counter.lock,
+ conf->mdc_counter.need_lookup);
+ goto uncached;
+ }
+
ret = mdc_inode_iatt_get (this, loc->inode, &stbuf);
if (ret != 0) {
INCREMENT_ATOMIC (conf->mdc_counter.lock,
@@ -2593,6 +2639,11 @@ mdc_invalidate (xlator_t *this, void *data)
mdc_update_gfid_stat (this, &up_ci->oldp_stat);
}
+ if (up_ci->flags & UP_EXPLICIT_LOOKUP) {
+ mdc_inode_set_need_lookup (this, inode, _gf_true);
+ goto out;
+ }
+
if ((up_ci->flags & (UP_NLINK | UP_RENAME_FLAGS | UP_FORGET)) ||
(up_ci->dict && dict_get (up_ci->dict, MDC_INVALIDATE_IATT))) {
mdc_inode_iatt_invalidate (this, inode);