d1681e
From 72dc3a3eff84c5e17bbc3bfddec9daf50338464f Mon Sep 17 00:00:00 2001
d1681e
From: Milind Changire <mchangir@redhat.com>
d1681e
Date: Tue, 6 Mar 2018 23:08:08 +0530
d1681e
Subject: [PATCH 175/180] rpc: make actor search parallel
d1681e
d1681e
Problem:
d1681e
On a service request, the actor is searched using an exclusive mutex
d1681e
lock which is not really necessary since most of the time the actor
d1681e
list is going to be searched and not modified.
d1681e
d1681e
Solution:
d1681e
Use a read-write lock instead of a mutex lock. Only modify operations
d1681e
on a service need to be done under a write-lock which grants exclusive
d1681e
access to the code.
d1681e
d1681e
NOTE:
d1681e
This patch has been specifically been taken in to use the pthread
d1681e
rwlock primitives that rpcsvc_ownthread_reconf() is using in commit
d1681e
8503ed9b94777d47352f19ebfa844e151352b87f
d1681e
(rpcsvc: scale rpcsvc_request_handler threads)
d1681e
d1681e
mainline:
d1681e
> BUG: 1509644
d1681e
> Reviewed-on: https://review.gluster.org/18543
d1681e
> Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
d1681e
> Signed-off-by: Milind Changire <mchangir@redhat.com>
d1681e
d1681e
Change-Id: I318026c13bb6e0385dc24018a976229182fc7f79
d1681e
BUG: 1549497
d1681e
Signed-off-by: Milind Changire <mchangir@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/131909
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
---
d1681e
 rpc/rpc-lib/src/rpcsvc-common.h |  2 +-
d1681e
 rpc/rpc-lib/src/rpcsvc.c        | 54 ++++++++++++++++++++---------------------
d1681e
 2 files changed, 28 insertions(+), 28 deletions(-)
d1681e
d1681e
diff --git a/rpc/rpc-lib/src/rpcsvc-common.h b/rpc/rpc-lib/src/rpcsvc-common.h
d1681e
index dd95803..ab715d3 100644
d1681e
--- a/rpc/rpc-lib/src/rpcsvc-common.h
d1681e
+++ b/rpc/rpc-lib/src/rpcsvc-common.h
d1681e
@@ -42,7 +42,7 @@ typedef struct rpcsvc_state {
d1681e
          * other options.
d1681e
          */
d1681e
 
d1681e
-        pthread_mutex_t         rpclock;
d1681e
+        pthread_rwlock_t        rpclock;
d1681e
 
d1681e
         unsigned int            memfactor;
d1681e
 
d1681e
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
d1681e
index 31b5eb5..fbd1071 100644
d1681e
--- a/rpc/rpc-lib/src/rpcsvc.c
d1681e
+++ b/rpc/rpc-lib/src/rpcsvc.c
d1681e
@@ -88,11 +88,11 @@ rpcsvc_listener_destroy (rpcsvc_listener_t *listener)
d1681e
                 goto listener_free;
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_del_init (&listener->list);
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
 listener_free:
d1681e
         GF_FREE (listener);
d1681e
@@ -110,7 +110,7 @@ rpcsvc_get_program_vector_sizer (rpcsvc_t *svc, uint32_t prognum,
d1681e
         if (!svc)
d1681e
                 return NULL;
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 /* Find the matching RPC program from registered list */
d1681e
                 list_for_each_entry (program, &svc->programs, program) {
d1681e
@@ -121,7 +121,7 @@ rpcsvc_get_program_vector_sizer (rpcsvc_t *svc, uint32_t prognum,
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (found) {
d1681e
                 /* Make sure the requested procnum is supported by RPC prog */
d1681e
@@ -237,7 +237,7 @@ rpcsvc_program_actor (rpcsvc_request_t *req)
d1681e
 
d1681e
         svc = req->svc;
d1681e
         peername = req->trans->peerinfo.identifier;
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (program, &svc->programs, program) {
d1681e
                         if (program->prognum == req->prognum) {
d1681e
@@ -251,7 +251,7 @@ rpcsvc_program_actor (rpcsvc_request_t *req)
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (!found) {
d1681e
                 if (err != PROG_MISMATCH) {
d1681e
@@ -735,7 +735,7 @@ rpcsvc_handle_disconnect (rpcsvc_t *svc, rpc_transport_t *trans)
d1681e
         event = (trans->listener == NULL) ? RPCSVC_EVENT_LISTENER_DEAD
d1681e
                 : RPCSVC_EVENT_DISCONNECT;
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 if (!svc->notify_count)
d1681e
                         goto unlock;
d1681e
@@ -755,7 +755,7 @@ rpcsvc_handle_disconnect (rpcsvc_t *svc, rpc_transport_t *trans)
d1681e
                 wrapper_count = i;
d1681e
         }
d1681e
 unlock:
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (wrappers) {
d1681e
                 for (i = 0; i < wrapper_count; i++) {
d1681e
@@ -1495,7 +1495,7 @@ rpcsvc_get_listener (rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans)
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (listener, &svc->listeners, list) {
d1681e
                         if (trans != NULL) {
d1681e
@@ -1521,7 +1521,7 @@ rpcsvc_get_listener (rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans)
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (!found) {
d1681e
                 listener = NULL;
d1681e
@@ -1566,7 +1566,7 @@ rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                         " program failed");
d1681e
                 goto out;
d1681e
         }
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (prog, &svc->programs, program) {
d1681e
                         if ((prog->prognum == program->prognum)
d1681e
@@ -1575,7 +1575,7 @@ rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (prog == NULL) {
d1681e
                 ret = -1;
d1681e
@@ -1592,11 +1592,11 @@ rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_del_init (&prog->program);
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         ret = 0;
d1681e
 out:
d1681e
@@ -1655,11 +1655,11 @@ rpcsvc_listener_alloc (rpcsvc_t *svc, rpc_transport_t *trans)
d1681e
 
d1681e
         INIT_LIST_HEAD (&listener->list);
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_add_tail (&listener->list, &svc->listeners);
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 out:
d1681e
         return listener;
d1681e
 }
d1681e
@@ -1813,7 +1813,7 @@ rpcsvc_unregister_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry_safe (wrapper, tmp, &svc->notify, list) {
d1681e
                         if ((wrapper->notify == notify)
d1681e
@@ -1824,7 +1824,7 @@ rpcsvc_unregister_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
 out:
d1681e
         return ret;
d1681e
@@ -1844,12 +1844,12 @@ rpcsvc_register_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)
d1681e
         wrapper->data = mydata;
d1681e
         wrapper->notify = notify;
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_add_tail (&wrapper->list, &svc->notify);
d1681e
                 svc->notify_count++;
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         ret = 0;
d1681e
 out:
d1681e
@@ -1987,7 +1987,7 @@ rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                 goto out;
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (newprog, &svc->programs, program) {
d1681e
                         if ((newprog->prognum == program->prognum)
d1681e
@@ -1997,7 +1997,7 @@ rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                         }
d1681e
                 }
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         if (already_registered) {
d1681e
                 ret = 0;
d1681e
@@ -2031,11 +2031,11 @@ rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)
d1681e
                 }
d1681e
         }
d1681e
 
d1681e
-        pthread_mutex_lock (&svc->rpclock);
d1681e
+        pthread_rwlock_wrlock (&svc->rpclock);
d1681e
         {
d1681e
                 list_add_tail (&newprog->program, &svc->programs);
d1681e
         }
d1681e
-        pthread_mutex_unlock (&svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&svc->rpclock);
d1681e
 
d1681e
         ret = 0;
d1681e
         gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New program registered: %s, Num: %d,"
d1681e
@@ -2077,7 +2077,7 @@ build_prog_details (rpcsvc_request_t *req, gf_dump_rsp *rsp)
d1681e
         if (!req || !req->trans || !req->svc)
d1681e
                 goto out;
d1681e
 
d1681e
-        pthread_mutex_lock (&req->svc->rpclock);
d1681e
+        pthread_rwlock_rdlock (&req->svc->rpclock);
d1681e
         {
d1681e
                 list_for_each_entry (program, &req->svc->programs, program) {
d1681e
                         prog = GF_CALLOC (1, sizeof (*prog), 0);
d1681e
@@ -2098,7 +2098,7 @@ build_prog_details (rpcsvc_request_t *req, gf_dump_rsp *rsp)
d1681e
                         ret = 0;
d1681e
         }
d1681e
 unlock:
d1681e
-        pthread_mutex_unlock (&req->svc->rpclock);
d1681e
+        pthread_rwlock_unlock (&req->svc->rpclock);
d1681e
 out:
d1681e
         return ret;
d1681e
 }
d1681e
@@ -2456,7 +2456,7 @@ rpcsvc_init (xlator_t *xl, glusterfs_ctx_t *ctx, dict_t *options,
d1681e
         if (!svc)
d1681e
                 return NULL;
d1681e
 
d1681e
-        pthread_mutex_init (&svc->rpclock, NULL);
d1681e
+        pthread_rwlock_init (&svc->rpclock, NULL);
d1681e
         INIT_LIST_HEAD (&svc->authschemes);
d1681e
         INIT_LIST_HEAD (&svc->notify);
d1681e
         INIT_LIST_HEAD (&svc->listeners);
d1681e
-- 
d1681e
1.8.3.1
d1681e