Welcome to mirror list, hosted at ThFree Co, Russian Federation.

issue_rebalancing_worker.rb « workers « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a43e76feae4964cd39b266234cc55cb57cfc4999 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true

# todo: remove this worker and it's queue definition from all_queues after Issue::RebalancingWorker is released.
# We want to keep it for one release in case some jobs are already scheduled in the old queue so we need the worker
# to be available to finish those. All new jobs will be queued into the new queue.
class IssueRebalancingWorker
  include ApplicationWorker

  data_consistency :always

  sidekiq_options retry: 3

  idempotent!
  urgency :low
  feature_category :team_planning
  deduplicate :until_executed, including_scheduled: true

  def perform(ignore = nil, project_id = nil, root_namespace_id = nil)
    # we need to have exactly one of the project_id and root_namespace_id params be non-nil
    raise ArgumentError, "Expected only one of the params project_id: #{project_id} and root_namespace_id: #{root_namespace_id}" if project_id && root_namespace_id
    return if project_id.nil? && root_namespace_id.nil?
    return if ::Gitlab::Issues::Rebalancing::State.rebalance_recently_finished?(project_id, root_namespace_id)

    # pull the projects collection to be rebalanced either the project if namespace is not a group(i.e. user namesapce)
    # or the root namespace, this also makes the worker backward compatible with previous version where a project_id was
    # passed as the param
    projects_to_rebalance = projects_collection(project_id, root_namespace_id)

    # something might have happened with the namespace between scheduling the worker and actually running it,
    # maybe it was removed.
    if projects_to_rebalance.blank?
      Gitlab::ErrorTracking.log_exception(
        ArgumentError.new("Projects to be rebalanced not found for arguments: project_id #{project_id}, root_namespace_id: #{root_namespace_id}"),
        { project_id: project_id, root_namespace_id: root_namespace_id })

      return
    end

    Issues::RelativePositionRebalancingService.new(projects_to_rebalance).execute
  rescue Issues::RelativePositionRebalancingService::TooManyConcurrentRebalances => e
    Gitlab::ErrorTracking.log_exception(e, root_namespace_id: root_namespace_id, project_id: project_id)
  end

  private

  def projects_collection(project_id, root_namespace_id)
    # we can have either project_id(older version) or project_id if project is part of a user namespace and not a group
    # or root_namespace_id(newer version) never both.
    return Project.id_in([project_id]) if project_id

    Namespace.find_by_id(root_namespace_id)&.all_projects
  end
end