diff --git a/config/discourse_defaults.conf b/config/discourse_defaults.conf index 9265ecfac78..7972879f28d 100644 --- a/config/discourse_defaults.conf +++ b/config/discourse_defaults.conf @@ -108,3 +108,10 @@ rtl_css = false # this is global so it is easier to set in multisites # TODO allow for global overrides new_version_emails = true + +# connection reaping helps keep connection counts down, postgres +# will not work properly with huge numbers of open connections +# reap connections from pool that are older than 30 seconds +connection_reaper_age = 30 +# run reap check every 30 seconds +connection_reaper_interval = 30 diff --git a/lib/discourse.rb b/lib/discourse.rb index eb982e1dffa..1e2827306dc 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -289,21 +289,32 @@ module Discourse nil end - def self.start_connection_reaper(interval=30, age=30) + def self.start_connection_reaper + return if GlobalSetting.connection_reaper_age < 1 || + GlobalSetting.connection_reaper_interval < 1 + # this helps keep connection counts in check Thread.new do while true - sleep interval - pools = [] - ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool){|pool| pools << pool} - - pools.each do |pool| - pool.drain(age.seconds) + begin + sleep GlobalSetting.connection_reaper_interval + reap_connections(GlobalSetting.connection_reaper_age) + rescue => e + Discourse.handle_exception(e, {message: "Error reaping connections"}) end end end end + def self.reap_connections(age) + pools = [] + ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool){|pool| pools << pool} + + pools.each do |pool| + pool.drain(age.seconds) + end + end + def self.sidekiq_redis_config { url: $redis.url, namespace: 'sidekiq' } end