performance/io-cache: cache only those files whose size falls under configured window.

Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>

BUG: 570 (Cache only those files whose sizes falls under a configured window size)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=570
This commit is contained in:
Raghavendra G 2010-01-25 05:43:24 +00:00 committed by Anand V. Avati
parent 3eef8dfd1b
commit 61dbadb2e7
2 changed files with 129 additions and 63 deletions

View File

@ -183,39 +183,56 @@ ioc_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
ioc_table_t *table = this->private;
uint8_t cache_still_valid = 0;
uint64_t tmp_ioc_inode = 0;
uint32_t weight = 0xffffffff;
const char *path = NULL;
if (op_ret != 0)
goto out;
inode_ctx_get (inode, this, &tmp_ioc_inode);
ioc_inode = (ioc_inode_t *)(long)tmp_ioc_inode;
if (ioc_inode) {
ioc_inode_lock (ioc_inode);
{
if (ioc_inode->cache.mtime == 0) {
ioc_inode->cache.mtime = stbuf->st_mtime;
}
}
ioc_inode_unlock (ioc_inode);
LOCK (&inode->lock);
{
__inode_ctx_get (inode, this, &tmp_ioc_inode);
ioc_inode = (ioc_inode_t *)(long)tmp_ioc_inode;
if (!ioc_inode) {
weight = ioc_get_priority (table, path);
ioc_inode = ioc_inode_update (table, inode,
weight);
cache_still_valid = ioc_cache_still_valid (ioc_inode,
stbuf);
__inode_ctx_put (inode, this,
(uint64_t)(long)ioc_inode);
}
}
UNLOCK (&inode->lock);
ioc_inode_lock (ioc_inode);
{
if (ioc_inode->cache.mtime == 0) {
ioc_inode->cache.mtime = stbuf->st_mtime;
}
ioc_inode->st_size = stbuf->st_size;
}
ioc_inode_unlock (ioc_inode);
cache_still_valid = ioc_cache_still_valid (ioc_inode,
stbuf);
if (!cache_still_valid) {
ioc_inode_flush (ioc_inode);
}
if (!cache_still_valid) {
ioc_inode_flush (ioc_inode);
}
ioc_table_lock (ioc_inode->table);
{
list_move_tail (&ioc_inode->inode_lru,
&table->inode_lru[ioc_inode->weight]);
}
ioc_table_unlock (ioc_inode->table);
}
ioc_table_lock (ioc_inode->table);
{
list_move_tail (&ioc_inode->inode_lru,
&table->inode_lru[ioc_inode->weight]);
}
ioc_table_unlock (ioc_inode->table);
out:
STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, stbuf, dict,
postparent);
STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, stbuf,
dict, postparent);
return 0;
}
@ -467,35 +484,25 @@ ioc_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
path = local->file_loc.path;
if (op_ret != -1) {
/* look for ioc_inode corresponding to this fd */
LOCK (&fd->inode->lock);
{
__inode_ctx_get (fd->inode, this, &tmp_ioc_inode);
ioc_inode = (ioc_inode_t *)(long)tmp_ioc_inode;
inode_ctx_get (fd->inode, this, &tmp_ioc_inode);
ioc_inode = (ioc_inode_t *)(long)tmp_ioc_inode;
if (!ioc_inode) {
/*
this is the first time someone is opening
this file, assign weight
*/
weight = ioc_get_priority (table, path);
ioc_inode = ioc_inode_update (table, inode,
weight);
ioc_table_lock (ioc_inode->table);
{
list_move_tail (&ioc_inode->inode_lru,
&table->inode_lru[ioc_inode->weight]);
}
ioc_table_unlock (ioc_inode->table);
__inode_ctx_put (fd->inode, this,
(uint64_t)(long)ioc_inode);
} else {
ioc_table_lock (ioc_inode->table);
{
list_move_tail (&ioc_inode->inode_lru,
&table->inode_lru[ioc_inode->weight]);
}
ioc_table_unlock (ioc_inode->table);
ioc_inode_lock (ioc_inode);
{
if ((table->min_file_size > ioc_inode->st_size)
|| ((table->max_file_size >= 0)
&& (table->max_file_size < ioc_inode->st_size))) {
fd_ctx_set (fd, this, 1);
}
}
UNLOCK (&fd->inode->lock);
}
ioc_inode_unlock (ioc_inode);
/* If mandatory locking has been enabled on this file,
we disable caching on it */
@ -558,21 +565,27 @@ ioc_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
path = local->file_loc.path;
if (op_ret != -1) {
{
/* assign weight */
weight = ioc_get_priority (table, path);
/* assign weight */
weight = ioc_get_priority (table, path);
ioc_inode = ioc_inode_update (table, inode, weight);
ioc_inode = ioc_inode_update (table, inode, weight);
ioc_inode_lock (ioc_inode);
{
ioc_inode->cache.mtime = buf->st_mtime;
ioc_inode_lock (ioc_inode);
{
ioc_inode->cache.mtime = buf->st_mtime;
ioc_inode->st_size = buf->st_size;
if ((table->min_file_size > ioc_inode->st_size)
|| ((table->max_file_size >= 0)
&& (table->max_file_size < ioc_inode->st_size))) {
fd_ctx_set (fd, this, 1);
}
ioc_inode_unlock (ioc_inode);
}
ioc_inode_unlock (ioc_inode);
inode_ctx_put (fd->inode, this,
(uint64_t)(long)ioc_inode);
inode_ctx_put (fd->inode, this,
(uint64_t)(long)ioc_inode);
}
/*
* If mandatory locking has been enabled on this file,
* we disable caching on it
@ -1324,7 +1337,7 @@ init (xlator_t *this)
ioc_table_t *table = NULL;
dict_t *options = this->options;
uint32_t index = 0;
char *cache_size_string = NULL;
char *cache_size_string = NULL, *tmp = NULL;
int32_t ret = -1;
glusterfs_ctx_t *ctx = NULL;
@ -1394,8 +1407,48 @@ init (xlator_t *this)
}
}
table->max_pri ++;
table->min_file_size = 0;
tmp = data_to_str (dict_get (options, "min-file-size"));
if (tmp != NULL) {
if (gf_string2bytesize (tmp,
(uint64_t *)&table->min_file_size) != 0) {
gf_log ("io-cache", GF_LOG_ERROR,
"invalid number format \"%s\" of "
"\"option min-file-size\"", tmp);
goto out;
}
gf_log (this->name, GF_LOG_TRACE,
"using min-file-size %"PRIu64"", table->min_file_size);
}
table->max_file_size = -1;
tmp = data_to_str (dict_get (options, "max-file-size"));
if (tmp != NULL) {
if (gf_string2bytesize (tmp,
(uint64_t *)&table->max_file_size) != 0) {
gf_log ("io-cache", GF_LOG_ERROR,
"invalid number format \"%s\" of "
"\"option max-file-size\"", tmp);
goto out;
}
gf_log (this->name, GF_LOG_TRACE,
"using max-file-size %"PRIu64"", table->max_file_size);
}
INIT_LIST_HEAD (&table->inodes);
if ((table->max_file_size >= 0)
&& (table->min_file_size > table->max_file_size)) {
gf_log ("io-cache", GF_LOG_ERROR, "minimum size (%"
PRIu64") of a file that can be cached is "
"greater than maximum size (%"PRIu64")",
table->min_file_size, table->max_file_size);
goto out;
}
table->inode_lru = CALLOC (table->max_pri, sizeof (struct list_head));
if (table->inode_lru == NULL) {
goto out;
@ -1477,5 +1530,15 @@ struct volume_options options[] = {
.min = 4 * GF_UNIT_MB,
.max = 6 * GF_UNIT_GB
},
{ .key = {"min-file-size"},
.type = GF_OPTION_TYPE_SIZET,
.min = -1,
.max = -1
},
{ .key = {"max-file-size"},
.type = GF_OPTION_TYPE_SIZET,
.min = -1,
.max = -1
},
{ .key = {NULL} },
};

View File

@ -141,6 +141,7 @@ struct ioc_cache {
struct ioc_inode {
struct ioc_table *table;
off_t st_size;
struct ioc_cache cache;
struct list_head inode_list; /*
* list of inodes, maintained by
@ -159,6 +160,8 @@ struct ioc_table {
uint64_t page_size;
uint64_t cache_size;
uint64_t cache_used;
int64_t min_file_size;
int64_t max_file_size;
struct list_head inodes; /* list of inodes cached */
struct list_head active;
struct list_head *inode_lru;