cartodb-4.42/spec/lib/cartodb/connection_pool_spec.rb
2024-04-06 05:25:13 +00:00

87 lines
2.7 KiB
Ruby

require_relative '../../spec_helper'
describe CartoDB::ConnectionPool do
before(:all) do
@max_pool_size = ConnectionPool::MAX_POOL_SIZE
ConnectionPool::MAX_POOL_SIZE = 2
end
after(:all) do
ConnectionPool::MAX_POOL_SIZE = @max_pool_size
end
before(:each) do
# Need to close the connections because there might be more than the new maximum already in the pool
$pool.close_connections!
end
after(:each) do
@users.map(&:destroy) if @users
end
def database_object_count
GC.start
ObjectSpace.each_object(Sequel::Postgres::Database).count
end
def user_object_count
GC.start
ObjectSpace.each_object(User).count
end
def pool_contains?(connection)
$pool.all.values.map { |a| a[:connection] }.include?(connection)
end
describe '#eviction_policy' do
it 'evicts older connection (LRU)' do
@users = [create_user, create_user, create_user]
conns = @users.map(&:in_database)
pool_contains?(conns[0]).should be_false
pool_contains?(conns[1]).should be_true
pool_contains?(conns[2]).should be_true
conns[0] = @users[0].in_database
pool_contains?(conns[0]).should be_true
pool_contains?(conns[1]).should be_false
pool_contains?(conns[2]).should be_true
end
end
describe '#user_databases' do
it 'does not leak user databases' do
# The maximum number of connections allowed in memory before the test is considered to be leaking (failure).
# Although the pool will only keep 2 connections open (MAX_POOL_SIZE set at the beginning of the test),
# there are some other connections that are not tracked by the pool (tracked by Rails instead).
# Typical # of connections is 2 for correct tests and 45 for leaky tests but vary depending on execution order.
MAX_ALLOWABLE_CONNECTIONS = 10
initial_user_count = user_object_count
initial_db_count = database_object_count
@users = [create_user, create_user, create_user]
# Create some connections to user database and check that they are not leaked
(0..4).each do |_|
@users.each do |user|
user.in_database.test_connection.should be_true
end
end
database_object_count.should < (initial_db_count + MAX_ALLOWABLE_CONNECTIONS)
# Destroy new user and ensure it does not leaks (as soon as their db connection is evicted)
@users.delete_at(0).destroy
(0..4).each do |_|
@users.each do |user|
user.in_database.test_connection.should be_true
end
end
database_object_count.should < (initial_db_count + MAX_ALLOWABLE_CONNECTIONS)
pending 'Inconsistent, depending on ruby version'
user_object_count.should eq initial_user_count
end
end
end