Thanks Tomas. I can confirm that this bug is gone in / it works with: > sessionInfo() R Under development (unstable) (2017-10-05 r73472) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 16.04.3 LTS
/Henrik On Thu, Oct 5, 2017 at 6:13 AM, Tomas Kalibera <[email protected]> wrote: > Fixed in 73470 > > Best, > Tomas > > > On 10/05/2017 06:11 AM, Henrik Bengtsson wrote: >> >> I'd like to follow up/bump the attention to this bug causing the >> timeout to fail for socketSelect() on Unix. It is still there in R >> 3.4.2 and R-devel. I've identified the bug in the R source code - the >> bug is due to floating-point precisions and comparison using >=. See >> PR17203 (https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=17203) >> for details and a patch. I've just reverified that the patch still >> solves the problem on trunk (SVN r73463). >> >> Thanks, >> >> /Henrik >> >> On Sat, Oct 1, 2016 at 1:11 PM, Henrik Bengtsson >> <[email protected]> wrote: >>> >>> There's something weird going on for certain non-integer values of >>> argument 'timeout' to base::socketSelect(). For such values, there is >>> no timeout and you effectively end up with an infinite timeout. I >>> can reproduce this on R 3.3.1 on Ubuntu 16.04 and RedHat 6.6, but not >>> on Windows (via Linux Wine). >>> >>> # 1. In R master session >>>> >>>> con <- socketConnection('localhost', port = 11001, server = TRUE, >>>> blocking = TRUE, open = 'a+b') >>> >>> # 2. In R servant session (connect to the above master socket) >>>> >>>> con <- socketConnection('localhost', port = 11001, server = FALSE, >>>> blocking = TRUE, open = 'a+b') >>> >>> # 3. In R master session (check if there's something available on >>> connection) >>> # Wait at most 0 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 0)); print(t); print(r) >>> >>> user system elapsed >>> 0 0 0 >>> [1] FALSE >>> >>> # Wait at most 1 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 1)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 1.002 >>> [1] FALSE >>> >>> # Wait at most 2 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 2)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 2.002 >>> [1] FALSE >>> >>> # Wait at most 2.5 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 2.5)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 2.502 >>> [1] FALSE >>> >>> # Wait at most 2.1 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 2.1)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 2.101 >>> [1] FALSE >>> >>> However, here are some weird cases where the value of the 'timeout' >>> argument is ignored: >>> >>> # Wait at most 1.9 seconds >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 1.9)); print(t); print(r) >>> >>> ^C user system elapsed >>> 3.780 14.888 20.594 >>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 0.1)); print(t); print(r) >>> >>> ^C user system elapsed >>> 2.596 11.208 13.907 >>> [1] FALSE >>> >>> Note how I had to signal a user interrupt (Ctrl-C) to exit >>> socketSelect(). Also, not that it still works with the timeout values >>> chosen above, e.g. >>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 0)); print(t); print(r) >>> >>> user system elapsed >>> 0 0 0 >>> [1] FALSE >>>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 1)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 1.001 >>> [1] FALSE >>> >>>> t <- system.time(r <- socketSelect(list(con), write = FALSE, timeout = >>>> 2.1)); print(t); print(r) >>> >>> user system elapsed >>> 0.000 0.000 2.103 >>> [1] FALSE >>> >>> It's almost as if there is something special with non-integer values >>> in (0,2). Not saying these are the only cases, but that's what I've >>> observed by trial and error. Weird. The fact that it works on >>> Windows, may suggest it is a Unix specific. Anyway with macOS that >>> wanna confirm? >>> >>> /Henrik >>> >>> Session information details: >>> >>> # Ubuntu 16.04 >>>> >>>> sessionInfo() >>> >>> R version 3.3.1 (2016-06-21) >>> Platform: x86_64-pc-linux-gnu (64-bit) >>> Running under: Ubuntu 16.04.1 LTS >>> >>> locale: >>> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C >>> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 >>> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 >>> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C >>> [9] LC_ADDRESS=C LC_TELEPHONE=C >>> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C >>> >>> attached base packages: >>> [1] stats graphics grDevices utils datasets methods base >>> >>> loaded via a namespace (and not attached): >>> [1] tools_3.3.1 >>> >>> # RedHat 6.6: >>>> >>>> sessionInfo() >>> >>> R version 3.3.1 (2016-06-21) >>> Platform: x86_64-pc-linux-gnu (64-bit) >>> >>> locale: >>> [1] C >>> >>> attached base packages: >>> [1] stats graphics grDevices utils datasets methods base >>> >>> loaded via a namespace (and not attached): >>> [1] tools_3.3.1 >>> >>> # Windows via Wine on Linux >>>> >>>> sessionInfo() >>> >>> R version 3.3.1 (2016-06-21) >>> Platform: x86_64-w64-mingw32/x64 (64-bit) >>> Running under: Windows XP x64 (build 2600) Service Pack 3 >>> >>> locale: >>> [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United >>> States.1252 >>> [3] LC_MONETARY=C LC_NUMERIC=C >>> [5] LC_TIME=C >>> >>> attached base packages: >>> [1] stats graphics grDevices utils datasets methods base >>> >>> loaded via a namespace (and not attached): >>> [1] tools_3.3.1 >> >> ______________________________________________ >> [email protected] mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel > > > ______________________________________________ > [email protected] mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ [email protected] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
