diff --git a/db/schema.rb b/db/schema.rb index e15b4f97..a8e6f270 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_06_05_101124) do +ActiveRecord::Schema[7.1].define(version: 2023_06_05_101124) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/lib/sidekiq_scheduler_backoff_service.rb b/lib/sidekiq_scheduler_backoff_service.rb index 6c864743..7d2d8b32 100644 --- a/lib/sidekiq_scheduler_backoff_service.rb +++ b/lib/sidekiq_scheduler_backoff_service.rb @@ -11,12 +11,16 @@ def record_success initial_interval = current_interval target_interval = [initial_interval - 1, min_interval].max restart_schedule(target_interval) if target_interval != initial_interval + rescue StandardError + notify_missing_schedule end def record_failure initial_interval = current_interval target_interval = [initial_interval * 2, max_interval].min restart_schedule(target_interval) if target_interval != initial_interval + rescue StandardError + notify_missing_schedule end private @@ -30,4 +34,11 @@ def restart_schedule(target_interval) schedule = Sidekiq.get_schedule[name] Sidekiq.set_schedule(name, schedule.merge("every" => "#{target_interval}s")) end + + def notify_missing_schedule + GovukError.notify( + "Queue schedule missing", + extra: { available_schedules: Sidekiq.get_schedule.keys }, + ) + end end diff --git a/spec/lib/sidekiq_scheduler_backoff_service_spec.rb b/spec/lib/sidekiq_scheduler_backoff_service_spec.rb index fa4a6c3c..e12cac84 100644 --- a/spec/lib/sidekiq_scheduler_backoff_service_spec.rb +++ b/spec/lib/sidekiq_scheduler_backoff_service_spec.rb @@ -50,6 +50,15 @@ expect(scheduled_interval).to eq("#{max_interval}s") end end + + context "when the schedule is missing" do + subject { SidekiqSchedulerBackoffService.new(name: "non-existing-queue", min_interval:, max_interval:) } + + it "records the problem to GovukError" do + expect(GovukError).to receive(:notify) + subject.record_failure + end + end end describe "#record_success" do @@ -96,6 +105,15 @@ expect(scheduled_interval).to eq("#{max_interval}s") end end + + context "when the schedule is missing" do + subject { SidekiqSchedulerBackoffService.new(name: "non-existing-queue", min_interval:, max_interval:) } + + it "records the problem to GovukError" do + expect(GovukError).to receive(:notify) + subject.record_success + end + end end end