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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/projects/destroy_service.rb')
-rw-r--r--app/services/projects/destroy_service.rb41
1 files changed, 25 insertions, 16 deletions
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index bc5be5bdff3..06a44b07f9f 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -132,7 +132,7 @@ module Projects
destroy_web_hooks!
destroy_project_bots!
destroy_ci_records!
- destroy_mr_diff_commits!
+ destroy_mr_diff_relations!
# Rails attempts to load all related records into memory before
# destroying: https://github.com/rails/rails/issues/22510
@@ -153,23 +153,28 @@ module Projects
# cascading deletes may exceed statement timeouts, causing failures.
# (see https://gitlab.com/gitlab-org/gitlab/-/issues/346166)
#
+ # Removing merge_request_diff_files records may also cause timeouts, so they
+ # can be deleted in batches as well.
+ #
# rubocop: disable CodeReuse/ActiveRecord
- def destroy_mr_diff_commits!
+ def destroy_mr_diff_relations!
mr_batch_size = 100
delete_batch_size = 1000
project.merge_requests.each_batch(column: :iid, of: mr_batch_size) do |relation_ids|
- loop do
- inner_query = MergeRequestDiffCommit
- .select(:merge_request_diff_id, :relative_order)
- .where(merge_request_diff_id: MergeRequestDiff.where(merge_request_id: relation_ids).select(:id))
- .limit(delete_batch_size)
-
- deleted_rows = MergeRequestDiffCommit
- .where('(merge_request_diff_commits.merge_request_diff_id, merge_request_diff_commits.relative_order) IN (?)', inner_query)
- .delete_all
-
- break if deleted_rows == 0
+ [MergeRequestDiffCommit, MergeRequestDiffFile].each do |model|
+ loop do
+ inner_query = model
+ .select(:merge_request_diff_id, :relative_order)
+ .where(merge_request_diff_id: MergeRequestDiff.where(merge_request_id: relation_ids).select(:id))
+ .limit(delete_batch_size)
+
+ deleted_rows = model
+ .where("(#{model.table_name}.merge_request_diff_id, #{model.table_name}.relative_order) IN (?)", inner_query) # rubocop:disable GitlabSecurity/SqlInjection
+ .delete_all
+
+ break if deleted_rows == 0
+ end
end
end
end
@@ -212,7 +217,7 @@ module Projects
# produces smaller and faster queries to the database.
def destroy_web_hooks!
project.hooks.find_each do |web_hook|
- result = ::WebHooks::DestroyService.new(current_user).sync_destroy(web_hook)
+ result = ::WebHooks::DestroyService.new(current_user).execute(web_hook)
unless result[:status] == :success
raise_error(s_('DeleteProject|Failed to remove webhooks. Please try again or contact administrator.'))
@@ -263,8 +268,12 @@ module Projects
end
def publish_project_deleted_event_for(project)
- data = { project_id: project.id, namespace_id: project.namespace_id }
- event = Projects::ProjectDeletedEvent.new(data: data)
+ event = Projects::ProjectDeletedEvent.new(data: {
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id
+ })
+
Gitlab::EventStore.publish(event)
end
end