diff options
Diffstat (limited to 'config/initializers/database_config.rb')
-rw-r--r-- | config/initializers/database_config.rb | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/config/initializers/database_config.rb b/config/initializers/database_config.rb index 509f04c9b02..b5490fc4719 100644 --- a/config/initializers/database_config.rb +++ b/config/initializers/database_config.rb @@ -1,18 +1,40 @@ # frozen_string_literal: true -# when running on puma, scale connection pool size with the number -# of threads per worker process -if Gitlab::Runtime.puma? +def log_pool_size(db, previous_pool_size, current_pool_size) + log_message = ["#{db} connection pool size: #{current_pool_size}"] + + if previous_pool_size && current_pool_size > previous_pool_size + log_message << "(increased from #{previous_pool_size} to match thread count)" + end + + Gitlab::AppLogger.debug(log_message.join(' ')) +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] - puma_options = Puma.cli_config.options + previous_db_pool_size = db_config['pool'] - # We use either the maximum number of threads per worker process, or - # the user specified value, whichever is larger. - desired_pool_size = [db_config['pool'].to_i, puma_options[:max_threads]].max + db_config['pool'] = [db_config['pool'].to_i, max_threads].max - db_config['pool'] = desired_pool_size - - # recreate the connection pool from the new config 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 + end end |