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
>>
>>
> 
> 

Reply via email to