http://issues.apache.org/bugzilla/show_bug.cgi?id=23567

On Mon, Jun 14, 2004 at 01:45:26PM -0600, Brad Nicholes wrote:
>    Actually I think this was addressed quite a while ago with the
> introduction of the MaxMemFree directive.  This problem sounds a lot
> like the bucket issue where memory allocated for the bucket brigade that
> pushes the data through from the CGI app to the wire, simply held on to
> the memory assuming that it would be needed later.  The MaxMemFree
> directive allowed the memory pool manager to release excess memory
> rather than allowing it to hang around.

The problem here looks exactly as Jeff diagnosed in the bug report: for
each apr_brigade_split() call by the content-length filter, a new
cleanup is allocated out of the request pool.  So for this case, you
leak 32 bytes for every 4K block produced by the CGI script as it is
being consumed faster than it's being produced, and read() keeps
returning EAGAIN from the pipe, and the filter keeps wanting to flush.

It's actually very easy to fix that leak by putting used cleanup
structures onto a freelist and re-using them, e.g.:
http://cvs.apache.org/~jorton/apr_cleanfree.diff

But that doesn't solve the problem: apr_brigade_split() pallocs another
32 bytes for the new brigade structure itself, so there's still a leak.

My naive attempts to allocate the brigade structure using either the
bucket allocator or even malloc/free broke everything in strange ways. 
So, calling bucket gurus again :) - are there fundamental reasons why
the former is not going to work?  Any better ideas?

joe

Reply via email to