d1681e
From a5584d85d5cd8d8c7252ef9e03207d64e87df83c Mon Sep 17 00:00:00 2001
d1681e
From: Mohit Agrawal <moagrawa@redhat.com>
d1681e
Date: Fri, 18 May 2018 20:03:32 +0530
d1681e
Subject: [PATCH 289/305] changelog: fix br-state-check.t failure for brick_mux
d1681e
d1681e
Problem: Sometime br-state-check.t crash while runnning
d1681e
         for brick multiplex and command in test case is
d1681e
         taking 2 minutes for detach a brick
d1681e
d1681e
Solution: Update code in changelog xlator specific to wait
d1681e
          on all connection before cleanup rpc threads and
d1681e
          cleanup rpc object only in non brick mux scenario
d1681e
d1681e
> BUG: 1577672
d1681e
> Change-Id: I16e257c1e127744a815000b87bd8b7b8d9c51e1b
d1681e
> fixes: bz#1577672
d1681e
> (cherry picked from commit 4ae7f0714b809cfebb64f6e5b5a70664e17a7a56)
d1681e
> (Upstream review link https://review.gluster.org/#/c/20037/)
d1681e
d1681e
BUG: 1581647
d1681e
Change-Id: I0b25e032d90a57cdd612a38b356248b4b47a7b60
d1681e
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/139977
d1681e
Reviewed-by: Kotresh Hiremath Ravishankar <khiremat@redhat.com>
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d1681e
---
d1681e
 rpc/rpc-lib/src/rpcsvc.c                           |  2 +-
d1681e
 .../features/changelog/src/changelog-rpc-common.c  |  7 ++++-
d1681e
 xlators/features/changelog/src/changelog-rpc.c     | 33 ++++++++++++++++++++++
d1681e
 3 files changed, 40 insertions(+), 2 deletions(-)
d1681e
d1681e
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
d1681e
index 9938b8f..3acaa8b 100644
d1681e
--- a/rpc/rpc-lib/src/rpcsvc.c
d1681e
+++ b/rpc/rpc-lib/src/rpcsvc.c
d1681e
@@ -1482,7 +1482,7 @@ rpcsvc_get_listener (rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans)
d1681e
         pthread_mutex_lock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (listener, &svc->listeners, list) {
d1681e
-                        if (trans != NULL) {
d1681e
+                        if (listener && trans) {
d1681e
                                 if (listener->trans == trans) {
d1681e
                                         found = 1;
d1681e
                                         break;
d1681e
diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c
d1681e
index 21bef76..9ba5444 100644
d1681e
--- a/xlators/features/changelog/src/changelog-rpc-common.c
d1681e
+++ b/xlators/features/changelog/src/changelog-rpc-common.c
d1681e
@@ -280,7 +280,12 @@ changelog_rpc_server_destroy (xlator_t *this, rpcsvc_t *rpc, char *sockfile,
d1681e
                 rpc->rxpool = NULL;
d1681e
         }
d1681e
 
d1681e
-        GF_FREE (rpc);
d1681e
+        /* TODO Avoid freeing rpc object in case of brick multiplex
d1681e
+           after freeing rpc object svc->rpclock corrupted and it takes
d1681e
+           more time to detach a brick
d1681e
+        */
d1681e
+        if (!this->cleanup_starting)
d1681e
+                GF_FREE (rpc);
d1681e
 }
d1681e
 
d1681e
 rpcsvc_t *
d1681e
diff --git a/xlators/features/changelog/src/changelog-rpc.c b/xlators/features/changelog/src/changelog-rpc.c
d1681e
index ccb22b5..1443bd0 100644
d1681e
--- a/xlators/features/changelog/src/changelog-rpc.c
d1681e
+++ b/xlators/features/changelog/src/changelog-rpc.c
d1681e
@@ -154,6 +154,9 @@ void
d1681e
 changelog_destroy_rpc_listner (xlator_t *this, changelog_priv_t *priv)
d1681e
 {
d1681e
         char sockfile[UNIX_PATH_MAX] = {0,};
d1681e
+        changelog_clnt_t     *c_clnt  = &priv->connections;
d1681e
+        changelog_rpc_clnt_t *crpc = NULL;
d1681e
+        int                   nofconn = 0;
d1681e
 
d1681e
         /* sockfile path could have been saved to avoid this */
d1681e
         CHANGELOG_MAKE_SOCKET_PATH (priv->changelog_brick,
d1681e
@@ -162,6 +165,36 @@ changelog_destroy_rpc_listner (xlator_t *this, changelog_priv_t *priv)
d1681e
                                       priv->rpc, sockfile,
d1681e
                                       changelog_rpcsvc_notify,
d1681e
                                       changelog_programs);
d1681e
+
d1681e
+        /* TODO Below approach is not perfect to wait for cleanup
d1681e
+           all active connections without this code brick process
d1681e
+           can be crash in case of brick multiplexing if any in-progress
d1681e
+           request process on rpc by changelog xlator after
d1681e
+           cleanup resources
d1681e
+        */
d1681e
+
d1681e
+        if (c_clnt) {
d1681e
+                do {
d1681e
+                        nofconn = 0;
d1681e
+                        LOCK (&c_clnt->active_lock);
d1681e
+                                list_for_each_entry (crpc, &c_clnt->active, list) {
d1681e
+                                          nofconn++;
d1681e
+                                }
d1681e
+                        UNLOCK (&c_clnt->active_lock);
d1681e
+                        LOCK (&c_clnt->wait_lock);
d1681e
+                                list_for_each_entry (crpc, &c_clnt->waitq, list) {
d1681e
+                                          nofconn++;
d1681e
+                                }
d1681e
+                        UNLOCK (&c_clnt->wait_lock);
d1681e
+                        pthread_mutex_lock (&c_clnt->pending_lock);
d1681e
+                                list_for_each_entry (crpc, &c_clnt->pending, list) {
d1681e
+                                          nofconn++;
d1681e
+                                }
d1681e
+                        pthread_mutex_unlock (&c_clnt->pending_lock);
d1681e
+
d1681e
+                } while (nofconn);  /* Wait for all connection cleanup */
d1681e
+        }
d1681e
+
d1681e
         (void) changelog_cleanup_rpc_threads (this, priv);
d1681e
 }
d1681e
 
d1681e
-- 
d1681e
1.8.3.1
d1681e