ZaBlanc
ZaBlanc

Reputation: 4718

Sinatra/ActiveRecord can't handle simultaneous requests?

This is my first Sinatra project and I'm pretty late in and I'm realizing that when make multiple requests at once that use ActiveRecord that I run into problems. If I only make one request, each one works on its own. But when I call both at once, I get failure.

So far I've narrowed it down to the problem being two ActiveRecord requests simultaneously. Maybe I'm not setting up ActiveRecord correctly? I use PostgreSQL because Heroku uses it, and am no inclined to change. (The issue happens on Heroku, too.)

Here's the log:

192.168.1.113 - - [30/Sep/2012:10:33:00 MDT] "GET /version/current?platform=android HTTP/1.1" 200 33
 - -> /version/current?platform=android ActiveRecord::StatementInvalid - NoMethodError: undefined method `fields' for nil:NilClass: SELECT  "rankings".* FROM "rankings"  WHERE "rankings"."user_id" = 1 LIMIT 1:
/Users/zablanc/.rvm/gems/ruby-1.9.3-head@emm/gems/activerecord-3.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:667:in `block in exec_query'

...

Warning! Rack::Session::Cookie data size exceeds 4K.
Warning! Rack::Session::Cookie failed to save session. Content dropped.

192.168.1.113 - - [30/Sep/2012:10:33:01 MDT] "GET /badges/all HTTP/1.1" 200 311
 - -> /badges/all
192.168.1.113 - - [30/Sep/2012:10:33:01 MDT] "GET /moves/ranking/all HTTP/1.1" 500 166185
 - -> /moves/ranking/all

I have no idea how to shut up those cookie warnings, tho they seem to have no effect on the app. Here's how I configure my app (in a config file I require from the main script):

enable :logging

use ActiveRecord::ConnectionAdapters::ConnectionManagement

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :expire_after => 31_536_000, # In seconds
                           :secret => 'jeowkfj...secret...kjn5'

ActiveRecord::Base.include_root_in_json = false

def establish_connection(url)
    db = URI.parse(url)

    ActiveRecord::Base.establish_connection(
        :adapter  => db.scheme == 'postgres' ? 'postgresql' : db.scheme,
        :host     => db.host,
        :port     => db.port,
        :username => db.user,
        :password => db.password,
        :database => db.path[1..-1],
        :encoding => 'utf8'
    )
end

configure :development do
    establish_connection('postgres://postgres:postgres@localhost:5432/emm')
end

configure :test do
    establish_connection('postgres://postgres:postgres@localhost:5432/emm-test')
end

configure :production do
    establish_connection(ENV['DATABASE_URL'])
end

I'm guessing I'm not setting up ActiveRecord right, but I think it's just like the tutorials I've seen. What gives?

Upvotes: 4

Views: 469

Answers (1)

wich
wich

Reputation: 17117

Sounds like you are using threads but have some non-thread-safe code in your application.

Which webserver are you using, which middleware are you using, which postgresql gem are you using, did you check to see that all your gems are thread-safe?

Upvotes: 1

Related Questions