diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-17 19:05:49 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-05-17 19:05:49 +0300 |
commit | 43a25d93ebdabea52f99b05e15b06250cd8f07d7 (patch) | |
tree | dceebdc68925362117480a5d672bcff122fb625b /db/post_migrate/20230317080000_ensure_unique_debian_packages.rb | |
parent | 20c84b99005abd1c82101dfeff264ac50d2df211 (diff) |
Add latest changes from gitlab-org/gitlab@16-0-stable-eev16.0.0-rc42
Diffstat (limited to 'db/post_migrate/20230317080000_ensure_unique_debian_packages.rb')
-rw-r--r-- | db/post_migrate/20230317080000_ensure_unique_debian_packages.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/db/post_migrate/20230317080000_ensure_unique_debian_packages.rb b/db/post_migrate/20230317080000_ensure_unique_debian_packages.rb new file mode 100644 index 00000000000..250e0cb2369 --- /dev/null +++ b/db/post_migrate/20230317080000_ensure_unique_debian_packages.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class EnsureUniqueDebianPackages < Gitlab::Database::Migration[2.1] + BATCH_SIZE = 1_000 + + disable_ddl_transaction! + + restrict_gitlab_migration gitlab_schema: :gitlab_main + + class Package < MigrationRecord + include EachBatch + + self.table_name = 'packages_packages' + + enum package_type: { debian: 9 } + + enum status: { pending_destruction: 4 } + end + + def up + Package.distinct_each_batch(column: :project_id) do |package_projects| + project_ids = package_projects.pluck(:project_id) + duplicates = Package.debian + .not_pending_destruction + .where(project_id: project_ids) + .select('project_id, name, version, MAX(id) as last_id') + .group(:project_id, :name, :version) + .having('count(id) > 1') + loop do + duplicates.limit(BATCH_SIZE).each do |duplicate| + Package.debian + .not_pending_destruction + .where( + project_id: duplicate.project_id, + name: duplicate.name, + version: duplicate.version, + id: ..duplicate.last_id - 1 + ).update_all status: :pending_destruction + end + break unless duplicates.exists? + end + end + end + + def down + # nothing to do + end +end |