[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