summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohit Agrawal <moagrawa@redhat.com>2018-02-18 08:14:35 +0530
committerAmar Tumballi <amarts@redhat.com>2018-02-19 19:30:56 +0000
commite3e7cdbde5463ff6d20af52329a784ca629c6aef (patch)
tree43887efd6a9c624ac204ad6bba6065baba2ab1cf
parent8d9961e63786cf8a9bb9e2f4140ab9a77f1ccbe3 (diff)
Revert "glusterfsd: Memleak in glusterfsd process while brick mux is on"
There are still remain some code paths where cleanup is required while brick mux is on.I will upload a new patch after resolve all code paths. This reverts commit b313d97faa766443a7f8128b6e19f3d2f1b267dd. BUG: 1544090 Change-Id: I26ef1d29061092bd9a409c8933d5488e968ed90e Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
-rw-r--r--glusterfsd/src/glusterfsd-mgmt.c65
-rw-r--r--glusterfsd/src/glusterfsd.c4
-rw-r--r--glusterfsd/src/glusterfsd.h3
-rw-r--r--xlators/debug/io-stats/src/io-stats.c1
-rw-r--r--xlators/features/bit-rot/src/stub/bit-rot-stub.c22
-rw-r--r--xlators/features/changelog/src/changelog-rpc-common.c4
-rw-r--r--xlators/features/changelog/src/changelog.c9
-rw-r--r--xlators/features/changetimerecorder/src/changetimerecorder.c15
-rw-r--r--xlators/features/index/src/index.c21
-rw-r--r--xlators/features/leases/src/leases.c15
-rw-r--r--xlators/features/marker/src/marker.c6
-rw-r--r--xlators/features/quota/src/quota.c12
-rw-r--r--xlators/features/trash/src/trash.c15
-rw-r--r--xlators/features/upcall/src/upcall.c12
-rw-r--r--xlators/performance/decompounder/src/decompounder.c7
-rw-r--r--xlators/performance/io-threads/src/io-threads.c3
-rw-r--r--xlators/protocol/server/src/server.c1
-rw-r--r--xlators/storage/posix/src/posix-common.c47
-rw-r--r--xlators/storage/posix/src/posix-helpers.c1
19 files changed, 85 insertions, 178 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c
index 5d0c83fd1a6..355b25f8aab 100644
--- a/glusterfsd/src/glusterfsd-mgmt.c
+++ b/glusterfsd/src/glusterfsd-mgmt.c
@@ -193,70 +193,6 @@ glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr)
(void) event_reconfigure_threads (pool, pool->eventthreadcount+incr);
}
-static int
-xlator_mem_free (xlator_t *xl)
-{
- volume_opt_list_t *vol_opt = NULL;
- volume_opt_list_t *tmp = NULL;
-
- if (!xl)
- return 0;
-
- GF_FREE (xl->name);
- GF_FREE (xl->type);
- xl->name = NULL;
- xl->type = NULL;
-
- if (xl->options) {
- dict_ref (xl->options);
- dict_unref (xl->options);
- xl->options = NULL;
- }
-
- list_for_each_entry_safe (vol_opt, tmp, &xl->volume_options, list) {
- list_del_init (&vol_opt->list);
- GF_FREE (vol_opt);
- }
-
- return 0;
-}
-
-void
-xlator_call_fini (xlator_t *this) {
- if (!this)
- return;
- xlator_call_fini (this->next);
- this->fini (this);
-}
-
-void
-xlator_mem_cleanup (xlator_t *this) {
- xlator_list_t *list = this->children;
- xlator_t *trav = list->xlator;
- inode_table_t *inode_table = NULL;
- xlator_t *prev = trav;
-
- inode_table = this->itable;
-
- xlator_call_fini (trav);
-
- while (prev) {
- trav = prev->next;
- xlator_mem_free (prev);
- prev = trav;
- }
-
- if (inode_table) {
- inode_table_destroy (inode_table);
- this->itable = NULL;
- }
- if (this->fini) {
- this->fini (this);
- xlator_mem_free (this);
- }
-}
-
-
int
glusterfs_handle_terminate (rpcsvc_request_t *req)
{
@@ -323,7 +259,6 @@ glusterfs_handle_terminate (rpcsvc_request_t *req)
gf_log (THIS->name, GF_LOG_INFO, "detaching not-only"
" child %s", xlator_req.name);
top->notify (top, GF_EVENT_CLEANUP, victim);
- xlator_mem_cleanup (victim);
}
err:
if (!lockflag)
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index dfaf9c09c6d..added9a08c2 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -1455,13 +1455,13 @@ cleanup_and_exit (int signum)
trav = NULL;
if (ctx->active)
trav = ctx->active->top;
- /*while (trav) {
+ while (trav) {
if (should_call_fini(ctx,trav)) {
THIS = trav;
trav->fini (trav);
}
trav = trav->next;
- }*/
+ }
/* NOTE: Only the least significant 8 bits i.e (signum & 255)
will be available to parent process on calling exit() */
diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h
index 420edfd3df5..9a0281e78a4 100644
--- a/glusterfsd/src/glusterfsd.h
+++ b/glusterfsd/src/glusterfsd.h
@@ -128,8 +128,5 @@ int glusterfs_volume_top_read_perf (uint32_t blk_size, uint32_t blk_count,
void
glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr);
-void
-xlator_mem_cleanup (xlator_t *this);
-
extern glusterfs_ctx_t *glusterfsd_ctx;
#endif /* __GLUSTERFSD_H__ */
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c
index 99e9196fd62..985c5fbc389 100644
--- a/xlators/debug/io-stats/src/io-stats.c
+++ b/xlators/debug/io-stats/src/io-stats.c
@@ -301,6 +301,7 @@ is_fop_latency_started (call_frame_t *frame)
throughput, iosstat); \
} while (0)
+
static int
ios_fd_ctx_get (fd_t *fd, xlator_t *this, struct ios_fd **iosfd)
{
diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
index 830357070d6..76a4c3f6962 100644
--- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c
+++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
@@ -229,6 +229,18 @@ notify (xlator_t *this, int event, void *data, ...)
if (!priv)
return 0;
+ switch (event) {
+ case GF_EVENT_CLEANUP:
+ if (priv->signth) {
+ (void) gf_thread_cleanup_xint (priv->signth);
+ priv->signth = 0;
+ }
+ if (priv->container.thread) {
+ (void) gf_thread_cleanup_xint (priv->container.thread);
+ priv->container.thread = 0;
+ }
+ break;
+ }
default_notify (this, event, data);
return 0;
}
@@ -251,7 +263,6 @@ fini (xlator_t *this)
"Could not cancel sign serializer thread");
goto out;
}
- priv->signth = 0;
while (!list_empty (&priv->squeue)) {
sigstub = list_first_entry (&priv->squeue,
@@ -273,19 +284,12 @@ fini (xlator_t *this)
goto out;
}
- priv->container.thread = 0;
-
while (!list_empty (&priv->container.bad_queue)) {
stub = list_first_entry (&priv->container.bad_queue, call_stub_t,
list);
list_del_init (&stub->list);
call_stub_destroy (stub);
- }
-
- if (priv->local_pool) {
- mem_pool_destroy (priv->local_pool);
- priv->local_pool = NULL;
- }
+ };
pthread_mutex_destroy (&priv->container.bad_lock);
pthread_cond_destroy (&priv->container.bad_cond);
diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c
index 1745f218b08..7bd5b688fa5 100644
--- a/xlators/features/changelog/src/changelog-rpc-common.c
+++ b/xlators/features/changelog/src/changelog-rpc-common.c
@@ -275,10 +275,6 @@ changelog_rpc_server_destroy (xlator_t *this, rpcsvc_t *rpc, char *sockfile,
(void) rpcsvc_unregister_notify (rpc, fn, this);
sys_unlink (sockfile);
- if (rpc->rxpool) {
- mem_pool_destroy (rpc->rxpool);
- rpc->rxpool = NULL;
- }
GF_FREE (rpc);
}
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
index 21de0fbc0c6..10a149232c2 100644
--- a/xlators/features/changelog/src/changelog.c
+++ b/xlators/features/changelog/src/changelog.c
@@ -2111,6 +2111,14 @@ notify (xlator_t *this, int event, void *data, ...)
if (!priv)
goto out;
+ if (event == GF_EVENT_CLEANUP) {
+ /* terminate helper threads */
+ changelog_cleanup_helper_threads (this, priv);
+
+ /* terminate RPC server/threads */
+ changelog_cleanup_rpc_threads (this, priv);
+ }
+
if (event == GF_EVENT_TRANSLATOR_OP) {
dict = data;
@@ -2914,7 +2922,6 @@ fini (xlator_t *this)
}
this->private = NULL;
- this->local_pool = NULL;
return;
}
diff --git a/xlators/features/changetimerecorder/src/changetimerecorder.c b/xlators/features/changetimerecorder/src/changetimerecorder.c
index 40bfcf4a32a..e97e3ad6cfa 100644
--- a/xlators/features/changetimerecorder/src/changetimerecorder.c
+++ b/xlators/features/changetimerecorder/src/changetimerecorder.c
@@ -19,6 +19,7 @@
#include "tier-ctr-interface.h"
/*******************************inode forget***********************************/
+
int
ctr_forget (xlator_t *this, inode_t *inode)
{
@@ -2305,6 +2306,15 @@ notify (xlator_t *this, int event, void *data, ...)
if (!priv)
goto out;
+ if (event == GF_EVENT_CLEANUP) {
+ if (fini_db (priv->_db_conn)) {
+ gf_msg (this->name, GF_LOG_WARNING, 0,
+ CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "
+ "db connection");
+ }
+ if (priv->_db_conn)
+ priv->_db_conn = NULL;
+ }
ret = default_notify (this, event, data);
out:
@@ -2345,10 +2355,6 @@ fini (xlator_t *this)
CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "
"db connection");
}
-
- if (priv->_db_conn)
- priv->_db_conn = NULL;
-
GF_FREE (priv->ctr_db_path);
if (pthread_mutex_destroy (&priv->compact_lock)) {
gf_msg (this->name, GF_LOG_WARNING, 0,
@@ -2358,7 +2364,6 @@ fini (xlator_t *this)
}
GF_FREE (priv);
mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
return;
}
diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c
index 5e723e5e4c6..ed89c02ae74 100644
--- a/xlators/features/index/src/index.c
+++ b/xlators/features/index/src/index.c
@@ -2460,13 +2460,6 @@ fini (xlator_t *this)
priv = this->private;
if (!priv)
goto out;
-
- priv->down = _gf_true;
- pthread_cond_broadcast (&priv->cond);
- if (priv->thread) {
- gf_thread_cleanup_xint (priv->thread);
- priv->thread = 0;
- }
this->private = NULL;
LOCK_DESTROY (&priv->lock);
pthread_cond_destroy (&priv->cond);
@@ -2478,11 +2471,8 @@ fini (xlator_t *this)
if (priv->complete_watchlist)
dict_unref (priv->complete_watchlist);
GF_FREE (priv);
-
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
+ mem_pool_destroy (this->local_pool);
+ this->local_pool = NULL;
out:
return;
}
@@ -2552,6 +2542,13 @@ notify (xlator_t *this, int event, void *data, ...)
if (!priv)
return 0;
+ switch (event) {
+ case GF_EVENT_CLEANUP:
+ priv->down = _gf_true;
+ pthread_cond_broadcast (&priv->cond);
+ break;
+ }
+
ret = default_notify (this, event, data);
return ret;
}
diff --git a/xlators/features/leases/src/leases.c b/xlators/features/leases/src/leases.c
index ebee682a685..d4fdbfb7ea1 100644
--- a/xlators/features/leases/src/leases.c
+++ b/xlators/features/leases/src/leases.c
@@ -1041,17 +1041,14 @@ fini (xlator_t *this)
priv->fini = _gf_true;
pthread_cond_broadcast (&priv->cond);
- if (priv->recall_thr) {
- gf_thread_cleanup_xint (priv->recall_thr);
- priv->recall_thr = 0;
- priv->inited_recall_thr = _gf_false;
- }
+ pthread_join (priv->recall_thr, NULL);
+
+ priv->inited_recall_thr = _gf_false;
GF_FREE (priv);
- if (this->ctx->tw) {
- glusterfs_ctx_tw_put (this->ctx);
- this->ctx->tw = NULL;
- }
+
+ glusterfs_ctx_tw_put (this->ctx);
+
return 0;
}
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c
index b8f4a67c7b6..cb8f8356259 100644
--- a/xlators/features/marker/src/marker.c
+++ b/xlators/features/marker/src/marker.c
@@ -3292,12 +3292,6 @@ marker_priv_cleanup (xlator_t *this)
LOCK_DESTROY (&priv->lock);
GF_FREE (priv);
-
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
-
out:
return;
}
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c
index d4ef8a5b2ce..e8335e63c1c 100644
--- a/xlators/features/quota/src/quota.c
+++ b/xlators/features/quota/src/quota.c
@@ -5219,18 +5219,6 @@ out:
void
fini (xlator_t *this)
{
- quota_priv_t *priv = NULL;
-
- priv = this->private;
- if (!priv)
- return;
- this->private = NULL;
- LOCK_DESTROY (&priv->lock);
- GF_FREE (priv);
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
return;
}
diff --git a/xlators/features/trash/src/trash.c b/xlators/features/trash/src/trash.c
index e8f8b7bf051..cfdcc6ff5fc 100644
--- a/xlators/features/trash/src/trash.c
+++ b/xlators/features/trash/src/trash.c
@@ -33,6 +33,7 @@ trash_unlink_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
struct iatt *preoldparent, struct iatt *postoldparent,
struct iatt *prenewparent, struct iatt *postnewparent,
dict_t *xdata);
+
/* Common routines used in this translator */
/**
@@ -2430,7 +2431,6 @@ notify (xlator_t *this, int event, void *data, ...)
ret = create_internalop_directory (this);
}
-
out:
ret = default_notify (this, event, data);
if (ret)
@@ -2612,11 +2612,10 @@ void
fini (xlator_t *this)
{
trash_private_t *priv = NULL;
- inode_table_t *inode_table = NULL;
GF_VALIDATE_OR_GOTO ("trash", this, out);
priv = this->private;
- inode_table = priv->trash_itable;
+
if (priv) {
if (priv->newtrash_dir)
GF_FREE (priv->newtrash_dir);
@@ -2626,17 +2625,9 @@ fini (xlator_t *this)
GF_FREE (priv->brick_path);
if (priv->eliminate)
wipe_eliminate_path (&priv->eliminate);
- if (inode_table) {
- inode_table_destroy (inode_table);
- priv->trash_itable = NULL;
- }
GF_FREE (priv);
}
-
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
+ mem_pool_destroy (this->local_pool);
this->private = NULL;
out:
return;
diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c
index d68bf5aa99a..b9b4bc9d725 100644
--- a/xlators/features/upcall/src/upcall.c
+++ b/xlators/features/upcall/src/upcall.c
@@ -2446,11 +2446,8 @@ fini (xlator_t *this)
priv->fini = 1;
- if (priv->reaper_thr) {
- gf_thread_cleanup_xint (priv->reaper_thr);
- priv->reaper_thr = 0;
- priv->reaper_init_done = _gf_false;
- }
+ if (priv->reaper_init_done)
+ pthread_join (priv->reaper_thr, NULL);
dict_unref (priv->xattrs);
LOCK_DESTROY (&priv->inode_ctx_lk);
@@ -2460,11 +2457,6 @@ fini (xlator_t *this)
* before calling xlator_fini */
GF_FREE (priv);
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
-
return 0;
}
diff --git a/xlators/performance/decompounder/src/decompounder.c b/xlators/performance/decompounder/src/decompounder.c
index 095a300e9f4..d3d9b9f7830 100644
--- a/xlators/performance/decompounder/src/decompounder.c
+++ b/xlators/performance/decompounder/src/decompounder.c
@@ -946,12 +946,5 @@ out:
int32_t
fini (xlator_t *this)
{
- if (!this)
- return 0;
-
- if (this->local_pool) {
- mem_pool_destroy (this->local_pool);
- this->local_pool = NULL;
- }
return 0;
}
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c
index 04d4760eea5..501e4019e90 100644
--- a/xlators/performance/io-threads/src/io-threads.c
+++ b/xlators/performance/io-threads/src/io-threads.c
@@ -1136,7 +1136,8 @@ notify (xlator_t *this, int32_t event, void *data, ...)
{
iot_conf_t *conf = this->private;
- if (GF_EVENT_PARENT_DOWN == event)
+ if ((GF_EVENT_PARENT_DOWN == event) ||
+ (GF_EVENT_CLEANUP == event))
iot_exit_threads (conf);
default_notify (this, event, data);
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 335c86fcda2..7bd276cdece 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -1500,6 +1500,7 @@ server_notify (xlator_t *this, int32_t event, void *data, ...)
glusterfs_mgmt_pmap_signout (ctx,
victim->name);
glusterfs_autoscale_threads (THIS->ctx, -1);
+ default_notify (victim, GF_EVENT_CLEANUP, data);
}
break;
diff --git a/xlators/storage/posix/src/posix-common.c b/xlators/storage/posix/src/posix-common.c
index f1fa81e056b..345d35e3e9a 100644
--- a/xlators/storage/posix/src/posix-common.c
+++ b/xlators/storage/posix/src/posix-common.c
@@ -105,7 +105,6 @@ extern char *marker_xattrs[];
(lutimes (path, tv))
#endif
-
int32_t
posix_priv (xlator_t *this)
{
@@ -148,6 +147,9 @@ posix_notify (xlator_t *this,
void *data,
...)
{
+ struct posix_private *priv = NULL;
+
+ priv = this->private;
switch (event)
{
case GF_EVENT_PARENT_UP:
@@ -156,6 +158,31 @@ posix_notify (xlator_t *this,
default_notify (this, GF_EVENT_CHILD_UP, data);
}
break;
+ case GF_EVENT_CLEANUP:
+ if (priv->health_check) {
+ priv->health_check_active = _gf_false;
+ pthread_cancel (priv->health_check);
+ priv->health_check = 0;
+ }
+ if (priv->disk_space_check) {
+ priv->disk_space_check_active = _gf_false;
+ pthread_cancel (priv->disk_space_check);
+ priv->disk_space_check = 0;
+ }
+ if (priv->janitor) {
+ (void) gf_thread_cleanup_xint (priv->janitor);
+ priv->janitor = 0;
+ }
+ if (priv->fsyncer) {
+ (void) gf_thread_cleanup_xint (priv->fsyncer);
+ priv->fsyncer = 0;
+ }
+ if (priv->mount_lock) {
+ (void) sys_closedir (priv->mount_lock);
+ priv->mount_lock = NULL;
+ }
+
+ break;
default:
/* */
break;
@@ -1106,24 +1133,6 @@ posix_fini (xlator_t *this)
if (!priv)
return;
this->private = NULL;
- if (priv->health_check) {
- priv->health_check_active = _gf_false;
- pthread_cancel (priv->health_check);
- priv->health_check = 0;
- }
- if (priv->disk_space_check) {
- priv->disk_space_check_active = _gf_false;
- pthread_cancel (priv->disk_space_check);
- priv->disk_space_check = 0;
- }
- if (priv->janitor) {
- (void) gf_thread_cleanup_xint (priv->janitor);
- priv->janitor = 0;
- }
- if (priv->fsyncer) {
- (void) gf_thread_cleanup_xint (priv->fsyncer);
- priv->fsyncer = 0;
- }
/*unlock brick dir*/
if (priv->mount_lock)
(void) sys_closedir (priv->mount_lock);
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 377389d22a3..56c9b4afe94 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -2060,7 +2060,6 @@ abort:
gf_log (THIS->name, GF_LOG_INFO, "detaching not-only "
" child %s", priv->base_path);
top->notify (top, GF_EVENT_CLEANUP, victim);
- xlator_mem_cleanup (victim);
}
}