[Rd] socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
Tomas Kalibera
tomas.kalibera at gmail.com
Thu Oct 5 15:13:36 CEST 2017
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
More information about the R-devel
mailing list