summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2010-10-06 08:00:18 +0000
committerVijay Bellur <vijay@dev.gluster.com>2010-10-06 22:17:17 -0700
commit0c0c82729b947256beefcd3999d230302faef1fd (patch)
tree6d785c2f47ce3d9a5d182beeae5039d2dd397cf5
parent96155f065e229f6123cc90b9ca37df9cbd7598c7 (diff)
rpcsvc: allocate a new program structure before registering it.
Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Vijay Bellur <vijay@dev.gluster.com> BUG: 1836 (server is hung in infinite loop while trying to search for an actor during request processing) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1836
-rw-r--r--rpc/rpc-lib/src/rpcsvc.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c
index ccb191a17..b78b1f0e2 100644
--- a/rpc/rpc-lib/src/rpcsvc.c
+++ b/rpc/rpc-lib/src/rpcsvc.c
@@ -2016,7 +2016,9 @@ out:
inline int
rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)
{
- int ret = -1;
+ int ret = -1;
+ rpcsvc_program_t *newprog = NULL;
+ char already_registered = 0;
if (!svc) {
goto out;
@@ -2026,18 +2028,43 @@ rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)
goto out;
}
- INIT_LIST_HEAD (&program->program);
+ pthread_mutex_lock (&svc->rpclock);
+ {
+ list_for_each_entry (newprog, &svc->programs, program) {
+ if ((newprog->prognum == program->prognum)
+ && (newprog->progver == program->progver)) {
+ already_registered = 1;
+ break;
+ }
+ }
+ }
+ pthread_mutex_unlock (&svc->rpclock);
+
+ if (already_registered) {
+ ret = 0;
+ goto out;
+ }
+
+ newprog = GF_CALLOC (1, sizeof(*newprog),gf_common_mt_rpcsvc_program_t);
+ if (newprog == NULL) {
+ gf_log (GF_RPCSVC, GF_LOG_ERROR, "out of memory");
+ goto out;
+ }
+
+ memcpy (newprog, program, sizeof (*program));
+
+ INIT_LIST_HEAD (&newprog->program);
pthread_mutex_lock (&svc->rpclock);
{
- list_add_tail (&program->program, &svc->programs);
+ list_add_tail (&newprog->program, &svc->programs);
}
pthread_mutex_unlock (&svc->rpclock);
ret = 0;
gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New program registered: %s, Num: %d,"
- " Ver: %d, Port: %d", program->progname, program->prognum,
- program->progver, program->progport);
+ " Ver: %d, Port: %d", newprog->progname, newprog->prognum,
+ newprog->progver, newprog->progport);
out:
if (ret == -1) {