From luke-tierney at uiowa.edu  Thu Oct 27 18:26:22 2016
From: luke-tierney at uiowa.edu (luke-tierney at uiowa.edu)
Date: Thu, 27 Oct 2016 11:26:22 -0500
Subject: [Rd] BUG?: On Linux setTimeLimit() fails to propagate timeout
 error when it occurs (works on Windows)
In-Reply-To: <57E7E96A-D3F9-42F4-877D-56109CD38CC8@gmail.com>
References: <CAFDcVCStodbQMS4TffimW69qvVutCX8FheDNxf1o_Ejpmu9NQg@mail.gmail.com>
	<8995051E-628D-4536-A64C-517A9188F416@xs4all.nl>
	<CAFDcVCQmAAq_GYB5WUE2O25RkzCCpeMudJwQ3pCucp5MATAkXw@mail.gmail.com>
	<57E7E96A-D3F9-42F4-877D-56109CD38CC8@gmail.com>
Message-ID: <alpine.DEB.2.20.1610271113550.2355@luke-Latitude>

On unix, unless event polling is enabled Sys.sleep just waits in a
select() call (with a SIGINT handler in place) so the elapsed time
isn't checked until after the select call is complete. Rstudio uses
event polling, and in particular sets R_wait_usec to 10000, which
means event and interrupt checks happen during a Sys.seep call.  The R
GUI on macOS doesn't seem to do this (but my lldb skills aren't up to
checking). Now that we have this elapsed time limit mechanism it might
be a good idea to set the default for R_wait_usec to something
reasonable on unix in general. 100000 might be a good value.

A more worrying thing I noticed while looking at this is that blocking
reads on fifos and pipes and probably sockets are not interruptable --
that should probably be looked into.

Best,

luke

On Wed, 26 Oct 2016, peter dalgaard wrote:

> Spencer also had tools and rsconnect loaded (via a namespace) but it doesn't seem to make a difference for me if I load them. It also doesn't seem to matter for me whether it is CRAN R, locally built R, Terminal, R.app. However, RStudio differs
>
>> setTimeLimit(elapsed=1)
> Error: reached elapsed time limit
>> setTimeLimit(elapsed=1)
> Error: reached elapsed time limit
>> setTimeLimit(elapsed=1); system.time({Sys.sleep(10);message("done")})
> Error in Sys.sleep(10) : reached elapsed time limit
> Timing stopped at: 0.003 0.003 0.733
>
> -pd
>
>
>> On 26 Oct 2016, at 21:54 , Henrik Bengtsson <henrik.bengtsson at gmail.com> wrote:
>>
>> Thank you for the feedback and confirmations.  Interesting to see that
>> it's also reproducible on macOS expect for Spencer; that might
>> indicate a difference in builds.
>>
>> BTW, my original post suggested that timeout error was for sure
>> detected while running Sys.sleep(10).  However, it could of course
>> also be that it is only detected after it finishes.
>>
>>
>> For troubleshooting, the help("setTimeLimit", package = "base") says that:
>>
>> * "Time limits are checked whenever a user interrupt could occur. This
>> will happen frequently in R code and during Sys.sleep, but only at
>> points in compiled C and Fortran code identified by the code author."
>>
>> The example here uses Sys.sleep(), which supports and detects user interrupts.
>>
>>
>> The timeout error message is thrown by the R_ProcessEvents(void)
>> function as defined in:
>>
>> * src/unix/sys-unix.c
>> (https://github.com/wch/r-source/blob/trunk/src/unix/sys-unix.c#L421-L453)
>> * src/gnuwin32/system.c
>> (https://github.com/wch/r-source/blob/trunk/src/gnuwin32/system.c#L110-L140)
>>
>> So, they're clearly different implementations on Windows and Unix.
>> Also, for the Unix implementation, the code differ based on
>> preprocessing directive HAVE_AQUA, which could explain why Spencer
>> observes a different behavior than Peter and Berend (all on macOS).
>>
>>
>> Whenever the R_CheckUserInterrupt() function is called it in turn
>> always calls R_ProcessEvents().  At the end, there is a code snippet -
>> if (R_interrupts_pending) onintr(); - which is Windows specific and
>> could be another important difference between Windows and Unix.  This
>> function is defined in:
>>
>> * src/main/errors.c
>> (https://github.com/wch/r-source/blob/trunk/src/main/errors.c#L114-L134)
>>
>>
>> The do_setTimeLimit() function controls global variables cpuLimitValue
>> and elapsedLimitValue, which are checked in R_ProcessEvents(), but
>> other than setting the timeout limits I don't think it's involved in
>> the runtime checks. The do_setTimeLimit() is defined in:
>>
>> * src/main/sysutils.c
>> (https://github.com/wch/r-source/blob/trunk/src/main/sysutils.c#L1692-L1736)
>>
>>
>> Unfortunately, right now, I've got little extra time to troubleshoot
>> this further.
>>
>> /Henrik
>>
>> On Wed, Oct 26, 2016 at 2:22 AM, Berend Hasselman <bhh at xs4all.nl> wrote:
>>>
>>>> On 26 Oct 2016, at 04:44, Henrik Bengtsson <henrik.bengtsson at gmail.com> wrote:
>>>> .......
>>>> This looks like a bug to me.  Can anyone on macOS confirm whether this
>>>> is also a problem there or not?
>>>>
>>>
>>>
>>> Tried it on macOS El Capitan and got this (running in R.app with R version 3.3.2 RC (2016-10-23 r71574):
>>>
>>>> setTimeLimit(elapsed=1)
>>>> system.time({ Sys.sleep(10); message("done") })
>>> Error in Sys.sleep(10) : reached elapsed time limit
>>> Timing stopped at: 0.113 0.042 10.038
>>>
>>> Berend
>>>
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>

-- 
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney at uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] BUG?: On Linux setTimeLimit() fails to propagate timeout error when it occurs (works on Windows)
luke-tierney at uiowa.edu