Skip to content
Snippets Groups Projects
20170104150317_requeue_pending_delete_projects.rb 1015 B
Newer Older
  • Learn to ignore specific revisions
  • # 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)).
    
          where(projects[:namespace_id].not_eq(nil)).
    
          skip(@offset * BATCH_SIZE).
          take(BATCH_SIZE).
          to_sql
      end
    end