Tony Arcieri created JRUBY-6573:
-----------------------------------
Summary: Socket.connect_nonblock blocks
Key: JRUBY-6573
URL: https://jira.codehaus.org/browse/JRUBY-6573
Project: JRuby
Issue Type: Bug
Components: Core Classes/Modules
Affects Versions: JRuby 1.7
Environment: jruby 1.7.0.dev (ruby-1.9.3-p139) (2012-03-31 3ed20a7)
(OpenJDK 64-Bit Server VM 1.7.0-u4-b13) [darwin-amd64-java]
Reporter: Tony Arcieri
Fix For: JRuby 1.6.7
JRuby 1.7-only bug. It's actually fine on 1.6.7.
Repro:
Clone celluloid-io: https://github.com/celluloid/celluloid-io
Bundle
run "rake"
The tests hang around here:
Celluloid::IO::TCPSocket
inside Celluloid::IO
...
It's hanging on a follow-up call to Socket.connect_nonblock. By "follow up", I
mean that it's called Socket.connect_nonblock once, gotten Errno::EINPROGRESS,
has waited for the given socket to become writable (via nio4r), and is now
calling Socket.connect_nonblock again to ensure that the socket is now
connected. The code in question looks like this:
begin
@socket.connect_nonblock Socket.sockaddr_in(remote_port, @addr.to_s)
rescue Errno::EINPROGRESS
wait_writable
retry
rescue Errno::EISCONN
# We're now connected! Yay exceptions for flow control
# NOTE: This is the approach the Ruby stdlib docs suggest ;_;
end
Okay, that comment is a bit of a lie, here's the actual example given by the
stdlib documentation:
begin # emulate blocking connect
socket.connect_nonblock(sockaddr)
rescue IO::WaitWritable
IO.select(nil, [socket]) # wait 3-way handshake completion
begin
socket.connect_nonblock(sockaddr) # check connection failure
rescue Errno::EISCONN
end
end
My version works fine on both Ruby 1.9.3 and JRuby 1.6.7. However, on JRuby
1.7, connect_nonblock seems to block.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email