diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2014-06-03 00:28:08 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2014-06-13 01:49:10 -0700 |
commit | 6ba178fd9ebf9fc98415c30bcd338a68ee5eb601 (patch) | |
tree | b050a02506263651ba24603f25672bfd13d1f0b3 | |
parent | 4d656f9008747172db52f6d532b610c487528bfb (diff) |
protocol/server: reflect lru limit in inode table also
Upon reconfigure, when lru limit of the inode table is changed,
the new value was just saved in the private structure of the
protocol/server xlator and the inode table used to have the older
values still. A brick start was required for the changes to get
reflected. To handle it, traverse through the xlator tree and check
whether a xlator is a bound_xl or not (if it is a bound_xl it would
have its itable pointer set). If a xlator is a bound_xl, then get
the inode table of that bound_xl and set its lru limit to new value
given via cli. Also prune the inode table so that extra inodes are
purged from the inode table.
Change-Id: I6909be028c116adaa1d1a5108470015b5fc6f09d
BUG: 1103756
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-on: http://review.gluster.org/7957
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Tested-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | libglusterfs/src/inode.c | 21 | ||||
-rw-r--r-- | libglusterfs/src/inode.h | 6 | ||||
-rw-r--r-- | libglusterfs/src/xlator.c | 19 | ||||
-rw-r--r-- | libglusterfs/src/xlator.h | 3 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.c | 10 |
5 files changed, 59 insertions, 0 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index d4eade8ba88..373ba9beb39 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -1238,6 +1238,27 @@ inode_path (inode_t *inode, const char *name, char **bufp) return ret; } +void +__inode_table_set_lru_limit (inode_table_t *table, uint32_t lru_limit) +{ + table->lru_limit = lru_limit; + return; +} + + +void +inode_table_set_lru_limit (inode_table_t *table, uint32_t lru_limit) +{ + pthread_mutex_lock (&table->lock); + { + __inode_table_set_lru_limit (table, lru_limit); + } + pthread_mutex_unlock (&table->lock); + + inode_table_prune (table); + + return; +} static int inode_table_prune (inode_table_t *table) diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index 60adba68425..5d373fcaec9 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -251,4 +251,10 @@ inode_ctx_put(inode_t *inode, xlator_t *this, uint64_t v) gf_boolean_t __is_root_gfid (uuid_t gfid); +void +__inode_table_set_lru_limit (inode_table_t *table, uint32_t lru_limit); + +void +inode_table_set_lru_limit (inode_table_t *table, uint32_t lru_limit); + #endif /* _INODE_H */ diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 4f8b8b21f95..7b873fcc79d 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -291,6 +291,25 @@ xlator_set_type (xlator_t *xl, const char *type) return ret; } +void +xlator_set_inode_lru_limit (xlator_t *this, void *data) +{ + int inode_lru_limit = 0; + + if (this->itable) { + if (!data) { + gf_log (this->name, GF_LOG_WARNING, "input data is " + "NULL. Cannot update the lru limit of the inode" + " table. Continuing with older value"); + goto out; + } + inode_lru_limit = *(int *)data; + inode_table_set_lru_limit (this->itable, inode_lru_limit); + } + +out: + return; +} void xlator_foreach (xlator_t *this, diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 47ae6cdd6b6..0c4e820c2d3 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -935,6 +935,9 @@ void xlator_foreach_depth_first (xlator_t *this, xlator_t *xlator_search_by_name (xlator_t *any, const char *name); +void +xlator_set_inode_lru_limit (xlator_t *this, void *data); + void inode_destroy_notify (inode_t *inode, const char *xlname); int loc_copy (loc_t *dst, loc_t *src); diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 04faee290ea..60092a557de 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -677,6 +677,8 @@ reconfigure (xlator_t *this, dict_t *options) data_t *data; int ret = 0; char *statedump_path = NULL; + xlator_t *xl = NULL; + conf = this->private; if (!conf) { @@ -687,6 +689,14 @@ reconfigure (xlator_t *this, dict_t *options) conf->inode_lru_limit = inode_lru_limit; gf_log (this->name, GF_LOG_TRACE, "Reconfigured inode-lru-limit" " to %d", conf->inode_lru_limit); + + /* traverse through the xlator graph. For each xlator in the + graph check whether it is a bound_xl or not (bound_xl means + the xlator will have its itable pointer set). If so, then + set the lru limit for the itable. + */ + xlator_foreach (this, xlator_set_inode_lru_limit, + &inode_lru_limit); } data = dict_get (options, "trace"); |