summaryrefslogtreecommitdiffstats
path: root/xlators/performance
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/performance')
-rw-r--r--xlators/performance/write-behind/src/write-behind.c715
1 files changed, 453 insertions, 262 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c
index ece77e5c741..61d4c316cff 100644
--- a/xlators/performance/write-behind/src/write-behind.c
+++ b/xlators/performance/write-behind/src/write-behind.c
@@ -135,8 +135,10 @@ __wb_request_unref (wb_request_t *this)
{
int ret = -1;
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
+
if (this->refcount <= 0) {
- gf_log ("wb-request", GF_LOG_DEBUG,
+ gf_log ("wb-request", GF_LOG_WARNING,
"refcount(%d) is <= 0", this->refcount);
goto out;
}
@@ -160,15 +162,12 @@ static int
wb_request_unref (wb_request_t *this)
{
wb_file_t *file = NULL;
- int ret = 0;
+ int ret = -1;
- if (this == NULL) {
- gf_log ("wb-request", GF_LOG_DEBUG,
- "request is NULL");
- goto out;
- }
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
file = this->file;
+
LOCK (&file->lock);
{
ret = __wb_request_unref (this);
@@ -183,13 +182,18 @@ out:
static wb_request_t *
__wb_request_ref (wb_request_t *this)
{
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
+
if (this->refcount < 0) {
- gf_log ("wb-request", GF_LOG_DEBUG,
+ gf_log ("wb-request", GF_LOG_WARNING,
"refcount(%d) is < 0", this->refcount);
- return NULL;
+ this = NULL;
+ goto out;
}
this->refcount++;
+
+out:
return this;
}
@@ -199,11 +203,7 @@ wb_request_ref (wb_request_t *this)
{
wb_file_t *file = NULL;
- if (this == NULL) {
- gf_log ("wb-request", GF_LOG_DEBUG,
- "request is NULL");
- return NULL;
- }
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
file = this->file;
LOCK (&file->lock);
@@ -212,6 +212,7 @@ wb_request_ref (wb_request_t *this)
}
UNLOCK (&file->lock);
+out:
return this;
}
@@ -225,6 +226,9 @@ wb_enqueue (wb_file_t *file, call_stub_t *stub)
struct iovec *vector = NULL;
int32_t count = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", file, out);
+ GF_VALIDATE_OR_GOTO (file->this->name, stub, out);
+
request = GF_CALLOC (1, sizeof (*request), gf_wb_mt_wb_request_t);
if (request == NULL) {
goto out;
@@ -294,6 +298,9 @@ wb_file_create (xlator_t *this, fd_t *fd, int32_t flags)
wb_file_t *file = NULL;
wb_conf_t *conf = NULL;
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
+ GF_VALIDATE_OR_GOTO (this->name, fd, out);
+
conf = this->private;
file = GF_CALLOC (1, sizeof (*file), gf_wb_mt_wb_file_t);
@@ -327,6 +334,8 @@ wb_file_destroy (wb_file_t *file)
{
int32_t refcount = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", file, out);
+
LOCK (&file->lock);
{
refcount = --file->refcount;
@@ -338,6 +347,7 @@ wb_file_destroy (wb_file_t *file)
GF_FREE (file);
}
+out:
return;
}
@@ -354,9 +364,14 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t ret = -1;
fd_t *fd = NULL;
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
local = frame->local;
winds = &local->winds;
+
file = local->file;
+ GF_VALIDATE_OR_GOTO (this->name, file, out);
LOCK (&file->lock);
{
@@ -386,13 +401,18 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
UNLOCK (&file->lock);
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- LOCK (&file->lock);
- {
- file->op_ret = -1;
- file->op_errno = ENOMEM;
+ if (ret == -1) {
+ if (errno == ENOMEM) {
+ LOCK (&file->lock);
+ {
+ file->op_ret = -1;
+ file->op_errno = ENOMEM;
+ }
+ UNLOCK (&file->lock);
}
- UNLOCK (&file->lock);
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
/* safe place to do fd_unref */
@@ -400,6 +420,7 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
STACK_DESTROY (frame->root);
+out:
return 0;
}
@@ -421,10 +442,13 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
fd_t *fd = NULL;
int32_t op_errno = -1;
- if (frame == NULL) {
- op_errno = EINVAL;
- goto out;
- }
+ GF_VALIDATE_OR_GOTO_WITH_ERROR ((file ? file->this->name
+ : "write-behind"), frame,
+ out, bytes, -1);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, file, out, bytes,
+ -1);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, winds, out, bytes,
+ -1);
conf = file->this->private;
list_for_each_entry (request, winds, winds) {
@@ -447,8 +471,6 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
if (vector == NULL) {
bytes = -1;
op_errno = ENOMEM;
- gf_log (file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
@@ -456,8 +478,6 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
if (iobref == NULL) {
bytes = -1;
op_errno = ENOMEM;
- gf_log (file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
@@ -466,8 +486,6 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
if (local == NULL) {
bytes = -1;
op_errno = ENOMEM;
- gf_log (file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
@@ -504,14 +522,12 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
|| ((count + next->stub->args.writev.count)
> MAX_VECTOR_COUNT)
|| ((current_size + next->write_size)
- > conf->aggregate_size))
- {
+ > conf->aggregate_size)) {
+
sync_frame = copy_frame (frame);
if (sync_frame == NULL) {
bytes = -1;
op_errno = ENOMEM;
- gf_log (file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
@@ -609,6 +625,9 @@ wb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t ret = -1;
fd_t *fd = NULL;
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
local = frame->local;
file = local->file;
@@ -629,13 +648,18 @@ wb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
if (process_frame != NULL) {
ret = wb_process_queue (process_frame, file);
- if ((ret == -1) && (errno == ENOMEM) && (file != NULL)) {
- LOCK (&file->lock);
- {
- file->op_ret = -1;
- file->op_errno = ENOMEM;
+ if (ret == -1) {
+ if ((errno == ENOMEM) && (file != NULL)) {
+ LOCK (&file->lock);
+ {
+ file->op_ret = -1;
+ file->op_errno = ENOMEM;
+ }
+ UNLOCK (&file->lock);
}
- UNLOCK (&file->lock);
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
STACK_DESTROY (process_frame->root);
@@ -658,6 +682,9 @@ wb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
static int32_t
wb_stat_helper (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
STACK_WIND (frame, wb_stat_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->stat, loc);
return 0;
@@ -675,6 +702,10 @@ wb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
wb_request_t *request = NULL;
int32_t ret = -1, op_errno = EINVAL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, loc, unwind);
+
if (loc->inode) {
/* FIXME: fd_lookup extends life of fd till stat returns */
iter_fd = fd_lookup (loc->inode, frame->root->pid);
@@ -688,8 +719,7 @@ wb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
}
}
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
op_errno = ENOMEM;
goto unwind;
@@ -713,11 +743,10 @@ wb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
-
} else {
STACK_WIND (frame, wb_stat_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->stat, loc);
@@ -748,6 +777,8 @@ wb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_file_t *file = NULL;
int32_t ret = -1;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
@@ -755,9 +786,14 @@ wb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
if ((file != NULL) && (request != NULL)) {
wb_request_unref (request);
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_ret = -1;
- op_errno = ENOMEM;
+ if (ret == -1) {
+ if (errno == ENOMEM) {
+ op_ret = -1;
+ op_errno = ENOMEM;
+ }
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
}
@@ -770,6 +806,9 @@ wb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t
wb_fstat_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
{
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
STACK_WIND (frame, wb_fstat_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->fstat, fd);
return 0;
@@ -787,22 +826,26 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
int32_t ret = -1;
int op_errno = EINVAL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, fd, unwind);
+
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
-
- STACK_UNWIND_STRICT (fstat, frame, -1, EBADFD, NULL);
- return 0;
+ op_errno = EBADFD;
+ goto unwind;
}
file = (wb_file_t *)(long)tmp_file;
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (fstat, frame, -1, ENOMEM, NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
local->file = file;
@@ -826,9 +869,9 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
FIXME:should the request queue be emptied in case of error?
*/
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
STACK_WIND (frame, wb_fstat_cbk, FIRST_CHILD(this),
@@ -836,6 +879,7 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
}
return 0;
+
unwind:
STACK_UNWIND_STRICT (fstat, frame, -1, op_errno, NULL);
@@ -859,6 +903,8 @@ wb_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t ret = -1;
fd_t *fd = NULL;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
request = local->request;
@@ -880,13 +926,18 @@ wb_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (process_frame != NULL) {
ret = wb_process_queue (process_frame, file);
- if ((ret == -1) && (errno == ENOMEM) && (file != NULL)) {
- LOCK (&file->lock);
- {
- file->op_ret = -1;
- file->op_errno = ENOMEM;
+ if (ret == -1) {
+ if ((errno == ENOMEM) && (file != NULL)) {
+ LOCK (&file->lock);
+ {
+ file->op_ret = -1;
+ file->op_errno = ENOMEM;
+ }
+ UNLOCK (&file->lock);
}
- UNLOCK (&file->lock);
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
STACK_DESTROY (process_frame->root);
@@ -910,6 +961,9 @@ static int32_t
wb_truncate_helper (call_frame_t *frame, xlator_t *this, loc_t *loc,
off_t offset)
{
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
STACK_WIND (frame, wb_truncate_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->truncate, loc, offset);
@@ -926,7 +980,11 @@ wb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
uint64_t tmp_file = 0;
call_stub_t *stub = NULL;
wb_request_t *request = NULL;
- int32_t ret = -1, op_errno = ENOMEM;
+ int32_t ret = -1, op_errno = EINVAL;
+
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, loc, unwind);
if (loc->inode) {
/*
@@ -968,9 +1026,9 @@ wb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
STACK_WIND (frame, wb_truncate_cbk, FIRST_CHILD(this),
@@ -1000,6 +1058,8 @@ wb_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
wb_file_t *file = NULL;
int32_t ret = -1;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
request = local->request;
@@ -1007,9 +1067,14 @@ wb_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if ((request != NULL) && (file != NULL)) {
wb_request_unref (request);
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_ret = -1;
- op_errno = ENOMEM;
+ if (ret == -1) {
+ if (errno == ENOMEM) {
+ op_ret = -1;
+ op_errno = ENOMEM;
+ }
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
}
@@ -1024,6 +1089,9 @@ static int32_t
wb_ftruncate_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,
off_t offset)
{
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
STACK_WIND (frame, wb_ftruncate_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->ftruncate, fd, offset);
return 0;
@@ -1041,23 +1109,26 @@ wb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
int32_t ret = -1;
int op_errno = EINVAL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, fd, unwind);
+
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
-
- STACK_UNWIND_STRICT (ftruncate, frame, -1, EBADFD, NULL, NULL);
- return 0;
+ op_errno = EBADFD;
+ goto unwind;
}
file = (wb_file_t *)(long)tmp_file;
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM, NULL, NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
local->file = file;
@@ -1079,9 +1150,9 @@ wb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
STACK_WIND (frame, wb_ftruncate_cbk, FIRST_CHILD(this),
@@ -1113,6 +1184,8 @@ wb_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t ret = -1;
fd_t *fd = NULL;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
request = local->request;
@@ -1134,13 +1207,18 @@ wb_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (request && (process_frame != NULL)) {
ret = wb_process_queue (process_frame, file);
- if ((ret == -1) && (errno == ENOMEM) && (file != NULL)) {
- LOCK (&file->lock);
- {
- file->op_ret = -1;
- file->op_errno = ENOMEM;
+ if (ret == -1) {
+ if ((errno == ENOMEM) && (file != NULL)) {
+ LOCK (&file->lock);
+ {
+ file->op_ret = -1;
+ file->op_errno = ENOMEM;
+ }
+ UNLOCK (&file->lock);
}
- UNLOCK (&file->lock);
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
STACK_DESTROY (process_frame->root);
@@ -1164,6 +1242,9 @@ static int32_t
wb_setattr_helper (call_frame_t *frame, xlator_t *this, loc_t *loc,
struct iatt *stbuf, int32_t valid)
{
+ GF_ASSERT (frame);
+ GF_ASSERT (this);
+
STACK_WIND (frame, wb_setattr_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->setattr, loc, stbuf, valid);
return 0;
@@ -1182,14 +1263,16 @@ wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
wb_request_t *request = NULL;
int32_t ret = -1, op_errno = EINVAL;
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, loc, unwind);
+
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
op_errno = ENOMEM;
goto unwind;
}
-
frame->local = local;
if (!(valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME))) {
@@ -1232,9 +1315,9 @@ wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
STACK_WIND (frame, wb_setattr_cbk, FIRST_CHILD(this),
@@ -1263,14 +1346,15 @@ wb_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_conf_t *conf = NULL;
wb_local_t *local = NULL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, out, op_errno,
+ EINVAL);
+
conf = this->private;
local = frame->local;
- if (local == NULL) {
- op_ret = -1;
- op_errno = EINVAL;
- goto out;
- }
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (this->name, local, out, op_errno,
+ EINVAL);
flags = local->flags;
wbflags = local->wbflags;
@@ -1311,8 +1395,7 @@ wb_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
wb_local_t *local = NULL;
int32_t op_errno = EINVAL;
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
op_errno = ENOMEM;
goto unwind;
@@ -1343,6 +1426,10 @@ wb_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
wb_file_t *file = NULL;
wb_conf_t *conf = NULL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, out,
+ op_errno, EINVAL);
+
conf = this->private;
if (op_ret != -1) {
if (frame->local) {
@@ -1382,12 +1469,24 @@ int32_t
wb_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
mode_t mode, fd_t *fd, dict_t *params)
{
+ int32_t op_errno = EINVAL;
+
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO (frame->this->name, this, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, fd, unwind);
+ GF_VALIDATE_OR_GOTO (frame->this->name, loc, unwind);
+
frame->local = (void *)(long)flags;
STACK_WIND (frame, wb_create_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->create,
loc, flags, mode, fd, params);
return 0;
+
+unwind:
+ STACK_UNWIND_STRICT (create, frame, -1, op_errno, NULL, NULL, NULL,
+ NULL, NULL);
+ return 0;
}
@@ -1406,6 +1505,10 @@ __wb_mark_wind_all (wb_file_t *file, list_head_t *list, list_head_t *winds)
wb_conf_t *conf = NULL;
int count = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", file, out);
+ GF_VALIDATE_OR_GOTO (file->this->name, list, out);
+ GF_VALIDATE_OR_GOTO (file->this->name, winds, out);
+
conf = file->this->private;
list_for_each_entry (request, list, list)
@@ -1444,11 +1547,12 @@ __wb_mark_wind_all (wb_file_t *file, list_head_t *list, list_head_t *winds)
}
}
+out:
return size;
}
-void
+int32_t
__wb_can_wind (list_head_t *list, char *other_fop_in_queue,
char *non_contiguous_writes, char *incomplete_writes,
char *wind_all)
@@ -1456,6 +1560,9 @@ __wb_can_wind (list_head_t *list, char *other_fop_in_queue,
wb_request_t *request = NULL;
char first_request = 1;
off_t offset_expected = 0;
+ int32_t ret = -1;
+
+ GF_VALIDATE_OR_GOTO ("write-behind", list, out);
list_for_each_entry (request, list, list)
{
@@ -1498,7 +1605,9 @@ __wb_can_wind (list_head_t *list, char *other_fop_in_queue,
}
}
- return;
+ ret = 0;
+out:
+ return ret;
}
@@ -1513,6 +1622,10 @@ __wb_mark_winds (list_head_t *list, list_head_t *winds, size_t aggregate_conf,
wb_request_t *request = NULL;
wb_file_t *file = NULL;
char wind_all = 0;
+ int32_t ret = 0;
+
+ GF_VALIDATE_OR_GOTO ("write-behind", list, out);
+ GF_VALIDATE_OR_GOTO ("write-behind", winds, out);
if (list_empty (list)) {
goto out;
@@ -1521,8 +1634,14 @@ __wb_mark_winds (list_head_t *list, list_head_t *winds, size_t aggregate_conf,
request = list_entry (list->next, typeof (*request), list);
file = request->file;
- __wb_can_wind (list, &other_fop_in_queue,
- &non_contiguous_writes, &incomplete_writes, &wind_all);
+ ret = __wb_can_wind (list, &other_fop_in_queue,
+ &non_contiguous_writes, &incomplete_writes,
+ &wind_all);
+ if (ret == -1) {
+ gf_log (file->this->name, GF_LOG_WARNING,
+ "cannot decide whether to wind or not");
+ goto out;
+ }
if (!incomplete_writes && ((enable_trickling_writes)
|| (wind_all) || (non_contiguous_writes)
@@ -1585,6 +1704,9 @@ __wb_mark_unwinds (list_head_t *list, list_head_t *unwinds)
wb_request_t *request = NULL;
wb_file_t *file = NULL;
+ GF_VALIDATE_OR_GOTO ("write-behind", list, out);
+ GF_VALIDATE_OR_GOTO ("write-behind", unwinds, out);
+
if (list_empty (list)) {
goto out;
}
@@ -1609,6 +1731,9 @@ __wb_get_other_requests (list_head_t *list, list_head_t *other_requests)
wb_request_t *request = NULL;
uint32_t count = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", list, out);
+ GF_VALIDATE_OR_GOTO ("write-behind", other_requests, out);
+
list_for_each_entry (request, list, list) {
if ((request->stub == NULL)
|| (request->stub->fop == GF_FOP_WRITE)) {
@@ -1623,6 +1748,7 @@ __wb_get_other_requests (list_head_t *list, list_head_t *other_requests)
}
}
+out:
return count;
}
@@ -1636,6 +1762,8 @@ wb_stack_unwind (list_head_t *unwinds)
wb_local_t *local = NULL;
int ret = 0, write_requests_removed = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", unwinds, out);
+
list_for_each_entry_safe (request, dummy, unwinds, unwinds) {
frame = request->stub->frame;
local = frame->local;
@@ -1649,6 +1777,7 @@ wb_stack_unwind (list_head_t *unwinds)
}
}
+out:
return write_requests_removed;
}
@@ -1657,13 +1786,19 @@ int32_t
wb_resume_other_requests (call_frame_t *frame, wb_file_t *file,
list_head_t *other_requests)
{
- int32_t ret = 0;
+ int32_t ret = -1;
wb_request_t *request = NULL, *dummy = NULL;
int32_t fops_removed = 0;
char wind = 0;
call_stub_t *stub = NULL;
+ GF_VALIDATE_OR_GOTO ((file ? file->this->name : "write-behind"), frame,
+ out);
+ GF_VALIDATE_OR_GOTO (frame->this->name, file, out);
+ GF_VALIDATE_OR_GOTO (frame->this->name, other_requests, out);
+
if (list_empty (other_requests)) {
+ ret = 0;
goto out;
}
@@ -1686,8 +1821,14 @@ wb_resume_other_requests (call_frame_t *frame, wb_file_t *file,
call_resume (stub);
}
+ ret = 0;
+
if (fops_removed > 0) {
ret = wb_process_queue (frame, file);
+ if (ret == -1) {
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "request queue processing failed");
+ }
}
out:
@@ -1701,16 +1842,25 @@ wb_do_ops (call_frame_t *frame, wb_file_t *file, list_head_t *winds,
{
int32_t ret = -1, write_requests_removed = 0;
+ GF_VALIDATE_OR_GOTO ((file ? file->this->name : "write-behind"),
+ frame, out);
+ GF_VALIDATE_OR_GOTO (frame->this->name, file, out);
+
ret = wb_stack_unwind (unwinds);
write_requests_removed = ret;
ret = wb_sync (frame, file, winds);
if (ret == -1) {
- goto out;
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "syncing of write requests failed");
}
- wb_resume_other_requests (frame, file, other_requests);
+ ret = wb_resume_other_requests (frame, file, other_requests);
+ if (ret == -1) {
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "cannot resume non-write requests in request queue");
+ }
/* wb_stack_unwind does wb_request_unref after unwinding a write
* request. Hence if a write-request was just freed in wb_stack_unwind,
@@ -1719,6 +1869,10 @@ wb_do_ops (call_frame_t *frame, wb_file_t *file, list_head_t *winds,
*/
if (write_requests_removed > 0) {
ret = wb_process_queue (frame, file);
+ if (ret == -1) {
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "request queue processing failed");
+ }
}
out:
@@ -1737,16 +1891,12 @@ __wb_copy_into_holder (wb_request_t *holder, wb_request_t *request)
if (holder->flags.write_request.virgin) {
iobuf = iobuf_get (request->file->this->ctx->iobuf_pool);
if (iobuf == NULL) {
- gf_log (request->file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
iobref = iobref_new ();
if (iobref == NULL) {
iobuf_unref (iobuf);
- gf_log (request->file->this->name, GF_LOG_ERROR,
- "out of memory");
goto out;
}
@@ -1754,7 +1904,7 @@ __wb_copy_into_holder (wb_request_t *holder, wb_request_t *request)
if (ret != 0) {
iobuf_unref (iobuf);
iobref_unref (iobref);
- gf_log (request->file->this->name, GF_LOG_DEBUG,
+ gf_log (request->file->this->name, GF_LOG_WARNING,
"cannot add iobuf (%p) into iobref (%p)",
iobuf, iobref);
goto out;
@@ -1774,8 +1924,7 @@ __wb_copy_into_holder (wb_request_t *holder, wb_request_t *request)
ptr = holder->stub->args.writev.vector[0].iov_base + holder->write_size;
- iov_unload (ptr,
- request->stub->args.writev.vector,
+ iov_unload (ptr, request->stub->args.writev.vector,
request->stub->args.writev.count);
holder->stub->args.writev.vector[0].iov_len += request->write_size;
@@ -1799,6 +1948,8 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size)
wb_request_t *request = NULL, *tmp = NULL, *holder = NULL;
int ret = 0;
+ GF_VALIDATE_OR_GOTO ("write-behind", requests, out);
+
list_for_each_entry_safe (request, tmp, requests, list) {
if ((request->stub == NULL)
|| (request->stub->fop != GF_FOP_WRITE)
@@ -1838,6 +1989,7 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size)
}
}
+out:
return;
}
@@ -1855,12 +2007,13 @@ wb_process_queue (call_frame_t *frame, wb_file_t *file)
INIT_LIST_HEAD (&unwinds);
INIT_LIST_HEAD (&other_requests);
- if (file == NULL) {
- errno = EINVAL;
- goto out;
- }
+ GF_VALIDATE_OR_GOTO ((file ? file->this->name : "write-behind"), frame,
+ out);
+ GF_VALIDATE_OR_GOTO (file->this->name, frame, out);
conf = file->this->private;
+ GF_VALIDATE_OR_GOTO (file->this->name, conf, out);
+
size = conf->aggregate_size;
LOCK (&file->lock);
{
@@ -1898,6 +2051,8 @@ wb_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
struct iatt *postbuf)
{
+ GF_ASSERT (frame);
+
STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -1918,12 +2073,20 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
int32_t ret = -1;
int32_t op_ret = -1, op_errno = EINVAL;
+ GF_ASSERT (frame);
+
+ GF_VALIDATE_OR_GOTO_WITH_ERROR ("write-behind", this, unwind, op_errno,
+ EINVAL);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (this->name, fd, unwind, op_errno,
+ EINVAL);
+
if (vector != NULL)
size = iov_length (vector, count);
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
@@ -1933,7 +2096,7 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
file = (wb_file_t *)(long)tmp_file;
if ((!IA_ISDIR (fd->inode->ia_type)) && (file == NULL)) {
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (this->name, GF_LOG_WARNING,
"wb_file not found for fd %p", fd);
op_errno = EBADFD;
goto unwind;
@@ -1986,14 +2149,12 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
if (local == NULL) {
op_errno = ENOMEM;
goto unwind;
- return 0;
}
frame->local = local;
local->file = file;
- stub = fop_writev_stub (frame, NULL, fd, vector, count, offset,
- iobref);
+ stub = fop_writev_stub (frame, NULL, fd, vector, count, offset, iobref);
if (stub == NULL) {
op_errno = ENOMEM;
goto unwind;
@@ -2006,9 +2167,9 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
}
ret = wb_process_queue (process_frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_errno = ENOMEM;
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
STACK_DESTROY (process_frame->root);
@@ -2040,6 +2201,8 @@ wb_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_request_t *request = NULL;
int32_t ret = 0;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
request = local->request;
@@ -2048,9 +2211,14 @@ wb_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_request_unref (request);
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_ret = -1;
- op_errno = ENOMEM;
+ if (ret == -1) {
+ if (errno == ENOMEM) {
+ op_ret = -1;
+ op_errno = ENOMEM;
+ }
+
+ gf_log (frame->this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
}
@@ -2080,27 +2248,31 @@ wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
wb_local_t *local = NULL;
uint64_t tmp_file = 0;
call_stub_t *stub = NULL;
- int32_t ret = -1;
+ int32_t ret = -1, op_errno = 0;
wb_request_t *request = NULL;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, unwind,
+ op_errno, EINVAL);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (this->name, fd, unwind, op_errno,
+ EINVAL);
+
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
-
- STACK_UNWIND_STRICT (readv, frame, -1, EBADFD, NULL, 0, NULL,
- NULL);
- return 0;
+ op_errno = EBADFD;
+ goto unwind;
}
file = (wb_file_t *)(long)tmp_file;
local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0, NULL,
- NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
local->file = file;
@@ -2110,27 +2282,22 @@ wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
stub = fop_readv_stub (frame, wb_readv_helper, fd, size,
offset);
if (stub == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
- NULL, NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
request = wb_enqueue (file, stub);
if (request == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
- NULL, NULL);
call_stub_destroy (stub);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
- NULL, NULL);
- call_stub_destroy (stub);
- return 0;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
-
} else {
STACK_WIND (frame, wb_readv_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->readv,
@@ -2138,6 +2305,10 @@ wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
}
return 0;
+
+unwind:
+ STACK_UNWIND_STRICT (readv, frame, -1, op_errno, NULL, 0, NULL, NULL);
+ return 0;
}
@@ -2157,6 +2328,8 @@ wb_ffr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_local_t *local = NULL;
wb_file_t *file = NULL;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
@@ -2188,6 +2361,10 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
call_frame_t *flush_frame = NULL, *process_frame = NULL;
int32_t op_ret = -1, op_errno = -1, ret = -1;
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, unwind,
+ op_errno, EINVAL);
+
conf = this->private;
local = frame->local;
@@ -2203,7 +2380,7 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
if (local && local->request) {
process_frame = copy_frame (frame);
if (process_frame == NULL) {
- gf_log (this->name, GF_LOG_ERROR, "out of memory");
+ op_errno = ENOMEM;
goto unwind;
}
@@ -2213,7 +2390,7 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
if (conf->flush_behind) {
flush_frame = copy_frame (frame);
if (flush_frame == NULL) {
- gf_log (this->name, GF_LOG_ERROR, "out of memory");
+ op_errno = ENOMEM;
goto unwind;
}
@@ -2226,9 +2403,9 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
if (process_frame != NULL) {
ret = wb_process_queue (process_frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- STACK_DESTROY (process_frame->root);
- goto unwind;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
STACK_DESTROY (process_frame->root);
@@ -2241,7 +2418,7 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
return 0;
unwind:
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
+ STACK_UNWIND_STRICT (flush, frame, -1, op_errno);
return 0;
}
@@ -2256,18 +2433,25 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
call_stub_t *stub = NULL;
call_frame_t *flush_frame = NULL;
wb_request_t *request = NULL;
- int32_t ret = 0;
+ int32_t ret = 0, op_errno = 0;
+
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, unwind,
+ op_errno, EINVAL);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (this->name, fd, unwind, op_errno,
+ EINVAL);
conf = this->private;
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
- STACK_UNWIND_STRICT (flush, frame, -1, EBADFD);
- return 0;
+ op_errno = EBADFD;
+ goto unwind;
}
file = (wb_file_t *)(long)tmp_file;
@@ -2275,8 +2459,8 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
if (file != NULL) {
local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
local->file = file;
@@ -2285,29 +2469,28 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
stub = fop_flush_stub (frame, wb_flush_helper, fd);
if (stub == NULL) {
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
request = wb_enqueue (file, stub);
if (request == NULL) {
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
call_stub_destroy (stub);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
- call_stub_destroy (stub);
- return 0;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
if (conf->flush_behind) {
flush_frame = copy_frame (frame);
if (flush_frame == NULL) {
- STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
STACK_UNWIND_STRICT (flush, frame, 0, 0);
@@ -2322,6 +2505,10 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
}
return 0;
+
+unwind:
+ STACK_UNWIND_STRICT (flush, frame, -1, op_errno);
+ return 0;
}
@@ -2334,6 +2521,8 @@ wb_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
wb_request_t *request = NULL;
int32_t ret = -1;
+ GF_ASSERT (frame);
+
local = frame->local;
file = local->file;
request = local->request;
@@ -2353,9 +2542,14 @@ wb_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
if (request) {
wb_request_unref (request);
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- op_ret = -1;
- op_errno = ENOMEM;
+ if (ret == -1) {
+ if (errno == ENOMEM) {
+ op_ret = -1;
+ op_errno = ENOMEM;
+ }
+
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
}
@@ -2385,25 +2579,30 @@ wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
uint64_t tmp_file = 0;
call_stub_t *stub = NULL;
wb_request_t *request = NULL;
- int32_t ret = -1;
+ int32_t ret = -1, op_errno = 0;
+
+ GF_ASSERT (frame);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, this, unwind,
+ op_errno, EINVAL);
+ GF_VALIDATE_OR_GOTO_WITH_ERROR (frame->this->name, fd, unwind,
+ op_errno, EINVAL);
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
- gf_log (this->name, GF_LOG_DEBUG, "write behind file pointer is"
+ gf_log (this->name, GF_LOG_WARNING,
+ "write behind file pointer is"
" not stored in context of fd(%p), returning EBADFD",
fd);
-
- STACK_UNWIND_STRICT (fsync, frame, -1, EBADFD, NULL, NULL);
- return 0;
+ op_errno = EBADFD;
+ goto unwind;
}
file = (wb_file_t *)(long)tmp_file;
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL, NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
local->file = file;
@@ -2413,25 +2612,21 @@ wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
if (file) {
stub = fop_fsync_stub (frame, wb_fsync_helper, fd, datasync);
if (stub == NULL) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
- NULL);
- return 0;
+ op_errno = ENOMEM;
+ goto unwind;
}
request = wb_enqueue (file, stub);
if (request == NULL) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
- NULL);
+ op_errno = ENOMEM;
call_stub_destroy (stub);
- return 0;
+ goto unwind;
}
ret = wb_process_queue (frame, file);
- if ((ret == -1) && (errno == ENOMEM)) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
- NULL);
- call_stub_destroy (stub);
- return 0;
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "request queue processing failed");
}
} else {
STACK_WIND (frame, wb_fsync_cbk, FIRST_CHILD(this),
@@ -2439,6 +2634,10 @@ wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
}
return 0;
+
+unwind:
+ STACK_UNWIND_STRICT (fsync, frame, -1, op_errno, NULL, NULL);
+ return 0;
}
@@ -2448,6 +2647,9 @@ wb_release (xlator_t *this, fd_t *fd)
uint64_t file_ptr = 0;
wb_file_t *file = NULL;
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
+ GF_VALIDATE_OR_GOTO (this->name, fd, out);
+
fd_ctx_get (fd, this, &file_ptr);
file = (wb_file_t *) (long) file_ptr;
@@ -2461,6 +2663,7 @@ wb_release (xlator_t *this, fd_t *fd)
wb_file_destroy (file);
}
+out:
return 0;
}
@@ -2478,8 +2681,7 @@ wb_priv_dump (xlator_t *this)
conf = this->private;
GF_VALIDATE_OR_GOTO (this->name, conf, out);
- gf_proc_dump_build_key (key_prefix,
- "xlator.performance.write-behind",
+ gf_proc_dump_build_key (key_prefix, "xlator.performance.write-behind",
"priv");
gf_proc_dump_add_section (key_prefix);
@@ -2511,8 +2713,7 @@ __wb_dump_requests (struct list_head *head, char *prefix, char passive)
wb_request_t *request = NULL;
list_for_each_entry (request, head, list) {
- gf_proc_dump_build_key (key, prefix,
- passive ? "passive-request"
+ gf_proc_dump_build_key (key, prefix, passive ? "passive-request"
: "active-request");
gf_proc_dump_build_key (key_prefix, key,
gf_fop_list[request->fop]);
@@ -2590,8 +2791,7 @@ wb_file_dump (xlator_t *this, fd_t *fd)
goto out;
}
- gf_proc_dump_build_key (key_prefix,
- "xlator.performance.write-behind",
+ gf_proc_dump_build_key (key_prefix, "xlator.performance.write-behind",
"file");
gf_proc_dump_add_section (key_prefix);
@@ -2650,17 +2850,18 @@ mem_acct_init (xlator_t *this)
{
int ret = -1;
- if (!this)
- return ret;
+ if (!this) {
+ goto out;
+ }
ret = xlator_mem_acct_init (this, gf_wb_mt_end + 1);
if (ret != 0) {
gf_log (this->name, GF_LOG_ERROR, "Memory accounting init"
"failed");
- return ret;
}
+out:
return ret;
}
@@ -2703,15 +2904,13 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
goto out;
}
- gf_log(this->name, GF_LOG_DEBUG, "Validated "
- "'option cache-size %s '", str);
+ gf_log(this->name, GF_LOG_WARNING,
+ "validated 'option cache-size %s '", str);
}
- ret = dict_get_str (options, "flush-behind",
- &str);
+ ret = dict_get_str (options, "flush-behind", &str);
if (ret == 0) {
- ret = gf_string2boolean (str,
- &flush_behind);
+ ret = gf_string2boolean (str, &flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_WARNING,
"'flush-behind' takes only boolean arguments");
@@ -2737,8 +2936,7 @@ reconfigure (xlator_t *this, dict_t *options)
conf = this->private;
- ret = dict_get_str (options, "cache-size",
- &str);
+ ret = dict_get_str (options, "cache-size", &str);
if (ret == 0) {
ret = gf_string2bytesize (str, &window_size);
if (ret != 0) {
@@ -2769,18 +2967,16 @@ reconfigure (xlator_t *this, dict_t *options)
}
conf->window_size = window_size;
- gf_log(this->name, GF_LOG_DEBUG, "Reconfiguring "
+ gf_log(this->name, GF_LOG_WARNING, "Reconfiguring "
"'option cache-size %s ' to %"PRIu64, str,
conf->window_size);
} else {
conf->window_size = WB_WINDOW_SIZE;
}
- ret = dict_get_str (options, "flush-behind",
- &str);
+ ret = dict_get_str (options, "flush-behind", &str);
if (ret == 0) {
- ret = gf_string2boolean (str,
- &conf->flush_behind);
+ ret = gf_string2boolean (str, &conf->flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
"'flush-behind' takes only boolean arguments");
@@ -2789,10 +2985,10 @@ reconfigure (xlator_t *this, dict_t *options)
}
if (conf->flush_behind) {
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (this->name, GF_LOG_WARNING,
"enabling flush-behind");
} else {
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (this->name, GF_LOG_WARNING,
"disabling flush-behind");
}
}
@@ -2814,9 +3010,8 @@ init (xlator_t *this)
|| this->children->next) {
gf_log (this->name, GF_LOG_ERROR,
"FATAL: write-behind (%s) not configured with exactly "
- "one child",
- this->name);
- return -1;
+ "one child", this->name);
+ goto out;
}
if (this->parents == NULL) {
@@ -2828,59 +3023,50 @@ init (xlator_t *this)
conf = GF_CALLOC (1, sizeof (*conf), gf_wb_mt_wb_conf_t);
if (conf == NULL) {
- gf_log (this->name, GF_LOG_ERROR,
- "FATAL: Out of memory");
- return -1;
+ goto out;
}
conf->enable_O_SYNC = _gf_false;
- ret = dict_get_str (options, "enable-O_SYNC",
- &str);
+ ret = dict_get_str (options, "enable-O_SYNC", &str);
if (ret == 0) {
- ret = gf_string2boolean (str,
- &conf->enable_O_SYNC);
+ ret = gf_string2boolean (str, &conf->enable_O_SYNC);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
"'enable-O_SYNC' takes only boolean arguments");
- return -1;
+ goto out;
}
}
/* configure 'options aggregate-size <size>' */
conf->aggregate_size = WB_AGGREGATE_SIZE;
conf->disable_till = 0;
- ret = dict_get_str (options, "disable-for-first-nbytes",
- &str);
+ ret = dict_get_str (options, "disable-for-first-nbytes", &str);
if (ret == 0) {
- ret = gf_string2bytesize (str,
- &conf->disable_till);
+ ret = gf_string2bytesize (str, &conf->disable_till);
if (ret != 0) {
gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
"disable-for-first-nbytes\"",
str);
- return -1;
+ goto out;
}
}
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (this->name, GF_LOG_WARNING,
"disabling write-behind for first %"PRIu64" bytes",
conf->disable_till);
/* configure 'option window-size <size>' */
conf->window_size = WB_WINDOW_SIZE;
- ret = dict_get_str (options, "cache-size",
- &str);
+ ret = dict_get_str (options, "cache-size", &str);
if (ret == 0) {
- ret = gf_string2bytesize (str,
- &conf->window_size);
+ ret = gf_string2bytesize (str, &conf->window_size);
if (ret != 0) {
gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
- "window-size\"",
- str);
+ "window-size\"", str);
GF_FREE (conf);
- return -1;
+ goto out;
}
}
@@ -2895,60 +3081,65 @@ init (xlator_t *this)
if (conf->window_size < conf->aggregate_size) {
gf_log (this->name, GF_LOG_ERROR,
"aggregate-size(%"PRIu64") cannot be more than "
- "window-size"
- "(%"PRIu64")", conf->aggregate_size, conf->window_size);
+ "window-size(%"PRIu64")", conf->aggregate_size,
+ conf->window_size);
GF_FREE (conf);
- return -1;
+ goto out;
}
/* configure 'option flush-behind <on/off>' */
conf->flush_behind = 1;
- ret = dict_get_str (options, "flush-behind",
- &str);
+ ret = dict_get_str (options, "flush-behind", &str);
if (ret == 0) {
- ret = gf_string2boolean (str,
- &conf->flush_behind);
+ ret = gf_string2boolean (str, &conf->flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
"'flush-behind' takes only boolean arguments");
- return -1;
+ goto out;
}
if (conf->flush_behind) {
- gf_log (this->name, GF_LOG_DEBUG,
+ gf_log (this->name, GF_LOG_WARNING,
"enabling flush-behind");
}
}
conf->enable_trickling_writes = _gf_true;
- ret = dict_get_str (options, "enable-trickling-writes",
- &str);
+ ret = dict_get_str (options, "enable-trickling-writes", &str);
if (ret == 0) {
- ret = gf_string2boolean (str,
- &conf->enable_trickling_writes);
+ ret = gf_string2boolean (str, &conf->enable_trickling_writes);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
"'enable-trickling_writes' takes only boolean"
" arguments");
- return -1;
+ goto out;
}
}
this->private = conf;
- return 0;
+ ret = 0;
+
+out:
+ return ret;
}
void
fini (xlator_t *this)
{
- wb_conf_t *conf = this->private;
+ wb_conf_t *conf = NULL;
+
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
- if (!conf)
- return;
+ conf = this->private;
+ if (!conf) {
+ goto out;
+ }
this->private = NULL;
GF_FREE (conf);
+
+out:
return;
}