diff --git a/ee/app/models/ee/epic.rb b/ee/app/models/ee/epic.rb index 303205c41bb710eb1f686d0e7804a116ee70ddb4..95d0b0ca07f84d469793cec4ac957d6886f150ba 100644 --- a/ee/app/models/ee/epic.rb +++ b/ee/app/models/ee/epic.rb @@ -307,11 +307,26 @@ def parent_class ::Group end + # TODO: both nullification and cache count update can be removed when + # cross-group epic relationships are enabled: https://gitlab.com/gitlab-org/gitlab/-/issues/373977 def nullify_lost_group_parents(groups, lost_groups) epics_to_update = in_selected_groups(groups).where(parent: in_selected_groups(lost_groups)) + schedule_parent_cache_update(epics_to_update) epics_to_update.update_all(parent_id: nil) end + # rubocop:disable Scalability/BulkPerformWithContext + def schedule_parent_cache_update(epics) + return unless ::Feature.enabled?(:cache_issue_sums) + + parent_ids = epics.distinct.pluck(:parent_id) + ::Epics::UpdateCachedMetadataWorker.bulk_perform_in( + 1.minute, + parent_ids.each_slice(::Epics::UpdateCachedMetadataWorker::BATCH_SIZE).map { |ids| [ids] } + ) + end + # rubocop:enable Scalability/BulkPerformWithContext + # Return the deepest relation level for an epic. # Example 1: # epic1 - parent: nil diff --git a/ee/spec/services/groups/transfer_service_spec.rb b/ee/spec/services/groups/transfer_service_spec.rb index b00103aafd5faa9c54ac88bdaf582a1b0f70c201..5e8693551decba59b4210fc414aa6f50be1a9fe8 100644 --- a/ee/spec/services/groups/transfer_service_spec.rb +++ b/ee/spec/services/groups/transfer_service_spec.rb @@ -148,6 +148,31 @@ expect(level_2_epic_2.reload.parent).to be_nil end end + + describe 'update cached metadata' do + subject { described_class.new(subgroup_group_level_1, user).execute(new_group) } + + it 'schedules update of issue counts for removed parent epic references' do + expect(::Epics::UpdateCachedMetadataWorker).to receive(:bulk_perform_in) do |delay, ids| + expect(delay).to eq(1.minute) + expect(ids.flatten).to match_array([level_1_epic_1.parent_id, level_2_epic_1.parent_id].uniq) + end.once + + subject + end + + context 'when cache_issue_sums flag is disabled' do + before do + stub_feature_flags(cache_issue_sums: false) + end + + it 'does not schedule update of issue counts for removed parent epic references' do + expect(::Epics::UpdateCachedMetadataWorker).not_to receive(:bulk_perform_in) + + subject + end + end + end end end