From: Tom Clegg Date: Thu, 13 Apr 2023 15:47:46 +0000 (-0400) Subject: 20334: Batch permission updates during link dedup migration. X-Git-Tag: 2.7.0~144^2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/7ea0bf89df6f3400a1c96f8838a2a7a1e3706e48 20334: Batch permission updates during link dedup migration. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/services/api/db/migrate/20221219165512_dedup_permission_links.rb b/services/api/db/migrate/20221219165512_dedup_permission_links.rb index ec9ea591d4..6ae04cc954 100644 --- a/services/api/db/migrate/20221219165512_dedup_permission_links.rb +++ b/services/api/db/migrate/20221219165512_dedup_permission_links.rb @@ -2,37 +2,41 @@ # # SPDX-License-Identifier: AGPL-3.0 +require 'update_permissions' + class DedupPermissionLinks < ActiveRecord::Migration[5.2] include CurrentApiClient def up act_as_system_user do - rows = ActiveRecord::Base.connection.select_all("SELECT MIN(uuid) AS uuid, COUNT(uuid) AS n FROM links - WHERE tail_uuid IS NOT NULL - AND head_uuid IS NOT NULL - AND link_class = 'permission' - AND name in ('can_read', 'can_write', 'can_manage') - GROUP BY (tail_uuid, head_uuid) - HAVING COUNT(uuid) > 1") - rows.each do |row| - Rails.logger.debug "DedupPermissionLinks: consolidating #{row['n']} links into #{row['uuid']}" - link = Link.find_by_uuid(row['uuid']) - # This no-op update has the side effect that the update hooks - # will merge the highest available permission into this one - # and then delete the others. - link.update_attributes!(properties: link.properties.dup) - end + batch_update_permissions do + rows = ActiveRecord::Base.connection.select_all("SELECT MIN(uuid) AS uuid, COUNT(uuid) AS n FROM links + WHERE tail_uuid IS NOT NULL + AND head_uuid IS NOT NULL + AND link_class = 'permission' + AND name in ('can_read', 'can_write', 'can_manage') + GROUP BY (tail_uuid, head_uuid) + HAVING COUNT(uuid) > 1") + rows.each do |row| + Rails.logger.debug "DedupPermissionLinks: consolidating #{row['n']} links into #{row['uuid']}" + link = Link.find_by_uuid(row['uuid']) + # This no-op update has the side effect that the update hooks + # will merge the highest available permission into this one + # and then delete the others. + link.update_attributes!(properties: link.properties.dup) + end - rows = ActiveRecord::Base.connection.select_all("SELECT MIN(uuid) AS uuid, COUNT(uuid) AS n FROM links - WHERE tail_uuid IS NOT NULL - AND head_uuid IS NOT NULL - AND link_class = 'permission' - AND name = 'can_login' - GROUP BY (tail_uuid, head_uuid, properties) - HAVING COUNT(uuid) > 1") - rows.each do |row| - Rails.logger.debug "DedupPermissionLinks: consolidating #{row['n']} links into #{row['uuid']}" - link = Link.find_by_uuid(row['uuid']) - link.update_attributes!(properties: link.properties.dup) + rows = ActiveRecord::Base.connection.select_all("SELECT MIN(uuid) AS uuid, COUNT(uuid) AS n FROM links + WHERE tail_uuid IS NOT NULL + AND head_uuid IS NOT NULL + AND link_class = 'permission' + AND name = 'can_login' + GROUP BY (tail_uuid, head_uuid, properties) + HAVING COUNT(uuid) > 1") + rows.each do |row| + Rails.logger.debug "DedupPermissionLinks: consolidating #{row['n']} links into #{row['uuid']}" + link = Link.find_by_uuid(row['uuid']) + link.update_attributes!(properties: link.properties.dup) + end end end end