diff --git a/app/jobs/scheduled/topic_timer_enqueuer.rb b/app/jobs/scheduled/topic_timer_enqueuer.rb index 7fa2889b1f3..67204c4200c 100644 --- a/app/jobs/scheduled/topic_timer_enqueuer.rb +++ b/app/jobs/scheduled/topic_timer_enqueuer.rb @@ -12,13 +12,15 @@ module Jobs every 1.minute def execute(_args = nil) - timers = TopicTimer.pending_timers - - timers.find_each do |timer| + TopicTimer.pending_timers.find_each do |timer| # the typed job may not enqueue if it has already # been scheduled with enqueue_at - timer.enqueue_typed_job + begin + timer.enqueue_typed_job + rescue => err + Discourse.warn_exception(err, message: "Error when attempting to enqueue topic timer job for timer #{timer.id}") + end end end end diff --git a/spec/jobs/topic_timer_enqueuer_spec.rb b/spec/jobs/topic_timer_enqueuer_spec.rb index b9f21ed12c8..702353be177 100644 --- a/spec/jobs/topic_timer_enqueuer_spec.rb +++ b/spec/jobs/topic_timer_enqueuer_spec.rb @@ -47,4 +47,9 @@ RSpec.describe Jobs::TopicTimerEnqueuer do Jobs.enqueue_at(1.hours.from_now, :close_topic, topic_timer_id: timer1.id) subject.execute end + + it "does not fail to enqueue other timers just because one timer errors" do + TopicTimer.any_instance.stubs(:enqueue_typed_job).raises(StandardError).then.returns(true) + expect { subject.execute }.not_to raise_error + end end