Alexis Marrero wrote:
> Jim,
>
> This are my results for the memory leak search in apache.table().
>
> The table object creates a memory pool by using apr_pool_create_ex() and
> destroys the pool using apr_pool_destroy(). I added a line in
> MpTable_New() before "return (PyObject*)t" to destroy the pool and ran
> 1M iterations and I notice that there was no memory leak. Therefore the
> apache functions seems to be working fine.
That's weird though, because I stuffed some printf's into table_dealloc,
and apr_pool_destroy(self->pool) is getting called.
> I couldn't fix the problem but here is a work around. In
> mod_python/util.py instead of using apache.make_table() use a regular
> Python dictionary. So the line that looks like:
>
> headers = apache.make_table()
>
> now looks like:
>
> headers = {}
>
> The apache table is basically used a Python dictionary. The only
> functionality that is lost is that apache tables are case insensitive,
> and that can be easily fixed by creating a class in Python that inherits
> from dict type and override the __getitem__ and __setitem__ methods.
I had considered the idea of using a standard python dict, but there is
one other difference that may be important. Apache tables (and therefore
the mp_table wrapper) can have duplicate keys. I'd rather we didn't
create a whole new class for use in FieldStorage.
> For the moment I'm going to keep this changes until modpython.org
> release a patch. I spent quite sometime trying to investigate and solve
> the memory leak problem but the best I was able to do was to work around
> it.
This workaround may be fine for your application where you control what
is being POSTed, but I'm not so sure about it as a general solution as
the change may break other apps.
> BTW, apache.table, apache.make_table or _apache.table is only being
> used in mod_python/util.py.
True, but the mp_table wrapper is used extensively within mod_python,
but these table instances are created using MpTable_FromTable() rather
than MpTable_New(). I'd like to understand why we are getting leak with
MpTable_New(), as it may point to some other bug in mp_table.
BTW, thanks for the time you've spent digging into these leaks.
Jim
>
> /amn
>
> On Aug 13, 2006, at 12:01 PM, Jim Gallacher (JIRA) wrote:
>
>> Memory leak apache.table()
>> --------------------------
>>
>> Key: MODPYTHON-184
>> URL: http://issues.apache.org/jira/browse/MODPYTHON-184
>> Project: mod_python
>> Issue Type: Bug
>> Components: core
>> Affects Versions: 3.2.10, 3.3
>> Reporter: Jim Gallacher
>> Assigned To: Jim Gallacher
>>
>>
>> There is a memory leak in apache.table().
>>
>> from mod_python import apache
>>
>> def handler(req):
>> req.content_type = 'text/plain'
>> t = apache.make_table()
>>
>> req.write('ok table:')
>> return apache.OK
>>
>> Using mpm-worker with StartServers 2, and 20000 requests results in
>> memory consumption going from 1.2% to 9.3% per process. (ie approx 8k
>> per request)
>>
>>
>>
>>
>> --This message is automatically generated by JIRA.
>> -
>> If you think it was sent incorrectly contact one of the
>> administrators: http://issues.apache.org/jira/secure/Administrators.jspa
>> -
>> For more information on JIRA, see: http://www.atlassian.com/software/jira
>>
>>
>
>