|
|
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 |
|