Okay, found the source of the memory leak. The problem goes right back
to 3.1.4 which also has the problem when tested.

The problem code is in python_handler() in 'src/mod_python.c'. Specifically
the code does:

    if (!hle) {
/* create a handler list object from dynamically registered handlers */ request_obj->hlo = (hlistobject *)MpHList_FromHLEntry (dynhle, 1);
    }
    else {
        /* create a handler list object */
        request_obj->hlo = (hlistobject *)MpHList_FromHLEntry(hle, 1);

        /* add dynamically registered handlers, if any */
        if (dynhle) {
            MpHList_Append(request_obj->hlo, dynhle);
        }
    }

Problem is that request_obj->hlo can already be set by a prior phase's
handler and by simply assigning to request_obj->hlo you get a memory
leak as it is a Python object and it isn't being decref'd.

Thus, before this 'if' statement, it would appear that the following should
be inserted.

    if (request_obj->hlo)
        Py_DECREF(request_obj->hlo);

or:

    Py_XDECREF(request_obj->hlo);

Still need to do some more checking, but adding that seems to get rid of
the problem.

Now what do we do about 3.2.10? Given that this thing leaks really badly
when triggered shows that no one must be using multiple handler phases
at the same time, so may be safe to still release 3.2.10 and we fix it in next
backport release and 3.3.

Comments.

Graham

On 31/07/2006, at 7:24 PM, Graham Dumpleton wrote:

The good news is that this isn't a problem introduced with mod_python 3.2.10
so doesn't necessarily have to stop that being released.

The bad news though is that is is also in mod_python 3.2.8, so it has been
there for some time.

The question now is whether anyone else sees it on other platforms or whether
it is something specific to my machine.

Graham

On 31/07/2006, at 4:53 PM, Graham Dumpleton wrote:

I get it on Apache 2.0.59 as well. :-(

I will thus be interested to see what others get, as appears to be an existing
mod_python issue.

BTW, this is with worker MPM.

Graham

Graham Dumpleton wrote ..
I am using Apache 2.2.2 and when using mod_python in a certain way, I am
seeing
significant ongoing increases in memory use by Apache child processes. Initially I thought I had stuffed up recent changes in mod_python 3.3 out
of
subversion trunk that I had been making, but I went back to mod_python
3.2.10
and am seeing the same problem.

Can some one please run the following test and use "top" or some other
means of
monitoring memory use to see if you can duplicate the problem. The test
is really
quite simple actually.

# .htaccess

PythonFixupHandler handlers
AddHandler mod_python .py
PythonHandler handlers

# handlers.py

from mod_python import apache

def handler(req):
  req.content_type = 'text/plain'
  req.write('handler')
  return apache.OK

def fixuphandler(req):
  return apache.OK

The command I have been using to test is:

ab -c 1 -n 5000 http://localhost:8082/~grahamd/MODPYTHON-155/ hello.py

What is strange is that if I have only the fixup handler or response handler invoked and not both, then memory leak isn't present. It is only when both
are
being invoked that it leaks memory.

This occurs for me on Mac OS X 10.4, Python 2.3.5 and Apache 2.2.2, with either mod_python 3.2.10 or mod_python 3.3. I haven't yet tested with older Apache 2.0.58 as yet as don't have it on my box at present, but will download
it and see if that makes a difference.

I guess what I am trying to working out is if this is an issue with Apache
2.2.2
or whether it is mod_python and problem has been there for a while. Thus
if
people with both Apache 2.0.X and Apache 2.2.X could test it it would be
great.

Any help appreciated.

Thanks.

Graham

Reply via email to