2020-08-26 20:10:33 -04:00
# frozen_string_literal: true
class IssueRebalancingWorker
include ApplicationWorker
2021-07-21 08:09:35 -04:00
data_consistency :always
2021-04-30 14:10:09 -04:00
sidekiq_options retry : 3
2020-08-26 20:10:33 -04:00
idempotent!
urgency :low
feature_category :issue_tracking
2021-05-19 14:10:39 -04:00
deduplicate :until_executed , including_scheduled : true
2020-08-26 20:10:33 -04:00
2021-05-19 14:10:39 -04:00
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-09-01 05:10:28 -04:00
2021-05-19 14:10:39 -04:00
# 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-05-17 14:10:42 -04:00
2021-05-19 14:10:39 -04:00
# 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-09-15 08:11:13 -04:00
Issues :: RelativePositionRebalancingService . new ( projects_to_rebalance ) . execute
rescue Issues :: RelativePositionRebalancingService :: TooManyConcurrentRebalances = > e
2021-05-19 14:10:39 -04:00
Gitlab :: ErrorTracking . log_exception ( e , root_namespace_id : root_namespace_id , project_id : project_id )
end
private
2021-05-17 14:10:42 -04:00
2021-05-19 14:10:39 -04:00
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-08-26 20:10:33 -04:00
2021-05-19 14:10:39 -04:00
Namespace . find_by_id ( root_namespace_id ) & . all_projects
2020-08-26 20:10:33 -04:00
end
end