diff options
Diffstat (limited to 'config/initializers/database_config.rb')
-rw-r--r-- | config/initializers/database_config.rb | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/config/initializers/database_config.rb b/config/initializers/database_config.rb index ce732677c74..cccd4335a7d 100644 --- a/config/initializers/database_config.rb +++ b/config/initializers/database_config.rb @@ -20,31 +20,34 @@ Gitlab.ee do end end -# When running on multi-threaded runtimes like Puma or Sidekiq, -# set the number of threads per process as the minimum DB connection pool size. -# This is to avoid connectivity issues as was documented here: -# https://github.com/rails/rails/pull/23057 -if Gitlab::Runtime.multi_threaded? - max_threads = Gitlab::Runtime.max_threads - db_config = Gitlab::Database.config || - Rails.application.config.database_configuration[Rails.env] - previous_db_pool_size = db_config['pool'] - - db_config['pool'] = [db_config['pool'].to_i, max_threads].max + ENV["DB_POOL_HEADROOM"].to_i - - ActiveRecord::Base.establish_connection(db_config) - - current_db_pool_size = ActiveRecord::Base.connection.pool.size - - log_pool_size('DB', previous_db_pool_size, current_db_pool_size) - - Gitlab.ee do - if Gitlab::Runtime.sidekiq? && Gitlab::Geo.geo_database_configured? - previous_geo_db_pool_size = Rails.configuration.geo_database['pool'] - Rails.configuration.geo_database['pool'] = max_threads - Geo::TrackingBase.establish_connection(Rails.configuration.geo_database) - current_geo_db_pool_size = Geo::TrackingBase.connection_pool.size - log_pool_size('Geo DB', previous_geo_db_pool_size, current_geo_db_pool_size) - end +# Because of the way Ruby on Rails manages database connections, it is +# important that we have at least as many connections as we have +# threads. While there is a 'pool' setting in database.yml, it is not +# very practical because you need to maintain it in tandem with the +# number of application threads. Because of this we override the number +# of allowed connections in the database connection pool based on the +# configured number of application threads. +# +# Gitlab::Runtime.max_threads is the number of "user facing" application +# threads the process has been configured with. We also have auxiliary +# threads that use database connections. Because it is not practical to +# keep an accurate count of the number auxiliary threads as the +# application evolves over time, we just add a fixed headroom to the +# number of user-facing threads. It is OK if this number is too large +# because connections are instantiated lazily. + +headroom = (ENV["DB_POOL_HEADROOM"].presence || 10).to_i +calculated_pool_size = Gitlab::Runtime.max_threads + headroom + +db_config = Gitlab::Database.config || + Rails.application.config.database_configuration[Rails.env] + +db_config['pool'] = calculated_pool_size +ActiveRecord::Base.establish_connection(db_config) + +Gitlab.ee do + if Gitlab::Runtime.sidekiq? && Gitlab::Geo.geo_database_configured? + Rails.configuration.geo_database['pool'] = calculated_pool_size + Geo::TrackingBase.establish_connection(Rails.configuration.geo_database) end end |