[mod_python] OS X / Apache 2 / mod_python bug

Graham Dumpleton grahamd at dscpl.com.au
Tue Mar 15 16:31:30 EST 2005


Thanks for going to all the effort, a lot of times when suggesting 
things on
the mailing list, you simply never hear from people again, so you have 
no
idea if what you suggested worked or not.

See further suggestions below.

On 16/03/2005, at 7:25 AM, Jamie Kirkpatrick wrote:
>> At this point things get a bit trickier as one is dealing with the C 
>> code.
>> It is worth noting though that most instances of where a 500 response 
>> are
>> generated in the mod_python.c file are preceded by message logging. 
>> The
>> only ones that aren't are all of the form:
>>
>>     /* get/create interpreter */
>>     idata = get_interpreter(interp_name, req->server);
>>
>>     if (!idata)
>>         return HTTP_INTERNAL_SERVER_ERROR;
>>
>> Not being able to get/create the interpreter is pretty severe and if 
>> that
>> was happening then no Python code at all would be getting executed. I 
>> am
>> not sure why this situation couldn't be logged as well. Thus instead 
>> of
>> that above, have:
>>
>>     if (!idata) {
>>         ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, req,
>>                       "python_handler: Can't get/create 
>> interpreter.");
>>
>>         return HTTP_INTERNAL_SERVER_ERROR;
>>     }
>
> OK - so this does indeed seem to be the case.  On a restart I get the 
> message logged:
>
> [Tue Mar 15 20:20:55 2005] [notice] Apache/2.0.53 (Unix) DAV/2 
> mod_python/3.1.3 Python/2.4 configured -- resuming normal operations
> [Tue Mar 15 20:20:59 2005] [error] [client 192.168.2.2] 
> python_handler: Can't get/create interpreter.

Next thing to try would be to add logging inside the get_interpreter() 
function.
Suggest logging the "name" input parameter supplied to the function, 
but more
importantly log whether the "interpreters" global variable is actually 
set when
the function is being called. Ie.,

     if (!interpreters) {
         ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, req,
                       "python_handler: interpreters dictionary not 
initialised.");
         return NULL;
     }

There is a return near the end of the function as well which doesn't 
log anything
which you could add something for as well.

         if (!idata->obcallback)
         {
#ifdef WITH_THREAD
             PyEval_ReleaseThread(tstate);
#endif
             PyThreadState_Delete(tstate);
             ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, req,
                       "python_handler: no interpreter callback found.");

             return NULL;
         }

When I get a chance I'll have a look at how "interpreters" gets set and 
what problems
could result. Wander if my Mac OS X patch screws this up in some cases.

Graham



More information about the Mod_python mailing list