diff options
author | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-04 18:02:28 +0300 |
---|---|---|
committer | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-24 13:25:42 +0300 |
commit | 19b87fb4cc38d80dcd0092344bd81d4e60d61b4f (patch) | |
tree | 9ffb6ec6f21d834d3cee35a49f3223c9013297da /db | |
parent | b60de9c0fd90c310d2a4146f75b67f9f360cbd6c (diff) |
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.rb | 48 |
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 |