diff options
| author | Raghavendra Bhat <raghavendra@redhat.com> | 2012-08-09 13:12:31 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2012-08-19 23:54:53 -0700 | 
| commit | 99f0daf2f46d56b78adfe1a3df1195e1388feaab (patch) | |
| tree | e5066b14fc5f943645de23316df5979939e84a59 | |
| parent | b757819289b014dbf706b26ca17f6cb584301ffc (diff) | |
performance/write-behind: avoid deadlock while taking the statedump of fds
* Provide a hook for forget
Change-Id: Ide7ea6d4c6a7d0d93b81570cb544f2bbda526eeb
BUG: 846916
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-on: http://review.gluster.org/3795
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | xlators/performance/write-behind/src/write-behind.c | 30 | 
1 files changed, 24 insertions, 6 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index 4082ffa9cc9..ad1e5f03111 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -162,7 +162,7 @@ __wb_fd_ctx_get (xlator_t *this, fd_t *fd)          wb_file_t *wb_file = NULL;          uint64_t   value   = 0; -        fd_ctx_get (fd, this, &value); +        __fd_ctx_get (fd, this, &value);          wb_file = (wb_file_t *)(unsigned long)value;          return wb_file; @@ -3079,20 +3079,30 @@ wb_fd_dump (xlator_t *this, fd_t *fd)          wb_file_t  *wb_file                        = NULL;          char       *path                           = NULL;          char       key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, }; +        int        ret                             = -1; +        gf_boolean_t  section_added                = _gf_false; + +        gf_proc_dump_build_key (key_prefix, "xlator.performance.write-behind", +                                "wb_file");          if ((fd == NULL) || (this == NULL)) {                  goto out;          } -        wb_file = wb_fd_ctx_get (this, fd); -        if (wb_file == NULL) { +        ret = TRY_LOCK(&fd->lock); +        if (ret)                  goto out; +        { +                wb_file = __wb_fd_ctx_get (this, fd);          } +        UNLOCK(&fd->lock); -        gf_proc_dump_build_key (key_prefix, "xlator.performance.write-behind", -                                "wb_file"); +        if (wb_file == NULL) { +                goto out; +        }          gf_proc_dump_add_section (key_prefix); +        section_added = _gf_true;          __inode_path (fd->inode, NULL, &path);          if (path != NULL) { @@ -3111,6 +3121,13 @@ wb_fd_dump (xlator_t *this, fd_t *fd)          gf_proc_dump_write ("disabled", "%d", wb_file->disabled);  out: +        if (ret && fd && this) { +                if (_gf_false == section_added) +                        gf_proc_dump_add_section (key_prefix); +                gf_proc_dump_write ("Unable to dump the fd", +                                    "(Lock acquisition failed) %s", +                                    uuid_utoa (fd->inode->gfid)); +        }          return 0;  } @@ -3265,7 +3282,8 @@ struct xlator_fops fops = {  };  struct xlator_cbks cbks = { -        .release  = wb_release +        .forget   = wb_forget, +        .release  = wb_release,  };  struct xlator_dumpops dumpops = {  | 
