summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZ.J. van de Weg <git@zjvandeweg.nl>2017-01-04 16:02:28 +0100
committerZ.J. van de Weg <git@zjvandeweg.nl>2017-01-24 11:25:42 +0100
commit19b87fb4cc38d80dcd0092344bd81d4e60d61b4f (patch)
tree9ffb6ec6f21d834d3cee35a49f3223c9013297da
parentb60de9c0fd90c310d2a4146f75b67f9f360cbd6c (diff)
downloadgitlab-ce-19b87fb4cc38d80dcd0092344bd81d4e60d61b4f.tar.gz
Requeue projects pending deletion
There have been several bugs in the project deletion service and worker. Resulting in projects stuck in pending delete state, which limits users to create projects with the same name, keeps stale records in the database, and all kinds of other trouble. This post deployment migration requeues all these projects for deletion, in the hope that most of these could be removed by the updated code.
-rw-r--r--changelogs/unreleased/zj-requeue-pending-delete.yml4
-rw-r--r--db/post_migrate/20170104150317_requeue_pending_delete_projects.rb48
2 files changed, 52 insertions, 0 deletions
diff --git a/changelogs/unreleased/zj-requeue-pending-delete.yml b/changelogs/unreleased/zj-requeue-pending-delete.yml
new file mode 100644
index 00000000000..464c5948f8c
--- /dev/null
+++ b/changelogs/unreleased/zj-requeue-pending-delete.yml
@@ -0,0 +1,4 @@
+---
+title: Requeue pending deletion projects
+merge_request:
+author:
diff --git a/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb b/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb
new file mode 100644
index 00000000000..f5423912b89
--- /dev/null
+++ b/db/post_migrate/20170104150317_requeue_pending_delete_projects.rb
@@ -0,0 +1,48 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class RequeuePendingDeleteProjects < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ admin = User.find_by(admin: true)
+ return unless admin
+
+ @offset = 0
+
+ loop do
+ ids = pending_delete_batch
+
+ break if ids.rows.count.zero?
+
+ args = ids.map { |id| [id['id'], admin.id, {}] }
+
+ Sidekiq::Client.push_bulk('class' => ProjectDestroyWorker, 'args' => args)
+
+ @offset += 1
+ end
+ end
+
+ def down
+ # noop
+ end
+
+ private
+
+ def pending_delete_batch
+ connection.exec_query(find_batch)
+ end
+
+ BATCH_SIZE = 5000
+
+ def find_batch
+ projects = Arel::Table.new(:projects)
+ projects.project(projects[:id]).
+ where(projects[:pending_delete].eq(true)).
+ skip(@offset * BATCH_SIZE).
+ take(BATCH_SIZE).
+ to_sql
+ end
+end