summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-10-21 12:11:29 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-10-21 12:11:29 +0000
commit559b1da28e46a9969315beb11ee2d2056f75b06d (patch)
treefad20c706047f4aca44c1f030cb81d5b1e302cab /lib/gitlab/background_migration
parenta065770457b66dc856897fc5282bf897b9e4f65b (diff)
downloadgitlab-ce-559b1da28e46a9969315beb11ee2d2056f75b06d.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/background_migration')
-rw-r--r--lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb37
1 files changed, 34 insertions, 3 deletions
diff --git a/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb b/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
index 815c346bb39..2e7d0c41509 100644
--- a/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
+++ b/lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb
@@ -4,6 +4,8 @@ module Gitlab
module BackgroundMigration
# Back-fills the `issues.namespace_id` by setting it to corresponding project.project_namespace_id
class BackfillProjectNamespaceOnIssues < BatchedMigrationJob
+ MAX_UPDATE_RETRIES = 3
+
def perform
each_sub_batch(
operation_name: :update_all,
@@ -12,13 +14,42 @@ module Gitlab
.select("issues.id AS issue_id, projects.project_namespace_id").where(issues: { namespace_id: nil })
}
) do |sub_batch|
- connection.execute <<~SQL
+ # updating issues table results in failed batches quite a bit,
+ # to prevent that as much as possible we try to update the same sub-batch up to 3 times.
+ update_with_retry(sub_batch)
+ end
+ end
+
+ private
+
+ # rubocop:disable Database/RescueQueryCanceled
+ # rubocop:disable Database/RescueStatementTimeout
+ def update_with_retry(sub_batch)
+ update_attempt = 1
+
+ begin
+ update_batch(sub_batch)
+ rescue ActiveRecord::StatementTimeout, ActiveRecord::QueryCanceled => e
+ update_attempt += 1
+
+ if update_attempt <= MAX_UPDATE_RETRIES
+ sleep(5)
+ retry
+ end
+
+ raise e
+ end
+ end
+ # rubocop:enable Database/RescueQueryCanceled
+ # rubocop:enable Database/RescueStatementTimeout
+
+ def update_batch(sub_batch)
+ connection.execute <<~SQL
UPDATE issues
SET namespace_id = projects.project_namespace_id
FROM (#{sub_batch.to_sql}) AS projects(issue_id, project_namespace_id)
WHERE issues.id = issue_id
- SQL
- end
+ SQL
end
end
end