[mod_python] ioerrors with worker thread mpm

Graham Dumpleton graham.dumpleton at gmail.com
Wed Dec 10 23:33:27 EST 2008


2008/12/11 Michael Barton <mike at weirdlooking.com>:
> Yes, sorry.  The exceptions I've seen are raised by sendall and recv
> on socket objects inside httplib, which is connected to a service.  I
> can reproduce this with a very simple handler like,
>
>  from mod_python import apache
>  from socket import socket
>
>  def handler(req):
>      s = socket()
>      s.connect(('localhost', 80))
>      s.recv(1024)
>      return apache.OK
>
> Make a request to that handler, which will obviously not return any
> time soon.  Then hit the server enough times that it reaches
> MaxRequestsPerChild.  And,
>
> ...
>  File "/home/redbo/test/modpython_handler.py", line 7, in handler\n
>  s.recv(1024)
> error: (4, 'Interrupted system call')

Apache doesn't appear to use SA_RESTART when registering signal
handlers, so yes, it means that system calls interrupted by a signal
will not be restarted. This is quite normal behaviour and typically
programs should be written to detect an EINTR and retry the system
library function call being done if they need to be robust in the face
of such an event. That is, code which would run in an unknown
environment, can't assume system calls will be restarted.

The EAGAIN error is different and doubtful it is cause by signals.
What EAGAIN means will depend on what system library call is being
used. For recv() it means:

     [EAGAIN]           The socket is marked non-blocking, and the receive
                        operation would block, or a receive timeout had been
                        set, and the timeout expired before data were
                        received.

Graham

> On Wed, Dec 10, 2008 at 9:19 PM, Graham Dumpleton
> <graham.dumpleton at gmail.com> wrote:
>> Blocking i/o operations against what? Sockets you have created off to
>> something else????
>>
>> 2008/12/11 Michael Barton <mike at weirdlooking.com>:
>>> Hey list!
>>>
>>> I'm having a problem adapting a mod_python-based app to work with
>>> Apache's worker thread mpm.
>>>
>>> When the process hits MaxRequestsPerChild under a high concurrency of
>>> requests, blocking i/o operations in other threads on that child raise
>>> exceptions (mostly EINTR or EAGAIN IOErrors in httplib).
>>>
>>> It looks like system calls are being interrupted by signals Apache
>>> uses to control its children.  But that seems like a problem that
>>> would have come up before, and I can't find much by searching the web
>>> or list archives.
>>>
>>> I figured I'd punt to the list and see if anyone has other thoughts.
>>>
>>> My setup is: debian, apache 2.2.3, mod_python 3.3.1, python 2.4.4
>>>
>>> --Mike
>>> _______________________________________________
>>> Mod_python mailing list
>>> Mod_python at modpython.org
>>> http://mailman.modpython.org/mailman/listinfo/mod_python
>>>
>>
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python
>


More information about the Mod_python mailing list