Oh, SIGPIPE, my old nemesis. I should have guessed! I think it's time to block SIGPIPE everywhere... It's much better to get EPIPE than to use a signal handler for this. regards, Colin On Thu, Mar 3, 2011 at 12:55 PM, Yehuda Sadeh Weinraub <yehudasa@xxxxxxxxx> wrote: > On Thu, Mar 3, 2011 at 12:47 PM, Jim Schutt <jaschut@xxxxxxxxxx> wrote: >> Has something maybe changed in signal handling recently? >> >> Maybe SIGPIPE used to be blocked, and sendmsg() would >> return -EPIPE, but now it's not blocked and not handled? >> >> This bit in linux-2.6.git/net/core/stream.c is what made >> me wonder, but maybe it's a red herring: >> >> int sk_stream_error(struct sock *sk, int flags, int err) >> { >> if (err == -EPIPE) >> err = sock_error(sk) ? : -EPIPE; >> if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) >> send_sig(SIGPIPE, current, 0); >> return err; >> } > > It was actually just changed at > 35c4a9ffeadfe202b247c8e23719518a874f54e6, so if you're on latest > master then it might be it. You can try reverting that commit, or can > try this: > > index da22c7c..6f746d4 100644 > --- a/src/msg/SimpleMessenger.cc > +++ b/src/msg/SimpleMessenger.cc > @@ -1991,7 +1991,7 @@ int SimpleMessenger::Pipe::do_sendmsg(int sd, > struct msghdr *msg, int len, bool > assert(l == len); > } > > - int r = ::sendmsg(sd, msg, more ? MSG_MORE : 0); > + int r = ::sendmsg(sd, msg, MSG_NOSIGNAL | (more ? MSG_MORE : 0)); > if (r == 0) > dout(10) << "do_sendmsg hmm do_sendmsg got r==0!" << dendl; > if (r < 0) { > > > Yehuda >> >> -- Jim >> >> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html