summaryrefslogtreecommitdiff
path: root/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb
diff options
context:
space:
mode:
authorToon Claes <toon@iotcl.com>2017-08-16 14:46:26 +0200
committerToon Claes <toon@iotcl.com>2017-08-22 14:29:54 +0200
commit2074f39a47645b5ea453adfba84247f2fcc4f3c7 (patch)
tree3f2aab56177cf0704faa8d739ce61acc7055a99e /db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb
parentce89c425fe51d2317322350bbd8a364c08d97d21 (diff)
downloadgitlab-ce-2074f39a47645b5ea453adfba84247f2fcc4f3c7.tar.gz
Migration to remove pending delete projects with non-existing namespace
There might be some projects where the namespace was removed, but the project wasn't. For these the projects still have a `namespace_id` set. So this adds a post-deploy migration remove all projects that are pending delete, and have a `namespace_id` that is non-existing.
Diffstat (limited to 'db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb')
-rw-r--r--db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb b/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb
new file mode 100644
index 00000000000..fe88f25827f
--- /dev/null
+++ b/db/post_migrate/20170816102555_cleanup_nonexisting_namespace_pending_delete_projects.rb
@@ -0,0 +1,54 @@
+# Follow up of CleanupNamespacelessPendingDeleteProjects and it cleans
+# all projects with `pending_delete = true` and for which the
+# namespace no longer exists.
+class CleanupNonexistingNamespacePendingDeleteProjects < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ @offset = 0
+
+ loop do
+ ids = pending_delete_batch
+
+ break if ids.empty?
+
+ args = ids.map { |id| Array(id) }
+
+ NamespacelessProjectDestroyWorker.bulk_perform_async(args)
+
+ @offset += 1
+ end
+ end
+
+ def down
+ # 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
+ projects = Project.arel_table
+ namespaces = Namespace.arel_table
+
+ namespace_query = namespaces.project(1)
+ .where(namespaces[:id].eq(projects[:namespace_id]))
+ .exists.not
+
+ projects.project(projects[:id])
+ .where(projects[:pending_delete].eq(true))
+ .where(namespace_query)
+ .skip(@offset * BATCH_SIZE)
+ .take(BATCH_SIZE)
+ .to_sql
+ end
+end