tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: ping: sendto: No buffer space available



On Sun, 9 Oct 2011 17:36:06 -0700
Erik Fair <fair%netbsd.org@localhost> wrote:

> On second thought, the kernel should block on that condition, unless the 
> user code has explicitly set a non-blocking flag (and thus indicated its 
> ability/willingness to handle the "queue is full" error with appropriate 
> behavior). Otherwise, we're simply going to get naive application code 
> that bangs away at sending without appropriate exponential backoff.
> 
> Yes, this is an API change. Alternative suggestions welcome.

In general, I expect write(2)/sendmsg(2)/friends to error on EINTR and
need to be restarted, or EAGAIN in non-blocking mode, or to report a
short byte count, but it's legitimate to drop the connection if more
serious errors occur.  Should ENOBUFS be considered like EAGAIN and
always be considered restartable/recoverable?  The current difference
is that in non-blocking mode EAGAIN would not occur, the socket would
block.  Then it'd also make sense to me to block in blocking mode for
ENOBUFS like you suggest.  In non-blocking mode, should it however
still error with ENOBUFS?  Why not EAGAIN then?

Of course, in non-blocking mode and with polling, I'd also not expect
spurious POLLOUT events if the next write is about to error with
ENOBUFS, ideally...  This might complicate things if the syscall I/O
layer lacks inside information about the driver's state, though.
-- 
Matt


Home | Main Index | Thread Index | Old Index