diff --git a/app/lib/worker/process.rb b/app/lib/worker/process.rb index 1445800..70e3e4f 100644 --- a/app/lib/worker/process.rb +++ b/app/lib/worker/process.rb @@ -60,6 +60,7 @@ module Worker def run logger.tagged(component: "worker") do setup_traps + ensure_connection_pool_size_is_suitable start_work_threads start_tasks_thread wait_for_threads @@ -96,6 +97,23 @@ module Worker @exit_pipe_read.wait_readable(wait_time) ? true : false end + # Ensure that the connection pool is big enough for the number of threads + # configured. + # + # @return [void] + def ensure_connection_pool_size_is_suitable + current_pool_size = ActiveRecord::Base.connection_pool.size + desired_pool_size = @thread_count + 3 + + return if current_pool_size >= desired_pool_size + + logger.warn "number of worker threads (#{@thread_count}) is more " \ + "than the db connection pool size (#{current_pool_size}+3), " \ + "increasing connection pool size to #{desired_pool_size}" + + Postal.change_database_connection_pool_size(desired_pool_size) + end + # Wait for all threads to complete # # @return [void] diff --git a/lib/postal/config.rb b/lib/postal/config.rb index d5dc6ba..b2717f6 100644 --- a/lib/postal/config.rb +++ b/lib/postal/config.rb @@ -22,6 +22,8 @@ module Postal class << self + attr_writer :current_process_type + # Return the path to the config file # # @return [String] @@ -136,6 +138,21 @@ module Postal end end + # Change the connection pool size to the given size. + # + # @param new_size [Integer] + # @return [void] + def change_database_connection_pool_size(new_size) + ActiveRecord::Base.connection_pool.disconnect! + + config = ActiveRecord::Base.configurations + .configs_for(env_name: Rails.env) + .first + .configuration_hash + + ActiveRecord::Base.establish_connection(config.merge(pool: new_size)) + end + end Config = initialize_config diff --git a/spec/lib/postal_spec.rb b/spec/lib/postal_spec.rb index abdeefd..f416ad4 100644 --- a/spec/lib/postal_spec.rb +++ b/spec/lib/postal_spec.rb @@ -9,4 +9,10 @@ RSpec.describe Postal do expect(Postal.signer.private_key.to_pem).to eq OpenSSL::PKey::RSA.new(File.read(Postal::Config.postal.signing_key_path)).to_pem end end + + describe "#change_database_connection_pool_size" do + it "changes the connection pool size" do + expect { Postal.change_database_connection_pool_size(8) }.to change { ActiveRecord::Base.connection_pool.size }.from(5).to(8) + end + end end