diff options
| author | Niels de Vos <ndevos@redhat.com> | 2017-07-10 11:45:31 +0200 | 
|---|---|---|
| committer | Niels de Vos <ndevos@redhat.com> | 2017-07-12 09:01:12 +0000 | 
| commit | a4a417e29c5b2d63e6bf5efae4f0ccf30a39647f (patch) | |
| tree | 0df516d8d8f0f89789c91dd447c2650e5f52338b /api/src | |
| parent | 9ab249130a5dd442044e787f1e171e7a17839906 (diff) | |
gfapi: prevent mem-pool leak in case glfs_new_fs() fails
Commit 7039243e187 adds a call to mem_pools_init() so that the memory
pool cleanup thread ("sweeper") is started. However, now it is possible
that users of gfapi can not cleanup this thread because glfs_new() can
return NULL, but the sweeper is still running.
In case glfs_fs_new() fails, mem_pools_fini() needs to be called as
well. This seems more correct than calling mem_pools_init() after
glfs_fs_new(), and this makes using memory pools possible *really* early
in the gfapi initialization.
Change-Id: I1f2fb25cc33e227b3c33ce9d1b03f67bc27e981a
Fixes: 7039243e187 ("gfapi: add mem_pools_init and mem_pools_fini calls")
BUG: 1468863
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: https://review.gluster.org/17734
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: soumya k <skoduri@redhat.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Diffstat (limited to 'api/src')
| -rw-r--r-- | api/src/glfs.c | 33 | 
1 files changed, 21 insertions, 12 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c index 0eb25a222de..25eaabb066c 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -753,45 +753,54 @@ pub_glfs_new (const char *volname)          fs = glfs_new_fs (volname);          if (!fs) -                return NULL; +                goto out;          ctx = glusterfs_ctx_new ();          if (!ctx) -                goto fini; +                goto out;          /* first globals init, for gf_mem_acct_enable_set () */          ret = glusterfs_globals_init (ctx);          if (ret) -                goto fini; +                goto out;          old_THIS = THIS;          ret = glfs_init_global_ctx ();          if (ret) -                goto fini; +                goto out;          /* then ctx_defaults_init, for xlator_mem_acct_init(THIS) */          ret = glusterfs_ctx_defaults_init (ctx);          if (ret) -                goto fini; +                goto out;          fs->ctx = ctx;          ret = glfs_set_logging (fs, "/dev/null", 0);          if (ret) -                goto fini; +                goto out;          fs->ctx->cmd_args.volfile_id = gf_strdup (volname); -        if (!(fs->ctx->cmd_args.volfile_id)) -                goto fini; +        if (!(fs->ctx->cmd_args.volfile_id)) { +                ret = -1; +                goto out; +        } -        goto out; +        ret = 0; -fini: -         glfs_fini (fs); -         fs = NULL;  out: +        if (ret) { +                if (fs) { +                        glfs_fini (fs); +                        fs = NULL; +                } else { +                        /* glfs_fini() calls mem_pools_fini() too */ +                        mem_pools_fini (); +                } +        } +          if (old_THIS)                  THIS = old_THIS;  | 
