[Gluster-devel] glusterd crashes when synctask is used in conjunction with inner functions.

Krishnan Parthasarathi kparthas at redhat.com
Mon Oct 8 18:14:08 UTC 2012



----- Original Message -----
> From: "Jeff Darcy" <jdarcy at redhat.com>
> To: "Krishnan Parthasarathi" <kparthas at redhat.com>
> Cc: gluster-devel at nongnu.org
> Sent: Monday, October 8, 2012 11:16:11 PM
> Subject: Re: [Gluster-devel] glusterd crashes when synctask is used in conjunction with inner functions.
> 
> On 10/08/2012 01:21 PM, Krishnan Parthasarathi wrote:
> > FWIW, inner functions also make it harder to debug with gdb (read
> > breakpoints).
> > I am yet to demonstrably establish that inner functions' would
> > crash when run in synctask. I hope some of you might be able to
> > shed
> > light on how I could resolve that.
> 
> I think to answer that, we'd need to examine how inner functions are
> (or at
> least might be) implemented.  The fundamental problem is how the
> inner function
> actually accesses variables within the outer function's local scope.
>  For a
> direct call from outer to inner, it's pretty easy - it's just another
> set of
> stack offsets.  Otherwise, the inner function needs a pointer to the
> outer
> function's stack frame.  How does it get that?  Functions in between
> might be
> totally obvlivious to this pointer (it's not in their argument lists)
> so you
> can't just pass it directly.  They can't be stored directly in
> function
> pointers either, for similar reasons.  The only seemingly workable
> option would
> be to generate a "thunk" dynamically, something like this:
> 
> 	int
> 	real_inner_function (void *outer_frame, int arg)
> 	{
> 		/* Same as user's function but with extra arg. */
> 	}
> 
> 	int
> 	inner_function (int arg)
> 	{
> 		real_inner_function(COMPILE_TIME_CONSTANT,arg);

Shouldn't the outer frame's address be RUNTIME_CONSTANT? 

> 	}
> 
> So now a pointer to inner_function is actually a pointer to a
> specific
> invocation within the context of an outer-function call.  What
> happens when
> that outer function returns?  Uh oh.  Is any of this safe in the

In my patch, the outer function wouldn't return before the inner
function returns. I guess we could rule that out here.

> presence of
> both pthreads and ucontext threads?  Uh oh again, and we do use both
> in our
> synctask implementation.  Hmmm.  In a way, we're doing almost

An earlier gluster-devel discussion on pthread and ucontext threads
and long jmps if I am not wrong, lead to me hypothesise that inner functions
may not work well with synctask.

> everything we can
> to trip up gcc's inner-function implementation, so it's kind of no
> surprise
> that we've succeeded.
> 
> I haven't actually examined the gcc code to see if that's how inner
> functions
> are implemented.  There are other possibilities, but most are equally
> susceptible to our threading shenanigans.  The real proof point is
> whether the
> problems go away if we stop using inner functions.  There aren't too
> many uses

I do observe in my patch that the crash I observed goes away when I stop
using inner functions in the 'affected' code path. Which is why I was
convinced myself that I could submit my patch for review and root cause
why inner functions won't work with synctask asynchronously :-)

> currently, so it shouldn't be a prohibitively difficult experiment,
> and if
> you're right that inner functions to blame then we don't need to
> figure out
> why.  We should just stop using them.

Thanks for the explanation!
> 
> 		
> 
> 

~krish




More information about the Gluster-devel mailing list