Re: r247839: broken pipe - for top, sudo and ports

看板FB_current作者時間12年前 (2013/04/27 13:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串8/13 (看更多)
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 _______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
文章代碼(AID): #1HUsBaBk (FB_current)
討論串 (同標題文章)
文章代碼(AID): #1HUsBaBk (FB_current)