{"record":{"id":"76d89733e060f91f","repo":"bensheldon/good_job","slug":"interrupted-after-starting-perform-at-currentth","errorCode":null,"errorMessage":"Interrupted after starting perform at '#{CurrentThread.execution_interrupted}'","messagePattern":"Interrupted after starting perform at '#(.+?)'","errorType":"exception","errorClass":"GoodJob::InterruptError","httpStatus":null,"severity":"error","filePath":"lib/good_job/active_job_extensions/interrupt_errors.rb","lineNumber":10,"sourceCode":"# frozen_string_literal: true\n\nmodule GoodJob\n  module ActiveJobExtensions\n    module InterruptErrors\n      extend ActiveSupport::Concern\n\n      included do\n        around_perform do |_job, block|\n          raise InterruptError, \"Interrupted after starting perform at '#{CurrentThread.execution_interrupted}'\" if CurrentThread.execution_interrupted.present?\n\n          block.call\n        end\n      end\n    end\n  end\nend\n","sourceCodeStart":1,"sourceCodeEnd":18,"githubUrl":"https://github.com/bensheldon/good_job/blob/5fcde48f8765e69901ffa9c5a06122b19c73875f/lib/good_job/active_job_extensions/interrupt_errors.rb#L1-L18","documentation":"Error \"Interrupted after starting perform at '#{CurrentThread.execution_interrupted}'\" thrown in bensheldon/good_job.","triggerScenarios":"Thrown at lib/good_job/active_job_extensions/interrupt_errors.rb:10 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Treat this as an expected shutdown signal: the job was interrupted after perform started.","Make the job idempotent so it can be safely retried after interruption."],"exampleFix":"# Make perform idempotent; GoodJob retries or discards per your retry configuration","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5fcde48f8765e69901ffa9c5a06122b19c73875f","analyzedAt":"2026-08-23T14:55:11.399Z","schemaVersion":2},"datasetVersion":"2026-08-23T16:17:53.355Z"}