From d56b71851ba869cb8de9a6df2e340a0059037c3b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 17 Feb 2015 09:58:23 +1100 Subject: [PATCH] FEATURE: configurable connection reaping settings --- config/discourse_defaults.conf | 7 +++++++ lib/discourse.rb | 25 ++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) 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