Errno 35 in Python's socket.sendall() under OS XA slightly misleading error message
A little while ago, on the python-help mailing
list, a question came up that took a bit of work to find the answer to. Since
that list's archives aren't public and Google doesn't seem to have indexed a
page with a good discussion of the issue, I thought I'd post about it here (with
the original poster's permission, of
course).
The poster was using Python 2.6.2 under Mac OS X 10.6.2. The poster was using Python's ftplib module to upload certain files and some of them would fail consistently with the same number of bytes transferred and with a traceback that ended with: File "/Library/Frameworks/Python.framework/Versions/ 2.6/lib/python2.6/ftplib.py", line 452, in storbinary conn.sendall(buf) File "<string>", line 1, in sendall error: [Errno 35] Resource temporarily unavailable It's pretty clear from that that the OS was temporarily running out of network buffers. But why doesn't the socket's send() method just block until it completes? The reason is that a socket timeout had been set. If you set a socket timeout in Python (whether through the socket module or something that uses the socket module), sockets are set to be non-blocking "under the covers". (That's pretty much the only way to implement that feature.) It's a somewhat awkward side-effect of doing that that errors resulting from timeouts don't always look like what they are. [Edited April 27, 2010; the earlier version of this post was based on an incomplete understanding of the problem.] Posted: Wed - April 21, 2010 at 07:37 PM Main Category: |
Quick Links
Calendar
Categories
Archives
XML/RSS Feed
Me
Statistics
Total entries in this blog:
Total entries in this category: Published On: Jun 15, 2010 08:56 PM |