On Thu, Feb 27, 2020 at 9:41 AM Robert Engels <reng...@ix.netcom.com> wrote:
>
>
> I re-read your comments, and I agree that a rare error is still and error, 
> and needs to be handled, but if it the platform is introducing lots of 
> errors, is that the library writers issue?
>
> Maybe an easy solution is a flag to disable the signal usage for tight-loop 
> preemption as a "backwards compatibility" mode ?
>
> As the OP pointed out, he can't really change ZeroMQ, and this is a fairly 
> established product, maybe more so than Go, so doesn't it make more sense 
> that Go adapts rather than the other way around?

We already have that flag: GODEBUG=noasyncpreempt=1.

The discussion upthread explains that the Go wrapper for ZeroMQ should
handle EINTR, and take the appropriate action such as retrying the
operation when appropriate.  The response to that was a bit of
distraction, as it discussed generic problems with EINTR.  At this
point there is no reason to assume that any of those problems actually
apply to using ZeroMQ.

Ian



> -----Original Message-----
> >From: Ian Lance Taylor <i...@golang.org>
> >Sent: Feb 27, 2020 9:51 AM
> >To: Robert Engels <reng...@ix.netcom.com>
> >Cc: Michael Jones <michael.jo...@gmail.com>, Manlio Perillo 
> ><manlio.peri...@gmail.com>, golang-nuts <golang-nuts@googlegroups.com>
> >Subject: Re: [go-nuts] Re: Lot's of test errors in package zmq4 with Go 
> >version 1.14, no errors with earlier versions
> >
> >On Wed, Feb 26, 2020 at 8:36 PM Robert Engels <reng...@ix.netcom.com> wrote:
> >>
> >> The problem is that Go designers are taking the position that any sys call 
> >> should be able to be interrupted. This is invalid. For the vast majority 
> >> or “unix” os an interrupt is a very rare condition and so they treat it as 
> >> an error. If you issue interrupts continually you are creating an 
> >> unexpected context.
> >
> >You're right, I do disagree.  I don't think it's the Go developers who
> >are taking that position.  It's the Unix library developers.  While a
> >main program can make its own choices about signals, a library has to
> >consider the possibility that it will be included in a program that
> >uses signals.  A rare error is still an error.  Just because Go 1.14
> >interrupts system calls more often doesn't mean the system calls were
> >not interrupted.  And non-Go programs use signals too, e.g. SIGURG and
> >SIGIO.
> >
> >Ian
> >
> >
> >> > On Feb 26, 2020, at 8:39 PM, Ian Lance Taylor <i...@golang.org> wrote:
> >> >
> >> > On Wed, Feb 26, 2020 at 5:51 PM Michael Jones <michael.jo...@gmail.com> 
> >> > wrote:
> >> >>
> >> >> Sorry...I meant the go system signal interface could loop if desired. 
> >> >> (Not recommending, just saying that panicky people could be coddled if 
> >> >> desired)
> >> >
> >> > Ah, I see.  Except, no, I don't.  Could we really do that?  Even if
> >> > the signal arrived while executing some function written in C and
> >> > called via cgo?
> >> >
> >> > Ian
> >> >
> >> >
> >> >>> On Wed, Feb 26, 2020 at 5:48 PM Ian Lance Taylor <i...@golang.org> 
> >> >>> wrote:
> >> >>>
> >> >>> On Wed, Feb 26, 2020 at 5:42 PM Michael Jones 
> >> >>> <michael.jo...@gmail.com> wrote:
> >> >>>>
> >> >>>> There is the BSD notion of sa_restart, a convenience to loop for the 
> >> >>>> caller as appropriate.
> >> >>>>
> >> >>>> https://www.freebsd.org/cgi/man.cgi?query=sigaction
> >> >>>>
> >> >>>> Go could adopt such a notion if desired.
> >> >>>
> >> >>> We already do.  We install all signal handlers with the SA_RESTART 
> >> >>> flag set.
> >> >>>
> >> >>> Unfortunately if you peruse "man 7 signal" on a GNU/Linux system you
> >> >>> will see a list of system calls that return EINTR even if the handler
> >> >>> has SA_RESTART set.
> >> >>>
> >> >>> Ian
> >> >>>
> >> >>>> On Wed, Feb 26, 2020 at 5:14 PM Ian Lance Taylor <i...@golang.org> 
> >> >>>> wrote:
> >> >>>>>
> >> >>>>> On Wed, Feb 26, 2020 at 9:11 AM Manlio Perillo 
> >> >>>>> <manlio.peri...@gmail.com> wrote:
> >> >>>>>>
> >> >>>>>> On Wednesday, February 26, 2020 at 4:14:38 PM UTC+1, Ian Lance 
> >> >>>>>> Taylor wrote:
> >> >>>>>>>
> >> >>>>>>> On Wed, Feb 26, 2020 at 7:11 AM Manlio Perillo 
> >> >>>>>>> <manlio...@gmail.com> wrote:
> >> >>>>>>>>
> >> >>>>>>>> On Wednesday, February 26, 2020 at 3:51:54 PM UTC+1, Peter 
> >> >>>>>>>> Kleiweg wrote:
> >> >>>>>>>>>
> >> >>>>>>>>> Op woensdag 26 februari 2020 13:05:40 UTC+1 schreef Manlio 
> >> >>>>>>>>> Perillo:
> >> >>>>>>>>>>
> >> >>>>>>>>>> On Wednesday, February 26, 2020 at 12:33:05 PM UTC+1, Peter 
> >> >>>>>>>>>> Kleiweg wrote:
> >> >>>>>>>>>>>
> >> >>>>>>>>>>> With Go version 1.14 I get a lot of errors when I run:
> >> >>>>>>>>>>>
> >> >>>>>>>>>>>    go test -v github.com/pebbe/zmq4
> >> >>>>>>>>>>>
> >> >>>>>>>>>>> I didn't see this with Go 1.13.8 or any earlier version.
> >> >>>>>>>>>>>
> >> >>>>>>>>>>> Is this a problem with Go 1.14, or am I doing something wrong 
> >> >>>>>>>>>>> and just got lucky until now?
> >> >>>>>>>>>>>
> >> >>>>>>>>>>> How do I debug this? The errors are different for each run. 
> >> >>>>>>>>>>> Below is a sample of some errors.
> >> >>>>>>>>>>> Line numbers are not always accurate, because I inserted some 
> >> >>>>>>>>>>> calls to test.Log().
> >> >>>>>>>>>>
> >> >>>>>>>>>>
> >> >>>>>>>>>> The errors are probably caused by 
> >> >>>>>>>>>> https://golang.org/doc/go1.14#runtime.
> >> >>>>>>>>>>
> >> >>>>>>>>>> The solution is to update zmq4  to explicitly handle 
> >> >>>>>>>>>> interrupted system calls.
> >> >>>>>>>>>
> >> >>>>>>>>>
> >> >>>>>>>>> Often the program freezes before I get an interrupted system 
> >> >>>>>>>>> call. It hangs inside a ZeroMQ C++ library function.
> >> >>>>>>>>> zmq4 is just a wrapper for ZeroMQ. I can't "fix" ZeroMQ to make 
> >> >>>>>>>>> it work with Go.
> >> >>>>>>>>>
> >> >>>>>>>>> Is there a way to stop Go from interrupting my system calls? It 
> >> >>>>>>>>> happens rather randomly all over the place.
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>> https://stackoverflow.com/questions/36040547/zeromq-how-to-react-on-different-signal-types-on-eintr
> >> >>>>>>>>
> >> >>>>>>>> ZeroMQ may return an EINTR error , but zmq4 does not list it in 
> >> >>>>>>>> errors.go.
> >> >>>>>>>> ZeroMQ asks the caller to handle EINTR, so zmq4 should handle it 
> >> >>>>>>>> internally or return it to the caller.
> >> >>>>>>>>
> >> >>>>>>>> https://golang.org/doc/go1.14#runtime should have mentioned that 
> >> >>>>>>>> not only programs that use packages like syscall or 
> >> >>>>>>>> golang.org/x/sys/unix will see more slow system calls fail with 
> >> >>>>>>>> EINTR errors, but also programs that use Cgo.
> >> >>>>>>>
> >> >>>>>>> I don't know ZeroMQ.  If the ZeroMQ calls correspond closely to 
> >> >>>>>>> system
> >> >>>>>>> calls, then it could work for them to return EINTR.  In that case 
> >> >>>>>>> the
> >> >>>>>>> fix is going to be for the Go wrapper around ZeroMQ to check 
> >> >>>>>>> whether
> >> >>>>>>> the error returned is syscall.EINTR, and to retry the call if it 
> >> >>>>>>> is.
> >> >>>>>>>
> >> >>>>>>
> >> >>>>>> Unfortunately it is not that simple:
> >> >>>>>>
> >> >>>>>> http://250bpm.com/blog:12
> >> >>>>>> https://alobbs.com/post/54503240599/close-and-eintr
> >> >>>>>> http://man7.org/linux/man-pages/man7/signal.7.html
> >> >>>>>> https://github.com/golang/go/issues/11180
> >> >>>>>> https://www.python.org/dev/peps/pep-0475/
> >> >>>>>>
> >> >>>>>> The second entry about close and EINTR is enlightening.
> >> >>>>>
> >> >>>>> Thanks for the links.  Note that these issues don't really have
> >> >>>>> anything to do with Go.  For certain system calls, you need to handle
> >> >>>>> EINTR one way or another.  The Go runtime does as much as it can to
> >> >>>>> avoid these problems, but on Unix systems it is impossible to avoid
> >> >>>>> them entirely.
> >> >>>>>
> >> >>>>> Ian
> >> >>>>>
> >> >>>>> --
> >> >>>>> You received this message because you are subscribed to the Google 
> >> >>>>> Groups "golang-nuts" group.
> >> >>>>> To unsubscribe from this group and stop receiving emails from it, 
> >> >>>>> send an email to golang-nuts+unsubscr...@googlegroups.com.
> >> >>>>> To view this discussion on the web visit 
> >> >>>>> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcXGcdfpPAz8t8adfqGodKPjZNxKzkTUyB0b4L1zysVFSQ%40mail.gmail.com.
> >> >>>>
> >> >>>>
> >> >>>>
> >> >>>> --
> >> >>>> Michael T. Jones
> >> >>>> michael.jo...@gmail.com
> >> >>
> >> >> --
> >> >> Michael T. Jones
> >> >> michael.jo...@gmail.com
> >> >
> >> > --
> >> > You received this message because you are subscribed to the Google 
> >> > Groups "golang-nuts" group.
> >> > To unsubscribe from this group and stop receiving emails from it, send 
> >> > an email to golang-nuts+unsubscr...@googlegroups.com.
> >> > To view this discussion on the web visit 
> >> > https://groups.google.com/d/msgid/golang-nuts/CAOyqgcW_rGLEGY2d%3Df_OacR%3D%3DSv9kPwp%2BUN8SG3N981S1quobQ%40mail.gmail.com.
> >>
> >
> >--
> >You received this message because you are subscribed to the Google Groups 
> >"golang-nuts" group.
> >To unsubscribe from this group and stop receiving emails from it, send an 
> >email to golang-nuts+unsubscr...@googlegroups.com.
> >To view this discussion on the web visit 
> >https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUdX7G1QM5o-HUVH__YUpva6X%2Bj516sqa-zrYdXu%2By-wg%40mail.gmail.com.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcWumuYUN1rity9bQEDRDNQ36eCJotJnLnUcEnd-W9miVA%40mail.gmail.com.

Reply via email to