diff --git a/app/jobs/base.rb b/app/jobs/base.rb index 0143e5680..d88c20601 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -101,6 +101,7 @@ module Jobs end total_db_time = 0 + exceptions = [] dbs.each do |db| begin thread_exception = nil @@ -137,10 +138,17 @@ module Jobs end t.join - raise thread_exception if thread_exception + exceptions << thread_exception end end + if exceptions.length > 0 + exceptions[1..-1].each do |exception| + Discourse.handle_exception(exception, opts) + end + raise exceptions[0] + end + ensure ActiveRecord::Base.connection_handler.clear_active_connections! @db_duration = total_db_time diff --git a/spec/jobs/jobs_base_spec.rb b/spec/jobs/jobs_base_spec.rb index f112dc935..23ac4d35d 100644 --- a/spec/jobs/jobs_base_spec.rb +++ b/spec/jobs/jobs_base_spec.rb @@ -2,6 +2,25 @@ require 'spec_helper' require_dependency 'jobs/base' describe Jobs::Base do + class BadJob < Jobs::Base + attr_accessor :fail_count + + def execute(args) + @fail_count ||= 0 + @fail_count += 1 + raise StandardError + end + end + + it 'handles errors in multisite' do + RailsMultisite::ConnectionManagement.expects(:all_dbs).returns(['default','default']) + # just stub so logs are not noisy + Discourse.expects(:handle_exception).returns(nil) + + bad = BadJob.new + expect{bad.perform({})}.to raise_error + bad.fail_count.should == 2 + end it 'delegates the process call to execute' do Jobs::Base.any_instance.expects(:execute).with('hello' => 'world')