[Rd] socketSelect(..., timeout): non-integer timeouts in (0, 2) (?) equal infinite timeout on Linux - weird
Henrik Bengtsson
henrik.bengtsson at gmail.com
Thu Oct 5 20:00:33 CEST 2017
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 <tomas.kalibera at gmail.com> 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
>> <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
>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list