Skip to content

uninitialized constant ZooKeeper::RubyIO::Connection::SOL_TCP #2

@makuk66

Description

@makuk66

On OSX 10.8.2, with the latest xcode, and the latest ruby-1.9.3-p327, a simple connect with zkruby 3.4.3 fails:

looking for zookeeper path /zkgctest
E, [2012-12-04 12:52:13 #83484] ERROR -- ZooKeeper::RubyIO::Binding: (ZooKeeper::RubyIO::Binding) Exception in session thread: uninitialized constant ZooKeeper::RubyIO::Connection::SOL_TCP:
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:52:in `initialize'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:210:in `new'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:210:in `connect'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/session.rb:212:in `reconnect'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/session.rb:132:in `start'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:192:in `block (2 levels) in start'
    /usr/local/rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:192:in `block in start'
/usr/local/rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/thread.rb:71:in `sleep': deadlock detected (fatal)
    from /usr/local/rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/thread.rb:71:in `wait'
    from /usr/local/rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/monitor.rb:110:in `wait'
    from /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:299:in `block in wait_value'
    from /usr/local/rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    from /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb:298:in `wait_value'
    from /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/protocol.rb:164:in `value'
    from /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/client.rb:516:in `synchronous_call'
    from /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/client.rb:352:in `exists'
    from ./test.rb:14:in `create_zookeeper_path'
    from ./test.rb:41:in `<main>'

which complains about https://github.com/lwoggardner/zkruby/blob/master/lib/zkruby/rubyio.rb#L52 which uses SOL_TCP.

Looking at http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/Socket/AncillaryData.html, I see no SOL_TCP, but I do see Socket::IPPROTO_TCP and others. So I tried this:

    --- /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb.orig    2012-12-04 12:55:16.000000000 +0000
    +++ /usr/local/rvm/gems/ruby-1.9.3-p327@zkgc/gems/zkruby-3.4.3/lib/zkruby/rubyio.rb 2012-12-04 12:55:52.000000000 +0000
    @@ -49,7 +49,7 @@
                     addr = Socket.getaddrinfo(host, nil)
                     sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
                     sock.setsockopt(SOL_SOCKET, SO_LINGER, [0,-1].pack("ii"))
    -                sock.setsockopt(SOL_TCP, TCP_NODELAY,[0].pack("i_"))
    +                sock.setsockopt(::Socket::IPPROTO_TCP, TCP_NODELAY,[0].pack("i_"))
                     sockaddr = Socket.pack_sockaddr_in(port, addr[0][3])
                     begin
                         sock.connect_nonblock(sockaddr)

and that appears to work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions