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 | |
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>
-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; |