[ http://issues.apache.org/jira/browse/MODPYTHON-184?page=comments#action_12430396 ] Graham Dumpleton commented on MODPYTHON-184: --------------------------------------------
The cause of this seems to result from the following. 1. The apache.make_table attribute is actually an alias for the type object for "mp_table". 2. Calling apache.make_table() invokes the table_new() method of the "mp_table" type. 3. The table_new() method in turn calls table_alloc() of the "mp_table" type. 4. In table_alloc() it calls MpTable_New() which creates a whole and complete "mp_table" object instance. 5. After table_alloc() returns to table_new(), the code following duplicates the creation process again creating a new "mp_table" object instance which replaces the first one created. The first one created is now no longer accessible. The problematic code is: self = type->tp_alloc(type, 0); if (self != NULL) { apr_pool_t *p; tableobject *t = (tableobject *)self; apr_pool_create_ex(&p, NULL, NULL, NULL); t->pool = p; t->table = apr_table_make(p, 2); } I think it may be a simple case of the 'if' clause being the wrong way around. Ie., should be: self = type->tp_alloc(type, 0); if (!self) { apr_pool_t *p; tableobject *t = (tableobject *)self; apr_pool_create_ex(&p, NULL, NULL, NULL); t->pool = p; t->table = apr_table_make(p, 2); } In fact, since table_alloc() always returns a non NULL value, it could just be: self = type->tp_alloc(type, 0); The issue now is what is the difference between tp_alloc and tp_new hooks in a Python type object object. I haven't used these in a while, so will have to research some more as to what is meant to occur in each. > 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.3, 3.2.10 > Reporter: Jim Gallacher > Assigned To: Jim Gallacher > Fix For: 3.3 > > > 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 will have an impact on FieldStorage which makes use of > apache.make_table(), which is the deprecated name for apache.table() -- 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