Bug #2008: test_io.rb: test 2 fails on FreeBSD
http://redmine.ruby-lang.org/issues/show/2008

Author: Lucas Nussbaum
Status: Open, Priority: Normal
ruby -v: 1.9.1.243

Hi,

Test 2 in test_io.rb fails on FreeBSD. This is related to http://redmine.ruby-lang.org/issues/show/1066, which, according to the comments posted after the bug was closed, wasn't really fixed.

I ran into this on Debian GNU/kfreebsd (Debian userland, freebsd kernel). One of our freebsd porter wrote (see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543805):

> The test assumes that the kernel buffer for pipes have fixed size.
> It does not have to be true, there could be adaptive buffer size
> provided by kernel. After filling whole kernel buffer (by non-blocking 
> write), it might be required to buffer becomes filled only from half
> or even empty. The next write() might be blocked until whole 
> kernel buffer is read. Such behaviour of kernel is correct one.
> 
> The kernel of FreeBSD uses adaptive pipe sizes and direct pipe writes,
> see http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/sys_pipe.c

(It is likely to be the same on Mac OS X)

He suggests changing the test to:
>   begin
>     require "io/nonblock"
>     r, w = IO.pipe
>     w.nonblock = true
>     bytes = w.write_nonblock("a" * 100000)
>     w.nonblock = false
>     t1 = Thread.new { w.write("b" * 4096) }
>     t2 = Thread.new { w.write("c" * 4096) }
>     sleep 0.5
>     blocks = 2 + bytes/4096
>     blocks.times {
>          r.sysread(4096).length
>          sleep 0.1
>     }
>     t1.join
>     t2.join
>   rescue LoadError
>   end

However, I don't understand what that test is trying to test. It might be better to simply remove that test...


----------------------------------------
http://redmine.ruby-lang.org