2020-11-24 15:15:51 +05:30
# frozen_string_literal: true
class IssueRebalancingWorker
include ApplicationWorker
2021-10-27 15:23:28 +05:30
data_consistency :always
2021-06-08 01:23:25 +05:30
sidekiq_options retry : 3
2020-11-24 15:15:51 +05:30
idempotent!
urgency :low
feature_category :issue_tracking
2021-09-04 01:27:46 +05:30
deduplicate :until_executed , including_scheduled : true
2020-11-24 15:15:51 +05:30
2021-09-04 01:27:46 +05:30
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?
2020-11-24 15:15:51 +05:30
2021-09-04 01:27:46 +05:30
# 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 )
2021-06-08 01:23:25 +05:30
2021-09-04 01:27:46 +05:30
# 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
2021-11-11 11:23:49 +05:30
Issues :: RelativePositionRebalancingService . new ( projects_to_rebalance ) . execute
rescue Issues :: RelativePositionRebalancingService :: TooManyConcurrentRebalances = > e
2021-09-04 01:27:46 +05:30
Gitlab :: ErrorTracking . log_exception ( e , root_namespace_id : root_namespace_id , project_id : project_id )
end
private
2021-06-08 01:23:25 +05:30
2021-09-04 01:27:46 +05:30
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
2020-11-24 15:15:51 +05:30
2021-09-04 01:27:46 +05:30
Namespace . find_by_id ( root_namespace_id ) & . all_projects
2020-11-24 15:15:51 +05:30
end
end