Perhaps this should be discussed on the serf dev list?  Or an issue filed in
their tracker?


On 11/19/2012 10:09 AM, Stefan Fuhrmann wrote:
> On Mon, Nov 19, 2012 at 2:44 PM, Philip Martin <philip.mar...@wandisco.com
> <mailto:philip.mar...@wandisco.com>> wrote:
> 
>     Philip Martin <philip.mar...@wandisco.com
>     <mailto:philip.mar...@wandisco.com>> writes:
> 
>     > Stefan Fuhrmann <stefan.fuhrm...@wandisco.com
>     <mailto:stefan.fuhrm...@wandisco.com>> writes:
>     >
>     >> On Mon, Nov 19, 2012 at 12:24 PM, Philip Martin
>     >> <philip.mar...@wandisco.com <mailto:philip.mar...@wandisco.com>>wrote:
>     >>
>     >>> Stefan Fuhrmann <stefan.fuhrm...@wandisco.com
>     <mailto:stefan.fuhrm...@wandisco.com>> writes:
>     >>>
>     >>> > As it turns out, your commit has only be the trigger but
>     >>> > not the root cause.
>     >>> >
>     >>> > serf_trunk/allocator.c, serf_bucket_allocator_create(), line 147:
>     >>> >
>     >>> >     /* ### this implies buckets cannot cross a fork/exec. desirable?
>     >>> >      *
>     >>> >      * ### hmm. it probably also means that buckets cannot be AROUND
>     >>> >      * ### during a fork/exec. the new process will try to clean 
> them
>     >>> >      * ### up and figure out there are unfreed blocks...
>     >>> >      */
>     >>> >     apr_pool_cleanup_register(pool, allocator,
>     >>> >                               allocator_cleanup, allocator_cleanup);
>     >>> >
>     >>> > Since we fork() for hooks, we can't use hooks in ra_local
>     >>> > while there is an open serf connection. Otherwise, we get
>     >>> > into trouble with pool cleanups:
>     >>>
>     >>> Does it ever make sense for the child process to run that handler?  Is
>     >>> that to allow a parent process to allocate a serf connection and then
>     >>> fork off a child process to use the connection?
> 
>     If the processes were behaving like that the child cleanup handlers
>     would not be involved.
> 
>     >>
>     >> From the comments in APR/threadproc/unix/proc.c,
>     >> it seems that apr_proc_create runs *all* pool cleanups
>     >> in the child process to clean up duplicated file handles
>     >> and such.
>     >
>     > apr_proc_create runs the child cleanup handlers.  Note that two handlers
>     > are passed to _register, one for the parent one for the child.  I'm
>     > asking why serf installs a child handler rather than passing
>     > apr_pool_cleanup_null.
> 
>     The cleanup handler is just releasing memory via apr_allocator_free. I
>     see no reason for it to be installed as a child cleanup handler.
> 
> 
> Simply patching serf fixes the problem for me.
> 
> -- Stefan^2.
> 
> [[[
> Index: buckets/allocator.c
> ===================================================================
> --- buckets/allocator.c    (revision 1685)
> +++ buckets/allocator.c    (working copy)
> @@ -151,7 +151,7 @@
>       * ### up and figure out there are unfreed blocks...
>       */
>      apr_pool_cleanup_register(pool, allocator,
> -                              allocator_cleanup, allocator_cleanup);
> +                              allocator_cleanup, apr_pool_cleanup_null);
>  
>      return allocator;
>  }
> ]]]
> 
> -- 
> Certified & Supported Apache Subversion Downloads:
> /
> 
> http://www.wandisco.com/subversion/download
> 
> /


-- 
C. Michael Pilato <cmpil...@collab.net>
CollabNet   <>   www.collab.net   <>   Enterprise Cloud Development

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to