Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions db/migrate/20250613210050_use_big_int_for_erratum_packages_id.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
class UseBigIntForErratumPackagesId < ActiveRecord::Migration[7.0]
def up
cleanup_duplicate_erratum_packages
execute 'ALTER SEQUENCE katello_erratum_packages_id_seq AS bigint;'
change_column :katello_erratum_packages, :id, :bigint
end
Expand All @@ -8,4 +9,55 @@
change_column :katello_erratum_packages, :id, :integer
execute 'ALTER SEQUENCE katello_erratum_packages_id_seq AS integer;'
end

def cleanup_duplicate_erratum_packages
duplicate_groups = Katello::ErratumPackage
.select(:nvrea, :erratum_id, :name, :filename)
.group(:nvrea, :erratum_id, :name, :filename)
.having('COUNT(*) > 1')

return if duplicate_groups.empty?

ids_to_delete = []
update_mappings = {}

duplicate_groups.each do |group|
duplicate_ids = Katello::ErratumPackage
.where(
nvrea: group.nvrea,
erratum_id: group.erratum_id,
name: group.name,
filename: group.filename
)
.order(:id)
.pluck(:id)

id_to_keep = duplicate_ids.first
ids_to_remove = duplicate_ids[1..]

ids_to_delete.concat(ids_to_remove)
ids_to_remove.each { |id| update_mappings[id] = id_to_keep }
end

return if ids_to_delete.empty?

update_mappings.each_slice(1000) do |batch|
batch.each do |old_id, new_id|
Katello::ModuleStreamErratumPackage
.where(erratum_package_id: old_id)
.where(
module_stream_id: Katello::ModuleStreamErratumPackage
.where(erratum_package_id: new_id)
.select(:module_stream_id)
)
.delete_all
Comment on lines +46 to +53
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (performance): The delete_all query may be inefficient due to nested where clauses.

This approach may trigger a subquery for each batch item, degrading performance with large datasets. Please consider optimizing by precomputing module_stream_ids or batching deletions.


Katello::ModuleStreamErratumPackage
.where(erratum_package_id: old_id)
.update_all(erratum_package_id: new_id)
end
end

Check failure on line 60 in db/migrate/20250613210050_use_big_int_for_erratum_packages_id.rb

View workflow job for this annotation

GitHub Actions / Rubocop / Rubocop

Layout/TrailingWhitespace: Trailing whitespace detected.
Katello::ErratumPackage.where(id: ids_to_delete).delete_all
end
end
Loading