[Spread-users] Is there a limit on total traffic sent by Spread?
Jeremy Hylton
jeremy at zope.com
Sat Jan 19 21:59:01 EST 2002
>>>>> "HR" == Herbert Rubens <Herb at cnds.jhu.edu> writes:
HR> The Sess_read() method in session.c is registered to be called
HR> by the event system upon activity on a file descriptor. The
HR> event system is using select to determine whether there is at
HR> least 1 byte available to be read or that an error has occurred.
HR> Since the socket is non-blocking and it is in a select() call,
HR> it should never return EWOULDBLOCK.
There is no guarantee that a recv() call on a non-blocking will
succeed just because select() says it is ready for reading. The same
is true for send() and a socket ready for writing. I believe the
cases where this guarantee does not hold, I suspect it is always some
internal resource issue that prevents the kernel from making the
call. In these cases, the operation will succeed later.
We have a product (ZEO, http://www.zope.org/Products/ZEO) that uses
non-blocking sockets. We've had a number of failures on heavily
loaded servers that were the result of assuming that a failure in
recv() were fatal (*). We've had to fix ZEO to detect and ignore the
following errors:
recv(): EWOULDBLOCK, EAGAIN, EINTR
send(): EAGAIN, WOULDBLOCK, ENOBUFS, EINTR
I checked Stevens for more details about why these errors occur, but
there isn't any discussion. His examples of non-blocking socket code,
however, treat these errors as non-fatal.
Jeremy
* There seems to be an analog between a socket and a Spread mbox. If
there is a fatal error on a socket, the socket isn't closed. The
client continues to get errors on it until the client closes it. I
think an mbox should be have the same way. In other words, if a
client is responsible for opening the resource, it should be
responsible for closing it.
More information about the Spread-users
mailing list