summaryrefslogtreecommitdiff
path: root/db
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 /db
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.
Diffstat (limited to 'db')
-rw-r--r--db/post_migrate/20170104150317_requeue_pending_delete_projects.rb48
1 files changed, 48 insertions, 0 deletions
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