mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
cb6f839359
An AR ConnectionSpec `wait_timeout` is pre-patch used for three different things: * mysql2 uses it for MySQL's own wait_timeout (how long MySQL should allow an idle connection before closing it), and defaults to 2592000 seconds. * ConnectionPool uses it for "number of seconds to block and wait for a connection before giving up and raising a timeout error", default 5 seconds. * ConnectionPool uses it for the Reaper, for deciding if a 'dead' connection can be reaped. Default 5 seconds. Previously, if you want to change these from defaults, you need to change them all together. This is problematic _especially_ for the mysql2/ConnectionPool conflict, you will generally _not_ want them to be the same, as evidenced by their wildly different defaults. This has caused real problems for people #6441 #2894 But as long as we're changing this, forcing renaming the ConnectionPool key to be more specific, it made sense to seperate the two ConnectionPool uses too -- these two types of ConnectionPool timeouts ought to be able to be changed independently, you won't neccesarily want them to be the same, even though the defaults are (currently) the same.
67 lines
1.8 KiB
Ruby
67 lines
1.8 KiB
Ruby
require "cases/helper"
|
|
require "models/project"
|
|
require "timeout"
|
|
|
|
class PooledConnectionsTest < ActiveRecord::TestCase
|
|
self.use_transactional_fixtures = false
|
|
|
|
def setup
|
|
@per_test_teardown = []
|
|
@connection = ActiveRecord::Model.remove_connection
|
|
end
|
|
|
|
def teardown
|
|
ActiveRecord::Model.clear_all_connections!
|
|
ActiveRecord::Model.establish_connection(@connection)
|
|
@per_test_teardown.each {|td| td.call }
|
|
end
|
|
|
|
def checkout_connections
|
|
ActiveRecord::Model.establish_connection(@connection.merge({:pool => 2, :checkout_timeout => 0.3}))
|
|
@connections = []
|
|
@timed_out = 0
|
|
|
|
4.times do
|
|
Thread.new do
|
|
begin
|
|
@connections << ActiveRecord::Base.connection_pool.checkout
|
|
rescue ActiveRecord::ConnectionTimeoutError
|
|
@timed_out += 1
|
|
end
|
|
end.join
|
|
end
|
|
end
|
|
|
|
# Will deadlock due to lack of Monitor timeouts in 1.9
|
|
def checkout_checkin_connections(pool_size, threads)
|
|
ActiveRecord::Model.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
|
|
@connection_count = 0
|
|
@timed_out = 0
|
|
threads.times do
|
|
Thread.new do
|
|
begin
|
|
conn = ActiveRecord::Model.connection_pool.checkout
|
|
sleep 0.1
|
|
ActiveRecord::Model.connection_pool.checkin conn
|
|
@connection_count += 1
|
|
rescue ActiveRecord::ConnectionTimeoutError
|
|
@timed_out += 1
|
|
end
|
|
end.join
|
|
end
|
|
end
|
|
|
|
def test_pooled_connection_checkin_one
|
|
checkout_checkin_connections 1, 2
|
|
assert_equal 2, @connection_count
|
|
assert_equal 0, @timed_out
|
|
assert_equal 1, ActiveRecord::Model.connection_pool.connections.size
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def add_record(name)
|
|
ActiveRecord::Model.connection_pool.with_connection { Project.create! :name => name }
|
|
end
|
|
end unless current_adapter?(:FrontBase) || in_memory_db?
|