3

I'm having some trouble with the following script:

require 'rubygems'
require 'active_record'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
puts "true" if gateway.active?
p = gateway.open('127.0.0.1', 3306, 3307)

class MyClass < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql",
    :host     => "127.0.0.1",
    :username => "db_user",
    :password => "db_pass",
    :database => "mydb_production",
    :port     => 3307
  )
end

puts MyClass.all.size

gateway.shutdown!

When I run the script it just hangs, unless I remove the activerecord query. I know I can connect using tunneling because I can create a tunnel from the command like like so:

ssh -f [email protected] -L 3307/127.0.0.1/3306 -N

Then if I run:

require 'rubygems'
require 'active_record'

class MyClass < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql",
    :host     => "127.0.0.1",
    :username => "db_user",
    :password => "db_pass",
    :database => "mydb_production",
    :port     => 3307
  )
end

puts MyClass.all.size

It works fine. What am I doing wrong?

Thanks.

1
  • Have you tried opening the gateway in another thread or process? I believe your issue might be caused by a deadlock due to how MySQL might be trying to do IO over your tunnel... Commented Jan 27, 2011 at 10:56

2 Answers 2

9

I was able to get this to work without a fork by using the mysql2 gem

require 'rubygems'
require 'active_record'
require 'mysql2'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(
  'remotehost.com',
  'username'
)
port = gateway.open('127.0.0.1', 3306, 3307)

class Company < ActiveRecord::Base
  establish_connection(
    :adapter  => "mysql2",
    :host     => "127.0.0.1",
    :username => "dbuser",
    :password => "dbpass",
    :database => "dbname",
    :port     => 3307
  )
end
puts Company.all.size
Sign up to request clarification or add additional context in comments.

Comments

2

I think the comment is right - the DB is conflicting with the event loop in the ssh code.

Try this:

  require 'rubygems'
  require 'active_record'
  require 'net/ssh/gateway'

  gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
  puts "true" if gateway.active?
  port = gateway.open('127.0.0.1', 3306, 3307)
  fork.do
    class MyClass < ActiveRecord::Base
      establish_connection(
        :adapter  => "mysql",
        :host     => "127.0.0.1",
        :username => "db_user",
        :password => "db_pass",
        :database => "mydb_production",
        :port     => 3307
      )
    end

    puts MyClass.all.size
  end  

  Process.wait

  gateway.shutdown!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.