From b41b4d2e6a44a04fc3e6fff09cf45f93033ff0ad Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Fri, 7 Jul 2017 15:19:43 +0200
Subject: [PATCH] Use new `each_batch` helper instead of custom one

In stage_id backgrond migration.
---
 app/models/concerns/each_batch.rb                  |  4 ++--
 ...858_migrate_stage_id_reference_in_background.rb | 14 ++++++++------
 ...igrate_stage_id_reference_in_background_spec.rb |  6 +++---
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/app/models/concerns/each_batch.rb b/app/models/concerns/each_batch.rb
index 6610e7967d1..53979c4c683 100644
--- a/app/models/concerns/each_batch.rb
+++ b/app/models/concerns/each_batch.rb
@@ -35,7 +35,7 @@ module EachBatch
       start_id = start[primary_key]
       arel_table = self.arel_table
 
-      loop do
+      1.step do |index|
         stop = except(:select)
           .select(primary_key)
           .where(arel_table[primary_key].gteq(start_id))
@@ -54,7 +54,7 @@ module EachBatch
 
         # Any ORDER BYs are useless for this relation and can lead to less
         # efficient UPDATE queries, hence we get rid of it.
-        yield relation.except(:order)
+        yield relation.except(:order), index
 
         break unless stop
       end
diff --git a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb b/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
index 0d108d18501..107a5661329 100644
--- a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
+++ b/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
@@ -7,18 +7,20 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration
 
   disable_ddl_transaction!
 
+  class Build < ActiveRecord::Base
+    self.table_name = 'ci_builds'
+    include ::EachBatch
+  end
+
   ##
   # It will take around 3 days to process 20M ci_builds.
   #
   def up
-    opts = { scope: ->(table, query) { query.where(table[:stage_id].eq(nil)) },
-             of: BATCH_SIZE }
-
-    walk_table_in_batches(:ci_builds, **opts) do |index, start_id, stop_id|
+    Build.all.each_batch(of: BATCH_SIZE) do |relation, index|
+      range = relation.pluck('MIN(id)', 'MAX(id)').first
       schedule = index * 2.minutes
 
-      BackgroundMigrationWorker
-        .perform_in(schedule, MIGRATION, [start_id, stop_id])
+      BackgroundMigrationWorker.perform_in(schedule, MIGRATION, range)
     end
   end
 
diff --git a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
index f3dde8b59c0..90ad5c39089 100644
--- a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
+++ b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
@@ -47,9 +47,9 @@ describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do
       Timecop.freeze do
         migrate!
 
-        expect(described_class::MIGRATION).to be_scheduled_migration(2.minutes, 1, 3)
-        expect(described_class::MIGRATION).to be_scheduled_migration(4.minutes, 3, 5)
-        expect(described_class::MIGRATION).to be_scheduled_migration(6.minutes, 5, 0)
+        expect(described_class::MIGRATION).to be_scheduled_migration(2.minutes, 1, 2)
+        expect(described_class::MIGRATION).to be_scheduled_migration(4.minutes, 3, 4)
+        expect(described_class::MIGRATION).to be_scheduled_migration(6.minutes, 5, 6)
         expect(BackgroundMigrationWorker.jobs.size).to eq 3
       end
     end
-- 
GitLab