You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by Peter Steiner <pe...@hugwi.ch> on 2006/11/30 13:39:23 UTC
Re: Leak in apr_pools when using RollingFileAppender
Replying to my own mail in log4cxx-user (which should have gone to
log4cxx-dev):
My original mail didn't get all details right:
It's not a leak and it's not in apr_pools. But it happens when using a
RollingFileAppender.
It's not a leak because the memory is properly given back when the
application terminates (but only then).
It's the mutexes of some helper object used when the RollingFileAppender
does a rollover. These mutexes are allocated out of the "root pool" of
log4cxx instead out of a short lived pool. See
http://issues.apache.org/jira/browse/LOGCXX-161 for more details.
I propose a patch to fix this (see log4cxx-161-mutex.patch of LOGCXX-161).
There are two more patches attached to the JIRA issue. They are not
related to RollingFileAppender and optimise log4cxx (I hope). As for the
default threshold of 40960 in log4cxx-161-threshold.patch: this is an
arbitrary number that works fine for my application, I haven't done any
tests to back it up.
Regards, Peter
Peter Steiner wrote:
> I'm using the SVN version of log4cxx (with a patched
> propertyconfigurator, see
> http://issues.apache.org/jira/browse/LOGCXX-102).
>
> I have observed that our application increases its working set in 8k
> steps. I have tracked it down to happen whenever the log file rolls
> over:
>
> log4cxx::rolling::RollingFileAppender::rollover() (Line 153) calls
> WriterAppender::closeWriter() which allocates a new APR pool.
>
> I think the error ultimately is in allocator_free() in apr_pools.c
> and was already discussed by Brian Pane in dev@httpd.apache.org (see
> http://mail-archives.apache.org/mod_mbox/httpd-dev/200512.mbox/%3CA99202F3-A131-4656-8A68-7574C9E9062F@apache.org%3E
> for the message). I couldn't find any correction for this in the APR
> trunk, however.
>
> In my case I have observed when stepping through the code that after
> the allocation of the pool in WriterAppender::closeWriter(), the next
> call to allocator_free() comes from a FileOutputStream destructor and
> only after that the pool from closeWriter is freed.
>
> The second call to allocator_free has a current_free_index of
> (unsigned)-1 and then overwrites the node pointer in allocator->free,
> so that the first of these nodes will never be freed.
>
>
> That said I'm not sure if it makes sense that closeWriter allocates
> its own pool. Reading
> http://svn.apache.org/viewvc/apr/apr/trunk/docs/pool-design.html?view=co
> I ask myself if closeWriter should not take a pool parameter (like
> rollover already does) instead of having its own.
>
> Regards, Peter
--
_ _ Peter Steiner <pe...@hugwi.ch>
/ /_/ / Hug-Witschi AG <http://www.hugwi.ch/>
/ _ / Electronic Engineering
/_/ /_/ _ _ Auriedstrasse 10
/ / / / / / CH-3178 Boesingen
/ /_/ /_/ / Tel +41 31 740 44 44
/_ _ _ _ _/ Fax +41 31 740 44 45