[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openais
Subject:    Re: [Openais] [PATCH][openais] LckDispatch can get into a tight	loop
From:       "Ryan O'Hara" <rohara () redhat ! com>
Date:       2010-01-14 21:22:13
Message-ID: 20100114212213.GA7326 () redhat ! com
[Download RAW message or body]

On Thu, Jan 14, 2010 at 09:35:51AM -0700, Steven Dake wrote:
> On Thu, 2010-01-14 at 13:31 +0000, Christine Caulfield wrote:
> > On 13/01/10 20:32, Ryan O'Hara wrote:
> > > On Wed, Jan 13, 2010 at 09:58:29AM +0000, Christine Caulfield wrote:
> > >> If a callback is set to NULL and a message is received for that
> > >> callback, libSaLck will get into a tight loop because the continue
> > >> doesn't call coroipcc_dispatch_put.
> > >>
> > >> This patch fixes
> > >>
> > >> Chrissie
> > >
> > >
> > > I don't think the first 'goto dispatch_continue' is necessary (in the
> > > case where coroipcc_dispatch_get returns TRY_AGAIN.
> > 
> > Actually I think that probably is needed. Otherwise there is a 
> > coroipcc_dispatch_get() without a corresponding put. Or perhaps it ought 
> > to jump to error_put:  ?
> > 
> The patch looks good minus the part Ryan mentioned and is a great catch.
> We need this for all the other library services as well.
> 
> Ryan is correct about the incorrect use of coroipcc_dispatch_get calling
> put on TRY_AGAIN.  coroipcc_dispatch_put should only be called if
> dispatch_get returns CS_OK.  In coroipcc.c, when TRY_AGAIN is returned
> by coroipcc_dispatch_get, the original state is kept on the ipc
> connection before returning.  (ie it turns into a NOOP only returning
> TRY_AGAIN).

Also, would it be better (or at least equivalent) to replace 'continue'
with 'break'? The goto statement is fine, but I believe 'break' will
accomplish the same thing. I'd rather not add any more goto statements
if we can avoid it.

Ryan



> > 
> > Chrissie
> > 
> > > Other than that, ACK.
> > >
> > > Ryan
> > >
> > >
> > >
> > >> Index: lib/lck.c
> > >> ===================================================================
> > >> --- lib/lck.c	(revision 2097)
> > >> +++ lib/lck.c	(working copy)
> > >> @@ -332,7 +332,7 @@
> > >>   			if (dispatchFlags == CPG_DISPATCH_ALL) {
> > >>   				break;
> > >>   			} else {
> > >> -				continue;
> > >> +				goto dispatch_continue;
> > >>   			}
> > >>   		}
> > >>   		if (error != CS_OK) {
> > >> @@ -345,7 +345,7 @@
> > >>   		switch (dispatch_data->id) {
> > >>   		case MESSAGE_RES_LCK_RESOURCEOPEN_CALLBACK:
> > >>   			if (callbacks.saLckResourceOpenCallback == NULL) {
> > >> -				continue;
> > >> +				goto dispatch_continue;
> > >>   			}
> > >>   			res_lib_lck_resourceopen_callback =
> > >>   				(struct res_lib_lck_resourceopen_callback *)dispatch_data;
> > >> @@ -374,7 +374,7 @@
> > >>
> > >>   		case MESSAGE_RES_LCK_LOCKGRANT_CALLBACK:
> > >>   			if (callbacks.saLckLockGrantCallback == NULL) {
> > >> -				continue;
> > >> +				goto dispatch_continue;
> > >>   			}
> > >>   			res_lib_lck_lockgrant_callback =
> > >>   				(struct res_lib_lck_lockgrant_callback *)dispatch_data;
> > >> @@ -421,7 +421,7 @@
> > >>
> > >>   		case MESSAGE_RES_LCK_LOCKWAITER_CALLBACK:
> > >>   			if (callbacks.saLckLockWaiterCallback == NULL) {
> > >> -				continue;
> > >> +				goto dispatch_continue;
> > >>   			}
> > >>   			res_lib_lck_lockwaiter_callback =
> > >>   				(struct res_lib_lck_lockwaiter_callback *)dispatch_data;
> > >> @@ -451,7 +451,7 @@
> > >>
> > >>   		case MESSAGE_RES_LCK_RESOURCEUNLOCK_CALLBACK:
> > >>   			if (callbacks.saLckResourceUnlockCallback == NULL) {
> > >> -				continue;
> > >> +				goto dispatch_continue;
> > >>   			}
> > >>   			res_lib_lck_resourceunlock_callback =
> > >>   				(struct res_lib_lck_resourceunlock_callback *)dispatch_data;
> > >> @@ -498,6 +498,7 @@
> > >>   		default:
> > >>   			break;
> > >>   		}
> > >> +	dispatch_continue:
> > >>   		coroipcc_dispatch_put (lckInstance->ipc_handle);
> > >>
> > >>   		switch (dispatchFlags) {
> > >
> > >> _______________________________________________
> > >> Openais mailing list
> > >> Openais@lists.linux-foundation.org
> > >> https://lists.linux-foundation.org/mailman/listinfo/openais
> > 
> > _______________________________________________
> > Openais mailing list
> > Openais@lists.linux-foundation.org
> > https://lists.linux-foundation.org/mailman/listinfo/openais
_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic