Use EachBatch concern to loop over batches
This commit is contained in:
parent
2074f39a47
commit
d4e5ac1bed
2 changed files with 24 additions and 28 deletions
|
@ -19,7 +19,7 @@ class NamespacelessProjectDestroyWorker
|
|||
return
|
||||
end
|
||||
|
||||
return if namespace?(project) # Reject doing anything for projects that *do* have a namespace
|
||||
return if project.namespace # Reject doing anything for projects that *do* have a namespace
|
||||
|
||||
project.team.truncate
|
||||
|
||||
|
@ -30,10 +30,6 @@ class NamespacelessProjectDestroyWorker
|
|||
|
||||
private
|
||||
|
||||
def namespace?(project)
|
||||
project.namespace_id && Namespace.exists?(project.namespace_id)
|
||||
end
|
||||
|
||||
def unlink_fork(project)
|
||||
merge_requests = project.forked_from_project.merge_requests.opened.from_project(project)
|
||||
|
||||
|
|
|
@ -8,35 +8,31 @@ class CleanupNonexistingNamespacePendingDeleteProjects < ActiveRecord::Migration
|
|||
|
||||
disable_ddl_transaction!
|
||||
|
||||
class Project < ActiveRecord::Base
|
||||
self.table_name = 'projects'
|
||||
|
||||
include ::EachBatch
|
||||
end
|
||||
|
||||
class Namespace < ActiveRecord::Base
|
||||
self.table_name = 'namespaces'
|
||||
end
|
||||
|
||||
def up
|
||||
@offset = 0
|
||||
|
||||
loop do
|
||||
ids = pending_delete_batch
|
||||
|
||||
break if ids.empty?
|
||||
|
||||
args = ids.map { |id| Array(id) }
|
||||
find_projects.each_batch do |batch|
|
||||
args = batch.pluck(:id).map { |id| [id] }
|
||||
|
||||
NamespacelessProjectDestroyWorker.bulk_perform_async(args)
|
||||
|
||||
@offset += 1
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
# noop
|
||||
# NOOP
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def pending_delete_batch
|
||||
connection.exec_query(find_batch).map { |row| row['id'].to_i }
|
||||
end
|
||||
|
||||
BATCH_SIZE = 5000
|
||||
|
||||
def find_batch
|
||||
def find_projects
|
||||
projects = Project.arel_table
|
||||
namespaces = Namespace.arel_table
|
||||
|
||||
|
@ -44,11 +40,15 @@ class CleanupNonexistingNamespacePendingDeleteProjects < ActiveRecord::Migration
|
|||
.where(namespaces[:id].eq(projects[:namespace_id]))
|
||||
.exists.not
|
||||
|
||||
projects.project(projects[:id])
|
||||
.where(projects[:pending_delete].eq(true))
|
||||
# SELECT "projects"."id"
|
||||
# FROM "projects"
|
||||
# WHERE "projects"."pending_delete" = 't'
|
||||
# AND (NOT (EXISTS
|
||||
# (SELECT 1
|
||||
# FROM "namespaces"
|
||||
# WHERE "namespaces"."id" = "projects"."namespace_id")))
|
||||
Project.where(projects[:pending_delete].eq(true))
|
||||
.where(namespace_query)
|
||||
.skip(@offset * BATCH_SIZE)
|
||||
.take(BATCH_SIZE)
|
||||
.to_sql
|
||||
.select(:id)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue