Henrik Bengtsson
2016-Oct-01 20:11 UTC
[Rd] socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
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
Henrik Bengtsson
2017-Oct-05 04:11 UTC
[Rd] socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
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 <henrik.bengtsson at gmail.com> 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
Tomas Kalibera
2017-Oct-05 13:13 UTC
[Rd] socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
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 > <henrik.bengtsson at gmail.com> 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 > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Apparently Analagous Threads
- socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
- socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
- SNOW: Error in socketSelect(socklist) : not a socket connection
- BUG?: On Linux setTimeLimit() fails to propagate timeout error when it occurs (works on Windows)
- socket problems (maybe bugs?)