rgmanager: Fix for deadlock
PATCH 1/1 rgmanager: Fix for deadlock
This patch fixes a deadlock in rgmanager that could occur when a node starts rgmanager while a service is recovering.
Resolves: rhbz#834459
Signed-off-by Ryan McCabe <[email protected]>
--- rgmanager/src/daemons/rg_state.c | 1 + rgmanager/src/daemons/rg_thread.c | 17 ++++++++++++++++- rgmanager/src/daemons/service_op.c | 1 + 3 files changed, 18 insertions(+), 1 deletion(-)
rgmanager/src/daemons/rg_state.c +1 -0
@@ -2009,6 +2009,7 @@ retry:/* Deliberate */ case RG_EDEPEND :case RG_EFAIL : +case RG_EDEADLCK :/* Uh oh - we failed to relocate to this node. ensure that we tell the next node to start it from the 'recovering' state. */
rgmanager/src/daemons/rg_thread.c +16 -1
@@ -23,6 +23,7 @@#include <rg_queue.h> #include <assert.h> #include <members.h> +#include <clulog.h> /** * Resource thread list entry.
@@ -749,13 +750,27 @@ rt_enqueue_request(const char *resgroupname, int request,msg_free_ctx (response_ctx);break ; } -fprintf (stderr,"Failed to queue request: Would block\n" ); +pthread_mutex_unlock (resgroup->rt_queue_mutex); +pthread_mutex_unlock (&reslist_mutex); +clulog (LOG_DEBUG ,"Failed to queue request: Would block\n" );/* EWOULDBLOCK */ +return -1 ; + } + +if (resgroup->rt_request ==RG_START && + (request ==RG_START_REMOTE || request ==RG_START_RECOVER )) { +send_ret (response_ctx, resgroup->rt_name,RG_EDEADLCK , + request,0 ); +msg_free_ctx (response_ctx);pthread_mutex_unlock (resgroup->rt_queue_mutex);pthread_mutex_unlock (&reslist_mutex); +clulog (LOG_DEBUG , +"Failed to queue %d request for %s: Would block\n" , + request, resgroupname);return -1 ; } + ret =rq_queue_request (resgroup->rt_queue, resgroup->rt_name, request,0 ,0 , response_ctx,0 , target, arg0, arg1);
rgmanager/src/daemons/service_op.c +1 -0
@@ -82,6 +82,7 @@ service_op_start(char *svcName, ++dep;continue ;case RG_EFAIL : +case RG_EDEADLCK : ++fail;continue ;case RG_EABORT :
Signature · 1 line
1.7.11.4
PATCH 1/1 rgmanager: Fix for deadlock
Quoted 6 lines · Ryan McCabe
This patch fixes a deadlock in rgmanager that could occur when a node starts rgmanager while a service is recovering.
Resolves: rhbz#834459
Signed-off-by Ryan McCabe <[email protected]>
That looks like a RHEL5 port of the same patch.
Ack.
-- Lon