From 8b8fea1a801f837a75307f4cd8e79e808760cb0b Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Tue, 12 Dec 2017 13:16:52 +0530 Subject: features/changelog: changelog threads are not cleaned properly after receive GF_EVENT_CLEANUP Problem: changelog threads are not cleaned properly after receive GF_EVENT_CLEANUP while brick mux is enabled Solution: change changelog notify code path to cleanup threads properly BUG: 1524816 Change-Id: I007f4e14e3d557707df738faf222b78c793d5ab5 Signed-off-by: Mohit Agrawal --- xlators/features/changelog/src/changelog-rpc.c | 5 ++++- xlators/features/changelog/src/changelog-rpc.h | 2 ++ xlators/features/changelog/src/changelog.c | 15 ++++----------- 3 files changed, 10 insertions(+), 12 deletions(-) (limited to 'xlators') diff --git a/xlators/features/changelog/src/changelog-rpc.c b/xlators/features/changelog/src/changelog-rpc.c index 72b5cdbc7cb..4b2b38cad51 100644 --- a/xlators/features/changelog/src/changelog-rpc.c +++ b/xlators/features/changelog/src/changelog-rpc.c @@ -22,10 +22,11 @@ changelog_cleanup_dispatchers (xlator_t *this, for (count--; count >= 0; count--) { (void) changelog_thread_cleanup (this, priv->ev_dispatcher[count]); + priv->ev_dispatcher[count] = 0; } } -static int +int changelog_cleanup_rpc_threads (xlator_t *this, changelog_priv_t *priv) { int ret = 0; @@ -39,6 +40,8 @@ changelog_cleanup_rpc_threads (xlator_t *this, changelog_priv_t *priv) ret = changelog_thread_cleanup (this, priv->connector); if (ret != 0) goto error_return; + priv->connector = 0; + /** terminate dispatcher thread(s) */ changelog_cleanup_dispatchers (this, priv, priv->nr_dispatchers); diff --git a/xlators/features/changelog/src/changelog-rpc.h b/xlators/features/changelog/src/changelog-rpc.h index ae09a66aff3..9f1e2d223a3 100644 --- a/xlators/features/changelog/src/changelog-rpc.h +++ b/xlators/features/changelog/src/changelog-rpc.h @@ -26,4 +26,6 @@ changelog_init_rpc_listener (xlator_t *, changelog_priv_t *, rbuf_t *, int); void changelog_destroy_rpc_listner (xlator_t *, changelog_priv_t *); +int +changelog_cleanup_rpc_threads (xlator_t *this, changelog_priv_t *priv); #endif diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c index ce343af0270..caea8a59477 100644 --- a/xlators/features/changelog/src/changelog.c +++ b/xlators/features/changelog/src/changelog.c @@ -2112,7 +2112,6 @@ notify (xlator_t *this, int event, void *data, ...) int ret = 0; int ret1 = 0; struct list_head queue = {0, }; - int i = 0; INIT_LIST_HEAD (&queue); @@ -2121,17 +2120,11 @@ notify (xlator_t *this, int event, void *data, ...) goto out; if (event == GF_EVENT_CLEANUP) { - if (priv->connector) { - (void) gf_thread_cleanup_xint (priv->connector); - priv->connector = 0; - } + /* terminate helper threads */ + changelog_cleanup_helper_threads (this, priv); - for (; i < NR_DISPATCHERS; i++) { - if (priv->ev_dispatcher[i]) { - (void) gf_thread_cleanup_xint (priv->ev_dispatcher[i]); - priv->ev_dispatcher[i] = 0; - } - } + /* terminate RPC server/threads */ + changelog_cleanup_rpc_threads (this, priv); } if (event == GF_EVENT_TRANSLATOR_OP) { -- cgit