summaryrefslogtreecommitdiffstats
path: root/xlators/performance/io-cache
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/performance/io-cache')
-rw-r--r--xlators/performance/io-cache/src/io-cache.c32
-rw-r--r--xlators/performance/io-cache/src/ioc-inode.c67
-rw-r--r--xlators/performance/io-cache/src/page.c138
3 files changed, 172 insertions, 65 deletions
diff --git a/xlators/performance/io-cache/src/io-cache.c b/xlators/performance/io-cache/src/io-cache.c
index be7227e9948..738bd66a2b6 100644
--- a/xlators/performance/io-cache/src/io-cache.c
+++ b/xlators/performance/io-cache/src/io-cache.c
@@ -1826,6 +1826,7 @@ init (xlator_t *this)
char *cache_size_string = NULL, *tmp = NULL;
int32_t ret = -1;
glusterfs_ctx_t *ctx = NULL;
+ data_t *data = 0;
if (!this->children || this->children->next) {
gf_log (this->name, GF_LOG_ERROR,
@@ -1849,9 +1850,10 @@ init (xlator_t *this)
table->page_size = this->ctx->page_size;
table->cache_size = IOC_CACHE_SIZE;
- if (dict_get (options, "cache-size"))
- cache_size_string = data_to_str (dict_get (options,
- "cache-size"));
+ data = dict_get (options, "cache-size");
+ if (data)
+ cache_size_string = data_to_str (data);
+
if (cache_size_string) {
if (gf_string2bytesize (cache_size_string,
&table->cache_size) != 0) {
@@ -1868,10 +1870,9 @@ init (xlator_t *this)
table->cache_timeout = 1;
- if (dict_get (options, "cache-timeout")) {
- table->cache_timeout =
- data_to_uint32 (dict_get (options,
- "cache-timeout"));
+ data = dict_get (options, "cache-timeout");
+ if (data) {
+ table->cache_timeout = data_to_uint32 (data);
gf_log (this->name, GF_LOG_TRACE,
"Using %d seconds to revalidate cache",
table->cache_timeout);
@@ -1879,9 +1880,9 @@ init (xlator_t *this)
INIT_LIST_HEAD (&table->priority_list);
table->max_pri = 1;
- if (dict_get (options, "priority")) {
- char *option_list = data_to_str (dict_get (options,
- "priority"));
+ data = dict_get (options, "priority");
+ if (data) {
+ char *option_list = data_to_str (data);
gf_log (this->name, GF_LOG_TRACE,
"option path %s", option_list);
/* parse the list of pattern:priority */
@@ -1896,7 +1897,10 @@ init (xlator_t *this)
table->min_file_size = 0;
- tmp = data_to_str (dict_get (options, "min-file-size"));
+ data = dict_get (options, "min-file-size");
+ if (data)
+ tmp = data_to_str (data);
+
if (tmp != NULL) {
if (gf_string2bytesize (tmp,
(uint64_t *)&table->min_file_size) != 0) {
@@ -1910,8 +1914,12 @@ init (xlator_t *this)
"using min-file-size %"PRIu64"", table->min_file_size);
}
+ tmp = NULL;
table->max_file_size = -1;
- tmp = data_to_str (dict_get (options, "max-file-size"));
+ data = dict_get (options, "max-file-size");
+ if (data)
+ tmp = data_to_str (data);
+
if (tmp != NULL) {
if (gf_string2bytesize (tmp,
(uint64_t *)&table->max_file_size) != 0) {
diff --git a/xlators/performance/io-cache/src/ioc-inode.c b/xlators/performance/io-cache/src/ioc-inode.c
index 1beb9efd429..e268cac2621 100644
--- a/xlators/performance/io-cache/src/ioc-inode.c
+++ b/xlators/performance/io-cache/src/ioc-inode.c
@@ -36,8 +36,11 @@ void *
str_to_ptr (char *string)
{
void *ptr = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", string, out);
ptr = (void *)strtoul (string, NULL, 16);
+
+out:
return ptr;
}
@@ -52,12 +55,18 @@ ptr_to_str (void *ptr)
{
int ret = 0;
char *str = NULL;
+
+ GF_VALIDATE_OR_GOTO ("io-cache", ptr, out);
+
ret = gf_asprintf (&str, "%p", ptr);
if (-1 == ret) {
- gf_log ("ioc", GF_LOG_ERROR,
+ gf_log ("io-cache", GF_LOG_WARNING,
"asprintf failed while converting ptr to str");
- return NULL;
+ str = NULL;
+ goto out;
}
+
+out:
return str;
}
@@ -73,7 +82,18 @@ ioc_inode_wakeup (call_frame_t *frame, ioc_inode_t *ioc_inode,
int8_t need_fault = 0;
ioc_page_t *waiter_page = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", frame, out);
+
local = frame->local;
+ GF_VALIDATE_OR_GOTO (frame->this->name, local, out);
+
+ if (ioc_inode == NULL) {
+ local->op_ret = -1;
+ local->op_errno = EINVAL;
+ gf_log (frame->this->name, GF_LOG_WARNING, "ioc_inode is NULL");
+ goto out;
+ }
+
ioc_inode_lock (ioc_inode);
{
waiter = ioc_inode->waitq;
@@ -87,7 +107,7 @@ ioc_inode_wakeup (call_frame_t *frame, ioc_inode_t *ioc_inode,
cache_still_valid = 0;
if (!waiter) {
- gf_log (frame->this->name, GF_LOG_DEBUG,
+ gf_log (frame->this->name, GF_LOG_WARNING,
"cache validate called without any "
"page waiting to be validated");
}
@@ -117,8 +137,7 @@ ioc_inode_wakeup (call_frame_t *frame, ioc_inode_t *ioc_inode,
waiter_page->ready = 0;
need_fault = 1;
} else {
- gf_log (frame->this->name,
- GF_LOG_TRACE,
+ gf_log (frame->this->name, GF_LOG_TRACE,
"validate frame(%p) is waiting"
"for in-transit page = %p",
frame, waiter_page);
@@ -141,6 +160,9 @@ ioc_inode_wakeup (call_frame_t *frame, ioc_inode_t *ioc_inode,
waited->data = NULL;
GF_FREE (waited);
}
+
+out:
+ return;
}
@@ -159,6 +181,8 @@ ioc_inode_update (ioc_table_t *table, inode_t *inode, uint32_t weight)
{
ioc_inode_t *ioc_inode = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", table, out);
+
ioc_inode = GF_CALLOC (1, sizeof (ioc_inode_t), gf_ioc_mt_ioc_inode_t);
if (ioc_inode == NULL) {
goto out;
@@ -166,21 +190,20 @@ ioc_inode_update (ioc_table_t *table, inode_t *inode, uint32_t weight)
ioc_inode->table = table;
INIT_LIST_HEAD (&ioc_inode->cache.page_lru);
+ pthread_mutex_init (&ioc_inode->inode_lock, NULL);
+ ioc_inode->weight = weight;
ioc_table_lock (table);
-
- table->inode_count++;
- list_add (&ioc_inode->inode_list, &table->inodes);
- list_add_tail (&ioc_inode->inode_lru, &table->inode_lru[weight]);
-
- gf_log (table->xl->name,
- GF_LOG_TRACE,
- "adding to inode_lru[%d]", weight);
-
+ {
+ table->inode_count++;
+ list_add (&ioc_inode->inode_list, &table->inodes);
+ list_add_tail (&ioc_inode->inode_lru,
+ &table->inode_lru[weight]);
+ }
ioc_table_unlock (table);
- pthread_mutex_init (&ioc_inode->inode_lock, NULL);
- ioc_inode->weight = weight;
+ gf_log (table->xl->name, GF_LOG_TRACE,
+ "adding to inode_lru[%d]", weight);
out:
return ioc_inode;
@@ -199,12 +222,16 @@ ioc_inode_destroy (ioc_inode_t *ioc_inode)
{
ioc_table_t *table = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", ioc_inode, out);
+
table = ioc_inode->table;
ioc_table_lock (table);
- table->inode_count--;
- list_del (&ioc_inode->inode_list);
- list_del (&ioc_inode->inode_lru);
+ {
+ table->inode_count--;
+ list_del (&ioc_inode->inode_list);
+ list_del (&ioc_inode->inode_lru);
+ }
ioc_table_unlock (table);
ioc_inode_flush (ioc_inode);
@@ -212,4 +239,6 @@ ioc_inode_destroy (ioc_inode_t *ioc_inode)
pthread_mutex_destroy (&ioc_inode->inode_lock);
GF_FREE (ioc_inode);
+out:
+ return;
}
diff --git a/xlators/performance/io-cache/src/page.c b/xlators/performance/io-cache/src/page.c
index 38bb98fbc67..b50b245ac0b 100644
--- a/xlators/performance/io-cache/src/page.c
+++ b/xlators/performance/io-cache/src/page.c
@@ -34,9 +34,17 @@
char
ioc_empty (struct ioc_cache *cache)
{
- return list_empty (&cache->page_lru);
+ char is_empty = -1;
+
+ GF_VALIDATE_OR_GOTO ("io-cache", cache, out);
+
+ is_empty = list_empty (&cache->page_lru);
+
+out:
+ return is_empty;
}
+
ioc_page_t *
ioc_page_get (ioc_inode_t *ioc_inode, off_t offset)
{
@@ -44,7 +52,11 @@ ioc_page_get (ioc_inode_t *ioc_inode, off_t offset)
ioc_table_t *table = NULL;
off_t rounded_offset = 0;
+ GF_VALIDATE_OR_GOTO ("io-cache", ioc_inode, out);
+
table = ioc_inode->table;
+ GF_VALIDATE_OR_GOTO ("io-cache", ioc_inode, out);
+
rounded_offset = floor (offset, table->page_size);
page = rbthash_get (ioc_inode->cache.page_table, &rounded_offset,
@@ -55,6 +67,7 @@ ioc_page_get (ioc_inode_t *ioc_inode, off_t offset)
list_move_tail (&page->page_lru, &ioc_inode->cache.page_lru);
}
+out:
return page;
}
@@ -70,6 +83,8 @@ ioc_page_destroy (ioc_page_t *page)
{
int64_t page_size = 0;
+ GF_VALIDATE_OR_GOTO ("io-cache", page, out);
+
page_size = iobref_size (page->iobref);
if (page->waitq) {
@@ -99,6 +114,7 @@ ioc_page_destroy (ioc_page_t *page)
GF_FREE (page);
}
+out:
return page_size;
}
@@ -119,6 +135,8 @@ ioc_prune (ioc_table_t *table)
uint64_t size_to_prune = 0;
uint64_t size_pruned = 0;
+ GF_VALIDATE_OR_GOTO ("io-cache", table, out);
+
ioc_table_lock (table);
{
size_to_prune = table->cache_used - table->cache_size;
@@ -145,8 +163,7 @@ ioc_prune (ioc_table_t *table)
if (ret != -1)
table->cache_used -= ret;
- gf_log (table->xl->name,
- GF_LOG_TRACE,
+ gf_log (table->xl->name, GF_LOG_TRACE,
"index = %d && table->cache_"
"used = %"PRIu64" && table->"
"cache_size = %"PRIu64,
@@ -156,6 +173,7 @@ ioc_prune (ioc_table_t *table)
if (size_pruned >= size_to_prune)
break;
} /* list_for_each_entry_safe(page...) */
+
if (ioc_empty (&curr->cache)) {
list_del_init (&curr->inode_lru);
}
@@ -174,6 +192,7 @@ ioc_prune (ioc_table_t *table)
} /* ioc_inode_table locked region end */
ioc_table_unlock (table);
+out:
return 0;
}
@@ -192,7 +211,11 @@ ioc_page_create (ioc_inode_t *ioc_inode, off_t offset)
off_t rounded_offset = 0;
ioc_page_t *newpage = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", ioc_inode, out);
+
table = ioc_inode->table;
+ GF_VALIDATE_OR_GOTO ("io-cache", table, out);
+
rounded_offset = floor (offset, table->page_size);
newpage = GF_CALLOC (1, sizeof (*newpage), gf_ioc_mt_ioc_newpage_t);
@@ -240,13 +263,22 @@ ioc_wait_on_page (ioc_page_t *page, call_frame_t *frame, off_t offset,
ioc_waitq_t *waitq = NULL;
ioc_local_t *local = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", frame, out);
local = frame->local;
+ GF_VALIDATE_OR_GOTO (frame->this->name, local, out);
+
+ if (page == NULL) {
+ local->op_ret = -1;
+ local->op_errno = ENOMEM;
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "asked to wait on a NULL page");
+ }
+
waitq = GF_CALLOC (1, sizeof (*waitq), gf_ioc_mt_ioc_waitq_t);
if (waitq == NULL) {
local->op_ret = -1;
local->op_errno = ENOMEM;
- gf_log (frame->this->name, GF_LOG_ERROR, "out of memory");
goto out;
}
@@ -287,6 +319,8 @@ ioc_cache_still_valid (ioc_inode_t *ioc_inode, struct iatt *stbuf)
{
int8_t cache_still_valid = 1;
+ GF_VALIDATE_OR_GOTO ("io-cache", ioc_inode, out);
+
#if 0
if (!stbuf || (stbuf->ia_mtime != ioc_inode->cache.mtime) ||
(stbuf->st_mtim.tv_nsec != ioc_inode->stbuf.st_mtim.tv_nsec))
@@ -307,6 +341,7 @@ ioc_cache_still_valid (ioc_inode_t *ioc_inode, struct iatt *stbuf)
}
#endif
+out:
return cache_still_valid;
}
@@ -344,19 +379,25 @@ ioc_fault_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
size_t iobref_page_size = 0;
char zero_filled = 0;
+ GF_ASSERT (frame);
+
local = frame->local;
+ GF_ASSERT (local);
+
offset = local->pending_offset;
ioc_inode = local->inode;
+ GF_ASSERT (ioc_inode);
+
table = ioc_inode->table;
+ GF_ASSERT (table);
- zero_filled = ((op_ret >=0)
- && (stbuf->ia_mtime == 0));
+ zero_filled = ((op_ret >=0) && (stbuf->ia_mtime == 0));
ioc_inode_lock (ioc_inode);
{
- if (op_ret == -1 ||
- !(zero_filled ||
- ioc_cache_still_valid(ioc_inode, stbuf))) {
+ if (op_ret == -1 || !(zero_filled ||
+ ioc_cache_still_valid(ioc_inode,
+ stbuf))) {
gf_log (ioc_inode->table->xl->name, GF_LOG_TRACE,
"cache for inode(%p) is invalid. flushing "
"all pages", ioc_inode);
@@ -383,7 +424,7 @@ ioc_fault_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (!page) {
/* page was flushed */
/* some serious bug ? */
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (frame->this->name, GF_LOG_WARNING,
"wasted copy: %"PRId64"[+%"PRId64"] "
"ioc_inode=%p", offset,
table->page_size, ioc_inode);
@@ -411,7 +452,8 @@ ioc_fault_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
} else {
/* TODO: we have got a response to
* our request and no data */
- gf_log (this->name, GF_LOG_CRITICAL,
+ gf_log (frame->this->name,
+ GF_LOG_CRITICAL,
"frame>root>rsp_refs is null");
} /* if(frame->root->rsp_refs) */
@@ -461,7 +503,8 @@ unlock:
ioc_prune (ioc_inode->table);
}
- gf_log (this->name, GF_LOG_TRACE, "fault frame %p returned", frame);
+ gf_log (frame->this->name, GF_LOG_TRACE, "fault frame %p returned",
+ frame);
pthread_mutex_destroy (&local->local_lock);
fd_unref (local->fd);
@@ -470,6 +513,7 @@ unlock:
return 0;
}
+
/*
* ioc_page_fault -
*
@@ -490,13 +534,20 @@ ioc_page_fault (ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,
ioc_waitq_t *waitq = NULL;
ioc_page_t *page = NULL;
+ GF_ASSERT (ioc_inode);
+ if (frame == NULL) {
+ op_ret = -1;
+ op_errno = EINVAL;
+ gf_log ("io-cache", GF_LOG_WARNING,
+ "page fault on a NULL frame");
+ goto err;
+ }
+
table = ioc_inode->table;
fault_frame = copy_frame (frame);
if (fault_frame == NULL) {
op_ret = -1;
op_errno = ENOMEM;
- gf_log (ioc_inode->table->xl->name, GF_LOG_ERROR,
- "out of memory");
goto err;
}
@@ -506,8 +557,6 @@ ioc_page_fault (ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,
op_ret = -1;
op_errno = ENOMEM;
STACK_DESTROY (fault_frame->root);
- gf_log (ioc_inode->table->xl->name, GF_LOG_ERROR,
- "out of memory");
goto err;
}
@@ -543,6 +592,7 @@ err:
}
}
+
int32_t
ioc_frame_fill (ioc_page_t *page, call_frame_t *frame, off_t offset,
size_t size)
@@ -555,9 +605,21 @@ ioc_frame_fill (ioc_page_t *page, call_frame_t *frame, off_t offset,
ioc_inode_t *ioc_inode = NULL;
ioc_fill_t *new = NULL;
int8_t found = 0;
- int32_t ret = 0;
+ int32_t ret = -1;
+
+ GF_VALIDATE_OR_GOTO ("io-cache", frame, out);
local = frame->local;
+ GF_VALIDATE_OR_GOTO (frame->this->name, local, out);
+
+ if (page == NULL) {
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "NULL page has been provided to serve read request");
+ local->op_ret = -1;
+ local->op_errno = EINVAL;
+ goto out;
+ }
+
ioc_inode = page->inode;
gf_log (frame->this->name, GF_LOG_TRACE,
@@ -602,17 +664,13 @@ ioc_frame_fill (ioc_page_t *page, call_frame_t *frame, off_t offset,
if (new == NULL) {
local->op_ret = -1;
local->op_errno = ENOMEM;
- ret = -1;
- gf_log (page->inode->table->xl->name,
- GF_LOG_ERROR, "out of memory");
goto out;
}
new->offset = page->offset;
new->size = copy_size;
new->iobref = iobref_ref (page->iobref);
- new->count = iov_subset (page->vector,
- page->count,
+ new->count = iov_subset (page->vector, page->count,
src_offset,
src_offset + copy_size,
NULL);
@@ -626,21 +684,14 @@ ioc_frame_fill (ioc_page_t *page, call_frame_t *frame, off_t offset,
iobref_unref (new->iobref);
GF_FREE (new);
-
- ret = -1;
- gf_log (page->inode->table->xl->name,
- GF_LOG_ERROR, "out of memory");
goto out;
}
- new->count = iov_subset (page->vector,
- page->count,
+ new->count = iov_subset (page->vector, page->count,
src_offset,
src_offset + copy_size,
new->vector);
-
-
/* add the ioc_fill to fill_list for this frame */
if (list_empty (&local->fill_list)) {
/* if list is empty, then this is the first
@@ -671,6 +722,7 @@ ioc_frame_fill (ioc_page_t *page, call_frame_t *frame, off_t offset,
local->op_ret += copy_size;
}
+ ret = 0;
out:
return ret;
}
@@ -696,13 +748,23 @@ ioc_frame_unwind (call_frame_t *frame)
struct iatt stbuf = {0,};
int32_t op_ret = 0;
+ GF_ASSERT (frame);
+
local = frame->local;
+ if (local == NULL) {
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "local is NULL");
+ op_ret = -1;
+ local->op_errno = ENOMEM;
+ goto unwind;
+ }
+
// ioc_local_lock (local);
frame->local = NULL;
iobref = iobref_new ();
if (iobref == NULL) {
op_ret = -1;
- gf_log (frame->this->name, GF_LOG_ERROR, "out of memory");
+ local->op_errno = ENOMEM;
}
if (list_empty (&local->fill_list)) {
@@ -719,8 +781,7 @@ ioc_frame_unwind (call_frame_t *frame)
vector = GF_CALLOC (count, sizeof (*vector), gf_ioc_mt_iovec);
if (vector == NULL) {
op_ret = -1;
-
- gf_log (frame->this->name, GF_LOG_ERROR, "out of memory");
+ local->op_errno = ENOMEM;
}
list_for_each_entry_safe (fill, next, &local->fill_list, list) {
@@ -744,6 +805,7 @@ ioc_frame_unwind (call_frame_t *frame)
op_ret = iov_length (vector, count);
}
+unwind:
gf_log (frame->this->name, GF_LOG_TRACE,
"frame(%p) unwinding with op_ret=%d", frame, op_ret);
@@ -779,6 +841,8 @@ ioc_frame_return (call_frame_t *frame)
ioc_local_t *local = NULL;
int32_t wait_count = 0;
+ GF_ASSERT (frame);
+
local = frame->local;
GF_ASSERT (local->wait_count > 0);
@@ -808,6 +872,8 @@ ioc_page_wakeup (ioc_page_t *page)
call_frame_t *frame = NULL;
int32_t ret = -1;
+ GF_VALIDATE_OR_GOTO ("io-cache", page, out);
+
waitq = page->waitq;
page->waitq = NULL;
@@ -825,6 +891,7 @@ ioc_page_wakeup (ioc_page_t *page)
}
}
+out:
return waitq;
}
@@ -845,10 +912,12 @@ ioc_page_error (ioc_page_t *page, int32_t op_ret, int32_t op_errno)
ioc_table_t *table = NULL;
ioc_local_t *local = NULL;
+ GF_VALIDATE_OR_GOTO ("io-cache", page, out);
+
waitq = page->waitq;
page->waitq = NULL;
- gf_log (page->inode->table->xl->name, GF_LOG_DEBUG,
+ gf_log (page->inode->table->xl->name, GF_LOG_WARNING,
"page error for page = %p & waitq = %p", page, waitq);
for (trav = waitq; trav; trav = trav->next) {
@@ -873,5 +942,6 @@ ioc_page_error (ioc_page_t *page, int32_t op_ret, int32_t op_errno)
table->cache_used -= ret;
}
+out:
return waitq;
}