Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

ActiveRecord connection does not reconnect when using Thin/Sinatra but works fine with just Sinatra.

#101

I have a very simple model for a simple web service. Any call to model will throw 500, like Model.find(:first) after 10 seconds.

Error:

application error
ActiveRecord::StatementInvalid at /leads
Mysql::Error: MySQL server has gone away: SELECT * FROM leads

Setting this in model does not help:

  before do 

 ActiveRecord::Base.connection.verify!



end

I have set MySQL to 10 seconds timeout to duplicate the issue quickly using this:

SET GLOBAL wait_timeout=10;
SET GLOBAL interactive_timeout=10; 
SET SESSION wait_timeout=10;
SET SESSION interactive_timeout=10;

show GLOBAL VARIABLES like 'wait_timeout'; 
show GLOBAL VARIABLES like 'interactive_timeout';
show SESSION VARIABLES like 'wait_timeout';
show SESSION VARIABLES like 'wait_timeout';

If I use rackup on the Sinatra app, no problem. When I use thin I receive the error. Here is my thin config:

--- 
pid: tmp/pids/thin.pid
log: log/thin.log
timeout: 30
port: 4600
max_conns: 1024
chdir: /Users/hbeaver/code/primedia/service_leads/
rackup: /Users/hbeaver/code/primedia/service_leads/config.ru
max_persistent_conns: 512
environment: development
daemonize: true
address: 0.0.0.0
require: []

servers: 1

Thanks,
Hank

Reported by hbeaver (at gmail) · May 28th, 2009 @ 03:37 PM

State: new
Milestone: Future
Assigned to: macournoyer macournoyer

Activity

  1. hbeaver (at gmail)
    hbeaver (at gmail)

    RESOLUTION?

    I moved the "before do" into extended Sinatra::Default class as opposed to model and issue was resolved. However, this does not explain why mongrel will create a new connection auto-magically whereas thin will not. Please see 2 attached tcpdumps named appropriately, 'thin_no_reconnect_example.dump' and 'mongrel_reconnect_example.dump'.

    In both, the server has just been started and then a HTTP request is made to a one line action that does Model.find(:first). In both, a mysql connection is created ok after server is started. After approx. 10 seconds (because of the wait_timeout setting in the ticket I mentioned yesterday) mysql will sent a FIN/ACK (disconnect). Shortly thereafter another HTTP request is made to server. Mongrel creates yet another connection, but thin will not. I am not certain if this is a bug or just the nature of thin.

    I thought it important to present this information.

    Thanks again,
    Hank

    May 29th, 2009 @ 06:18 PM

  2. Nate Wiger
    Nate Wiger

    I'm running into this exact same problem with thin/sinatra. Don't see it with thin/rails.

    Any ideas?

    August 10th, 2009 @ 12:44 PM

  3. hbeaver (at gmail)
    hbeaver (at gmail)
    • Assigned user cleared.

    As mentioned above, I resolved this issue by moving ActiveRecord::Base.connection.verify! into Sinatra class before do block:

    class NewApp < Sinatra::Default   
    
      before do
        ActiveRecord::Base.connection.verify!
      end
    ...
    end #end of Sinatra class
    

    August 10th, 2009 @ 01:05 PM

  4. Nate Wiger
    Nate Wiger
    • Assigned user set to macournoyer

    Just to follow-up, this approach has been working for me for some time. Based on the AR docs, the "correct" call which will handle multiple connections, etc, is:

    before do
      ActiveRecord::Base.verify_active_connections!
    end
    

    I'm not sure if this is a bug in Thin per se, but it would still be interesting to understand why this happens with Thin/Sinatra as opposed to Mongrel or Thin/Rails.

    June 24th, 2010 @ 10:17 AM

  5. Conny Brunnkvist
    Conny Brunnkvist
    • Milestone order changed from 0 to 0

    Same problem here.

    Works when running in foreground but as soon as either of "-s 1" or "servers: 1" is set, ActiveRecord is can't connect.

    July 21st, 2010 @ 07:15 PM

  6. Conny Brunnkvist
    Conny Brunnkvist

    I wonder if we don't need to simply ActiveRecord::Base.establish_connection after forking.. but then, why wouldn't reconnect! work? I gave up on this one, will try again later perhaps.

    July 26th, 2010 @ 12:22 PM

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.