summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
authorRaghavendra G <rgowdapp@redhat.com>2016-11-24 14:58:20 +0530
committerAtin Mukherjee <amukherj@redhat.com>2016-12-22 03:43:14 -0800
commit96fb35624060565e02e946a970b3e777071bde9c (patch)
treea375bccd2b79b0d0c269474a2a318138ca6045aa /libglusterfs
parent7ee998b9041d594d93a4e2ef369892c185e80def (diff)
performance/readdir-ahead: limit cache size
This patch introduces a new option called "rda-cache-limit", which is the maximum value the entire readdir-ahead cache can grow into. Since, readdir-ahead holds a reference to inode through dentries, this patch also accounts memory stored by various xlators in inode contexts. Change-Id: I84cc0ca812f35e0f9041f8cc71effae53a9e7f99 BUG: 1356960 Signed-off-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-on: http://review.gluster.org/16137 NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Poornima G <pgurusid@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/inode.c32
-rw-r--r--libglusterfs/src/inode.h3
-rw-r--r--libglusterfs/src/xlator.h6
3 files changed, 41 insertions, 0 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c
index 6e4c2f11bc2..841f0b63f16 100644
--- a/libglusterfs/src/inode.c
+++ b/libglusterfs/src/inode.c
@@ -2504,3 +2504,35 @@ out:
return;
}
+
+size_t
+inode_ctx_size (inode_t *inode)
+{
+ int i = 0;
+ size_t size = 0;
+ xlator_t *xl = NULL, *old_THIS = NULL;
+
+ if (!inode)
+ goto out;
+
+ LOCK (&inode->lock);
+ {
+ for (i = 0; i < inode->table->ctxcount; i++) {
+ if (!inode->_ctx[i].xl_key)
+ continue;
+
+ xl = (xlator_t *)(long)inode->_ctx[i].xl_key;
+ old_THIS = THIS;
+ THIS = xl;
+
+ if (xl->cbks->ictxsize)
+ size += xl->cbks->ictxsize (xl, inode);
+
+ THIS = old_THIS;
+ }
+ }
+ UNLOCK (&inode->lock);
+
+out:
+ return size;
+}
diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h
index 114aeae78bb..5289b15bca6 100644
--- a/libglusterfs/src/inode.h
+++ b/libglusterfs/src/inode.h
@@ -279,4 +279,7 @@ inode_needs_lookup (inode_t *inode, xlator_t *this);
int
inode_has_dentry (inode_t *inode);
+size_t
+inode_ctx_size (inode_t *inode);
+
#endif /* _INODE_H */
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index 70e6f0a108d..b11d1a96f32 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -847,6 +847,10 @@ typedef int32_t (*cbk_client_t)(xlator_t *this, client_t *client);
typedef void (*cbk_ictxmerge_t) (xlator_t *this, fd_t *fd,
inode_t *inode, inode_t *linked_inode);
+typedef size_t (*cbk_inodectx_size_t)(xlator_t *this, inode_t *inode);
+
+typedef size_t (*cbk_fdctx_size_t)(xlator_t *this, fd_t *fd);
+
struct xlator_cbks {
cbk_forget_t forget;
cbk_release_t release;
@@ -855,6 +859,8 @@ struct xlator_cbks {
cbk_client_t client_destroy;
cbk_client_t client_disconnect;
cbk_ictxmerge_t ictxmerge;
+ cbk_inodectx_size_t ictxsize;
+ cbk_fdctx_size_t fdctxsize;
};
typedef int32_t (*dumpop_priv_t) (xlator_t *this);