diff options
author | Mohit Agrawal <moagrawa@redhat.com> | 2018-02-10 12:25:15 +0530 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2018-02-15 17:03:20 +0000 |
commit | b313d97faa766443a7f8128b6e19f3d2f1b267dd (patch) | |
tree | 6af84081aee75fa08c8ceecde4c15a2791863e52 | |
parent | 9d0d1fdd091d754149242fd4389b964695aacf13 (diff) | |
download | glusterfs-b313d97faa766443a7f8128b6e19f3d2f1b267dd.tar.gz glusterfs-b313d97faa766443a7f8128b6e19f3d2f1b267dd.tar.xz glusterfs-b313d97faa766443a7f8128b6e19f3d2f1b267dd.zip |
glusterfsd: Memleak in glusterfsd process while brick mux is on
Problem: At the time of stopping the volume while brick multiplex is
enabled memory is not cleanup from all server side xlators.
Solution: To cleanup memory for all server side xlators call fini
in glusterfs_handle_terminate after send GF_EVENT_CLEANUP
notification to top xlator.
BUG: 1544090
Change-Id: Ifa1525e25b697371276158705026b421b4f81140
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 65 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd.c | 4 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd.h | 3 | ||||
-rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 1 | ||||
-rw-r--r-- | xlators/features/bit-rot/src/stub/bit-rot-stub.c | 22 | ||||
-rw-r--r-- | xlators/features/changelog/src/changelog-rpc-common.c | 4 | ||||
-rw-r--r-- | xlators/features/changelog/src/changelog.c | 9 | ||||
-rw-r--r-- | xlators/features/changetimerecorder/src/changetimerecorder.c | 15 | ||||
-rw-r--r-- | xlators/features/index/src/index.c | 21 | ||||
-rw-r--r-- | xlators/features/leases/src/leases.c | 15 | ||||
-rw-r--r-- | xlators/features/marker/src/marker.c | 6 | ||||
-rw-r--r-- | xlators/features/quota/src/quota.c | 12 | ||||
-rw-r--r-- | xlators/features/trash/src/trash.c | 15 | ||||
-rw-r--r-- | xlators/features/upcall/src/upcall.c | 12 | ||||
-rw-r--r-- | xlators/performance/decompounder/src/decompounder.c | 7 | ||||
-rw-r--r-- | xlators/performance/io-threads/src/io-threads.c | 3 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.c | 1 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-common.c | 47 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 1 |
19 files changed, 178 insertions, 85 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index ac487b94e5..4c4d98dad3 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -193,6 +193,70 @@ 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) { @@ -259,6 +323,7 @@ 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 b836bbc21c..3bfd0f1238 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1480,13 +1480,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 9a0281e78a..420edfd3df 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -128,5 +128,8 @@ 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 985c5fbc38..99e9196fd6 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -301,7 +301,6 @@ 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 76a4c3f696..830357070d 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c +++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c @@ -229,18 +229,6 @@ 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; } @@ -263,6 +251,7 @@ 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, @@ -284,12 +273,19 @@ 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 7bd5b688fa..1745f218b0 100644 --- a/xlators/features/changelog/src/changelog-rpc-common.c +++ b/xlators/features/changelog/src/changelog-rpc-common.c @@ -275,6 +275,10 @@ 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 10a149232c..21de0fbc0c 100644 --- a/xlators/features/changelog/src/changelog.c +++ b/xlators/features/changelog/src/changelog.c @@ -2111,14 +2111,6 @@ 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; @@ -2922,6 +2914,7 @@ 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 a9af008f80..40bfcf4a32 100644 --- a/xlators/features/changetimerecorder/src/changetimerecorder.c +++ b/xlators/features/changetimerecorder/src/changetimerecorder.c @@ -19,7 +19,6 @@ #include "tier-ctr-interface.h" /*******************************inode forget***********************************/ - int ctr_forget (xlator_t *this, inode_t *inode) { @@ -2306,15 +2305,6 @@ 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: @@ -2355,6 +2345,10 @@ 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, @@ -2364,6 +2358,7 @@ 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 ed89c02ae7..5e723e5e4c 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -2460,6 +2460,13 @@ 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); @@ -2471,8 +2478,11 @@ fini (xlator_t *this) if (priv->complete_watchlist) dict_unref (priv->complete_watchlist); GF_FREE (priv); - mem_pool_destroy (this->local_pool); - this->local_pool = NULL; + + if (this->local_pool) { + mem_pool_destroy (this->local_pool); + this->local_pool = NULL; + } out: return; } @@ -2542,13 +2552,6 @@ 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 d4fdbfb7ea..ebee682a68 100644 --- a/xlators/features/leases/src/leases.c +++ b/xlators/features/leases/src/leases.c @@ -1041,14 +1041,17 @@ fini (xlator_t *this) priv->fini = _gf_true; pthread_cond_broadcast (&priv->cond); - pthread_join (priv->recall_thr, NULL); - - priv->inited_recall_thr = _gf_false; + if (priv->recall_thr) { + gf_thread_cleanup_xint (priv->recall_thr); + priv->recall_thr = 0; + priv->inited_recall_thr = _gf_false; + } GF_FREE (priv); - - glusterfs_ctx_tw_put (this->ctx); - + if (this->ctx->tw) { + glusterfs_ctx_tw_put (this->ctx); + this->ctx->tw = NULL; + } return 0; } diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index cb8f835625..b8f4a67c7b 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -3292,6 +3292,12 @@ 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 e8335e63c1..d4ef8a5b2c 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -5219,6 +5219,18 @@ 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 cfdcc6ff5f..e8f8b7bf05 100644 --- a/xlators/features/trash/src/trash.c +++ b/xlators/features/trash/src/trash.c @@ -33,7 +33,6 @@ 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 */ /** @@ -2431,6 +2430,7 @@ notify (xlator_t *this, int event, void *data, ...) ret = create_internalop_directory (this); } + out: ret = default_notify (this, event, data); if (ret) @@ -2612,10 +2612,11 @@ 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); @@ -2625,9 +2626,17 @@ 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); } - mem_pool_destroy (this->local_pool); + + if (this->local_pool) { + mem_pool_destroy (this->local_pool); + this->local_pool = NULL; + } this->private = NULL; out: return; diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c index b9b4bc9d72..d68bf5aa99 100644 --- a/xlators/features/upcall/src/upcall.c +++ b/xlators/features/upcall/src/upcall.c @@ -2446,8 +2446,11 @@ fini (xlator_t *this) priv->fini = 1; - if (priv->reaper_init_done) - pthread_join (priv->reaper_thr, NULL); + if (priv->reaper_thr) { + gf_thread_cleanup_xint (priv->reaper_thr); + priv->reaper_thr = 0; + priv->reaper_init_done = _gf_false; + } dict_unref (priv->xattrs); LOCK_DESTROY (&priv->inode_ctx_lk); @@ -2457,6 +2460,11 @@ 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 d3d9b9f783..095a300e9f 100644 --- a/xlators/performance/decompounder/src/decompounder.c +++ b/xlators/performance/decompounder/src/decompounder.c @@ -946,5 +946,12 @@ 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 501e4019e9..04d4760eea 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -1136,8 +1136,7 @@ notify (xlator_t *this, int32_t event, void *data, ...) { iot_conf_t *conf = this->private; - if ((GF_EVENT_PARENT_DOWN == event) || - (GF_EVENT_CLEANUP == event)) + if (GF_EVENT_PARENT_DOWN == 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 7bd276cdec..335c86fcda 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -1500,7 +1500,6 @@ 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 fa2655ed8c..a67b3d7dc7 100644 --- a/xlators/storage/posix/src/posix-common.c +++ b/xlators/storage/posix/src/posix-common.c @@ -105,6 +105,7 @@ extern char *marker_xattrs[]; (lutimes (path, tv)) #endif + int32_t posix_priv (xlator_t *this) { @@ -147,9 +148,6 @@ posix_notify (xlator_t *this, void *data, ...) { - struct posix_private *priv = NULL; - - priv = this->private; switch (event) { case GF_EVENT_PARENT_UP: @@ -158,31 +156,6 @@ 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; @@ -1127,6 +1100,24 @@ 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 56c9b4afe9..377389d22a 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -2060,6 +2060,7 @@ 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); } } |