69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  class SidekiqQueue
 | 
						|
    include Gitlab::Utils::StrongMemoize
 | 
						|
 | 
						|
    NoMetadataError = Class.new(StandardError)
 | 
						|
    InvalidQueueError = Class.new(StandardError)
 | 
						|
 | 
						|
    attr_reader :queue_name
 | 
						|
 | 
						|
    def initialize(queue_name)
 | 
						|
      @queue_name = queue_name
 | 
						|
    end
 | 
						|
 | 
						|
    def drop_jobs!(search_metadata, timeout:)
 | 
						|
      start_time = Gitlab::Metrics::System.monotonic_time
 | 
						|
      completed = true
 | 
						|
      deleted_jobs = 0
 | 
						|
 | 
						|
      job_search_metadata =
 | 
						|
        search_metadata
 | 
						|
          .stringify_keys
 | 
						|
          .slice(*Labkit::Context::KNOWN_KEYS)
 | 
						|
          .transform_keys { |key| "meta.#{key}" }
 | 
						|
          .compact
 | 
						|
 | 
						|
      raise NoMetadataError if job_search_metadata.empty?
 | 
						|
      raise InvalidQueueError unless queue
 | 
						|
 | 
						|
      queue.each do |job|
 | 
						|
        if timeout_exceeded?(start_time, timeout)
 | 
						|
          completed = false
 | 
						|
          break
 | 
						|
        end
 | 
						|
 | 
						|
        next unless job_matches?(job, job_search_metadata)
 | 
						|
 | 
						|
        job.delete
 | 
						|
        deleted_jobs += 1
 | 
						|
      end
 | 
						|
 | 
						|
      {
 | 
						|
        completed: completed,
 | 
						|
        deleted_jobs: deleted_jobs,
 | 
						|
        queue_size: queue.size
 | 
						|
      }
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    def queue
 | 
						|
      strong_memoize(:queue) do
 | 
						|
        # Sidekiq::Queue.new always returns a queue, even if it doesn't
 | 
						|
        # exist.
 | 
						|
        Sidekiq::Queue.all.find { |queue| queue.name == queue_name }
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def job_matches?(job, job_search_metadata)
 | 
						|
      job_search_metadata.all? { |key, value| job[key] == value }
 | 
						|
    end
 | 
						|
 | 
						|
    def timeout_exceeded?(start_time, timeout)
 | 
						|
      (Gitlab::Metrics::System.monotonic_time - start_time) > timeout
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |