glusterfs/0175-rpc-make-actor-search-parallel.patch
Milind Changire 44012ad580 autobuild v3.12.2-5
Resolves: bz#1378371 bz#1384983 bz#1472445 bz#1493085 bz#1508999
Resolves: bz#1516638 bz#1518260 bz#1529072 bz#1530519 bz#1537357
Resolves: bz#1540908 bz#1541122 bz#1541932 bz#1543068 bz#1544382
Resolves: bz#1544852 bz#1545570 bz#1546075 bz#1546945 bz#1546960
Resolves: bz#1547012 bz#1549497
Signed-off-by: Milind Changire <mchangir@redhat.com>
2018-03-07 08:56:57 -05:00

283 lines
10 KiB
Diff

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