diff options
Diffstat (limited to 'app/models/ci/resource.rb')
-rw-r--r-- | app/models/ci/resource.rb | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/app/models/ci/resource.rb b/app/models/ci/resource.rb index e0e1fab642d..ee094fa2007 100644 --- a/app/models/ci/resource.rb +++ b/app/models/ci/resource.rb @@ -1,13 +1,26 @@ # frozen_string_literal: true module Ci - class Resource < ApplicationRecord - extend Gitlab::Ci::Model - + class Resource < Ci::ApplicationRecord belongs_to :resource_group, class_name: 'Ci::ResourceGroup', inverse_of: :resources belongs_to :processable, class_name: 'Ci::Processable', foreign_key: 'build_id', inverse_of: :resource scope :free, -> { where(processable: nil) } + scope :retained, -> { where.not(processable: nil) } scope :retained_by, -> (processable) { where(processable: processable) } + + class << self + # In some cases, state machine hooks in `Ci::Build` are skipped + # even if the job status transitions to a complete state. + # For example, `Ci::Build#doom!` (a.k.a `data_integrity_failure`) doesn't execute state machine hooks. + # To handle these edge cases, we check the staleness of the jobs that currently + # assigned to the resources, and release if it's stale. + # See https://gitlab.com/gitlab-org/gitlab/-/issues/335537#note_632925914 for more information. + def stale_processables + Ci::Processable.where(id: retained.select(:build_id)) + .complete + .updated_at_before(5.minutes.ago) + end + end end end |