From owner-freebsd-current@FreeBSD.ORG Wed Mar 6 21:24:10 2013 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 2BA49D29; Wed, 6 Mar 2013 21:24:10 +0000 (UTC) (envelope-from jilles@stack.nl) Received: from mx1.stack.nl (relay02.stack.nl [IPv6:2001:610:1108:5010::104]) by mx1.freebsd.org (Postfix) with ESMTP id B7E08934; Wed, 6 Mar 2013 21:24:09 +0000 (UTC) Received: from snail.stack.nl (snail.stack.nl [IPv6:2001:610:1108:5010::131]) by mx1.stack.nl (Postfix) with ESMTP id 70BDB3592DB; Wed, 6 Mar 2013 22:24:08 +0100 (CET) Received: by snail.stack.nl (Postfix, from userid 1677) id 537B32848C; Wed, 6 Mar 2013 22:24:08 +0100 (CET) Date: Wed, 6 Mar 2013 22:24:08 +0100 From: Jilles Tjoelker To: "Hartmann, O." Subject: Re: r247839: broken pipe - for top, sudo and ports Message-ID: <20130306212408.GA15814@stack.nl> References: <5135B7E1.3050002@zedat.fu-berlin.de> <5135BBD9.9090009@FreeBSD.org> <51364914.2010104@zedat.fu-berlin.de> <51364E8D.5020608@zedat.fu-berlin.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51364E8D.5020608@zedat.fu-berlin.de> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: FreeBSD Current , Dimitry Andric X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Mar 2013 21:24:10 -0000 On Tue, Mar 05, 2013 at 08:59:09PM +0100, Hartmann, O. wrote: > A "truss top" reveals this, is this of help? > [...] > stat("/etc/nsswitch.conf",{ mode=-rw-r--r-- > ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0) > stat("/etc/nsswitch.conf",{ mode=-rw-r--r-- > ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0) > stat("/etc/nsswitch.conf",{ mode=-rw-r--r-- > ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0) > stat("/etc/nsswitch.conf",{ mode=-rw-r--r-- > ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0) > stat("/etc/nsswitch.conf",{ mode=-rw-r--r-- > ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0) > socket(PF_LOCAL,SOCK_STREAM,0) = 4 (0x4) > connect(4,{ AF_UNIX "/var/run/nscd" },15) = 0 (0x0) > fcntl(4,F_SETFL,O_NONBLOCK) = 0 (0x0) > kqueue(0x80183b000,0x80122fc58,0x10,0x80062b308,0x80183b010,0x2) = 5 (0x5) > kevent(5,{0x4,EVFILT_WRITE,EV_ADD,0,0x0,0x0},1,0x0,0,0x0) = 0 (0x0) > kqueue(0x5,0x7fffffffd2e0,0x1,0x0,0x0,0x0) = 6 (0x6) > kevent(6,{0x4,EVFILT_READ,EV_ADD,0,0x0,0x0},1,0x0,0,0x0) = 0 (0x0) > kevent(5,{0x4,EVFILT_WRITE,EV_ADD,1,0x4,0x0},1,0x0,0,0x0) = 0 (0x0) > kevent(5,0x0,0,{0x4,EVFILT_WRITE,EV_EOF,0,0x2000,0x0},1,0x0) = 1 (0x1) > sendmsg(0x4,0x7fffffffd290,0x0,0x1,0x1,0x0) ERR#32 'Broken pipe' > SIGNAL 13 (SIGPIPE) > process exit, rval = 0 Apparently there is a bug that causes nscd to close the connection immediately but even then it is wrong that this terminates the calling program with SIGPIPE. The below patch prevents the SIGPIPE but cannot revive the connection to nscd. This may cause numeric UIDs in top or increase the load on the directory server. It is compile tested only. Index: lib/libc/net/nscachedcli.c =================================================================== --- lib/libc/net/nscachedcli.c (revision 247710) +++ lib/libc/net/nscachedcli.c (working copy) @@ -75,9 +75,9 @@ nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1, &timeout); if ((nevents == 1) && (eventlist.filter == EVFILT_WRITE)) { - s_result = _write(connection->sockfd, data + result, + s_result = send(connection->sockfd, data + result, eventlist.data < data_size - result ? - eventlist.data : data_size - result); + eventlist.data : data_size - result, MSG_NOSIGNAL); if (s_result == -1) return (-1); else @@ -175,8 +175,8 @@ nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1, NULL); if (nevents == 1 && eventlist.filter == EVFILT_WRITE) { - result = (_sendmsg(connection->sockfd, &cred_hdr, 0) == -1) ? - -1 : 0; + result = (_sendmsg(connection->sockfd, &cred_hdr, + MSG_NOSIGNAL) == -1) ? -1 : 0; EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD, 0, 0, NULL); _kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL); -- Jilles Tjoelker