sosend returning ERESTART
Konstantin Belousov
kostikbel at gmail.com
Wed Jan 18 10:36:57 UTC 2017
On Wed, Jan 18, 2017 at 04:37:40AM +0000, Colin Percival wrote:
> On 01/17/17 02:06, Konstantin Belousov wrote:
> > On Tue, Jan 17, 2017 at 04:57:23AM +0000, Colin Percival wrote:
> >> I think I've tracked an NFS problem down to sosend returning ERESTART; it
> >> looks like it's easy to work around this, but I'm not sure *why* sosend is
> >> returning ERESTART... or for that matter *how* since I can't find anywhere
> >> in relevant code where that gets returned.
> > ERESTART is most likely returned by msleep(9) or similar call down the
> > path when unblocked signal is pending with the restart disposition.
>
> Thanks, looks like that was exactly it -- if the TCP send buffer was full
> we would call sbwait, and if a signal arrived it would return ERESTART.
> It looks like setting the SB_NOINTR flag will prevent this; I'm testing a
> patch right now.
>
> (Google bait in case anyone else trips over this: FreeBSD 11.0 NFS client
> dropping TCP connections under concurrent I/O load.)
Note that passing SB_NOINTR unconditionally or even only for mounts
with nointr (default) option is wrong. You make the socket operation
uninterruptible, process terminate-ability becomes depended on the
external factor, the behaviour of the remote system.
More information about the freebsd-net
mailing list