Andrew Hobson
2013-Nov-04 18:04 UTC
Unicorn 4.7.0 tests fail on OSX 10.7.5 and debian squeeze
Hi, I am getting failing tests on both OSX and debian squeeze, but the errors are different. On both my machines, it is commit 7c125886b5862bf20711bae22e6697ad46141434 that breaks the tests. I am using an old(ish) version of ruby: 1.9.3p125, but I don''t think that should matter. The error I get when I test 4.7.0 on OSX 10.7.5: : Finished tests in 0.041678s, 263.9282 tests/s, 1943.4714 assertions/s. : : 1) Failure: : test_reuseport(TestSocketHelper) [test/unit/test_socket_helper.rb:193]: : <1> expected but was : <512>. : : 11 tests, 81 assertions, 1 failures, 0 errors, 0 skips I don''t see how the current test can be platform independent. The following diff fixes OSX for me: diff --git a/test/unit/test_socket_helper.rb b/test/unit/test_socket_helper.rb index abc177b..2244442 100644 --- a/test/unit/test_socket_helper.rb +++ b/test/unit/test_socket_helper.rb @@ -189,7 +189,6 @@ class TestSocketHelper < Test::Unit::TestCase port = unused_port @test_addr name = "#@test_addr:#{port}" sock = bind_listen(name, :reuseport => true) - cur = sock.getsockopt(Socket::SOL_SOCKET, SO_REUSEPORT).unpack(''i'')[0] - assert_equal 1, cur + assert sock.getsockopt(Socket::SOL_SOCKET, SO_REUSEPORT).bool end if defined?(SO_REUSEPORT) end The error I get when I test 4.7.0 on debian squeeze (in a VM): : 1) Error: : test_reuseport(TestSocketHelper): : Errno::ENOPROTOOPT: Protocol not available : /home/ahobson/git/unicorn/test/ruby-1.9.3/lib/unicorn/socket_helper.rb:183:in `setsockopt'' : /home/ahobson/git/unicorn/test/ruby-1.9.3/lib/unicorn/socket_helper.rb:183:in `new_tcp_server'' : /home/ahobson/git/unicorn/test/ruby-1.9.3/lib/unicorn/socket_helper.rb:165:in `bind_listen'' : test/unit/test_socket_helper.rb:191:in `test_reuseport'' : : 14 tests, 84 assertions, 0 failures, 1 errors, 0 skips It appears that on linux, SO_REUSEPORT is not necessary to reuse the address/port across processes and may in fact fail. https://github.com/joyent/libuv/pull/902 I don''t know how unicorn should deal with that. I suppose ignoring ENOPROTOOPT if RUBY_PLATFORM =~ /linux/ is an option, but it is certainly not an appealing one. Thanks, --drew _______________________________________________ Unicorn mailing list - mongrel-unicorn@rubyforge.org http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying
Eric Wong
2013-Nov-04 18:37 UTC
Re: Unicorn 4.7.0 tests fail on OSX 10.7.5 and debian squeeze
Andrew Hobson <ahobson@gmail.com> wrote:> On both my machines, it is commit 7c125886b5862bf20711bae22e6697ad46141434 that breaks the tests.> : Finished tests in 0.041678s, 263.9282 tests/s, 1943.4714 assertions/s. > : > : 1) Failure: > : test_reuseport(TestSocketHelper) [test/unit/test_socket_helper.rb:193]: > : <1> expected but was > : <512>. > : > : 11 tests, 81 assertions, 1 failures, 0 errors, 0 skips > > I don''t see how the current test can be platform independent. The following diff fixes OSX for me: > > diff --git a/test/unit/test_socket_helper.rb b/test/unit/test_socket_helper.rb > index abc177b..2244442 100644 > --- a/test/unit/test_socket_helper.rb > +++ b/test/unit/test_socket_helper.rb > @@ -189,7 +189,6 @@ class TestSocketHelper < Test::Unit::TestCase > port = unused_port @test_addr > name = "#@test_addr:#{port}" > sock = bind_listen(name, :reuseport => true) > - cur = sock.getsockopt(Socket::SOL_SOCKET, SO_REUSEPORT).unpack(''i'')[0] > - assert_equal 1, cur > + assert sock.getsockopt(Socket::SOL_SOCKET, SO_REUSEPORT).bool > end if defined?(SO_REUSEPORT)I can''t use .bool for Ruby 1.8, unfortunately. I''ve just use assert_operator in my proposed patch below.> The error I get when I test 4.7.0 on debian squeeze (in a VM): > > : 1) Error: > : test_reuseport(TestSocketHelper): > : Errno::ENOPROTOOPT: Protocol not availableOops, I forgot Linux < 3.9 is still widely in use(!)> I don''t know how unicorn should deal with that. I suppose ignoring > ENOPROTOOPT if RUBY_PLATFORM =~ /linux/ is an option, but it is > certainly not an appealing one.I''ll just ignore it in the test. If a user requests it, then they''ll see the error (but we leave SO_REUSEPORT off by default) Will push the following: From: Eric Wong <normalperson@yhbt.net> Subject: [PATCH] tests: fix SO_REUSEPORT tests for old Linux and non-Linux On BSD-derived platforms the getsockopt true value may be any (>= 0) value, not just one as it is on Linux. Additionally, SO_REUSEPORT is only supported since Linux 3.9, so folks on older kernels may not have it available. We still define it for Linux since kernel upgrades are usually more common than glibc upgrades. Note: we will still raise an exception at runtime if a user explicitly requests :reuseport in their config and runs an older Linux kernel. Reported-by: Andrew Hobson <ahobson@gmail.com> --- test/unit/test_socket_helper.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/unit/test_socket_helper.rb b/test/unit/test_socket_helper.rb index abc177b..8992757 100644 --- a/test/unit/test_socket_helper.rb +++ b/test/unit/test_socket_helper.rb @@ -190,6 +190,8 @@ class TestSocketHelper < Test::Unit::TestCase name = "#@test_addr:#{port}" sock = bind_listen(name, :reuseport => true) cur = sock.getsockopt(Socket::SOL_SOCKET, SO_REUSEPORT).unpack(''i'')[0] - assert_equal 1, cur - end if defined?(SO_REUSEPORT) + assert_operator cur, :>, 0 + rescue Errno::ENOPROTOOPT + # kernel does not support SO_REUSEPORT (older Linux) + end end -- 1.8.4.483.g7fe67e6.dirty _______________________________________________ Unicorn mailing list - mongrel-unicorn@rubyforge.org http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying
Andrew Hobson
2013-Nov-04 19:26 UTC
Re: Unicorn 4.7.0 tests fail on OSX 10.7.5 and debian squeeze
On Monday, November 4, 2013 at 1:37 PM, Eric Wong wrote:> I can''t use .bool for Ruby 1.8, unfortunately. > I''ve just use assert_operator in my proposed patch below.Thank you! Your patch fixes the problem on both systems. --drew _______________________________________________ Unicorn mailing list - mongrel-unicorn@rubyforge.org http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying