summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohit Agrawal <moagrawa@redhat.com>2017-12-12 13:16:52 +0530
committerAmar Tumballi <amarts@redhat.com>2017-12-13 13:24:44 +0000
commit8b8fea1a801f837a75307f4cd8e79e808760cb0b (patch)
tree1bd1f32694d884eaf7f63e8d6d2e27841a0af5cb
parente255385ae4f4c8a883b3fb96baceba4b143828da (diff)
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 <moagrawa@redhat.com>
-rw-r--r--xlators/features/changelog/src/changelog-rpc.c5
-rw-r--r--xlators/features/changelog/src/changelog-rpc.h2
-rw-r--r--xlators/features/changelog/src/changelog.c15
3 files changed, 10 insertions, 12 deletions
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) {