summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-12-19 21:12:38 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2017-12-19 21:19:39 +0100
commite670bbe0c67c66b373fcce7c251c347d455fa1ed (patch)
treefe4a1703d454f6a78bf91f9cb92b3d4dc3d27b57
parentf51141878171c1162818f8fa0133125a5e92d3eb (diff)
downloadgitlab-ce-wait-between-updating-batches.tar.gz
Wait when updating batches of rows in migrationswait-between-updating-batches
This is combined with an increase in the max batch size so we don't end up waiting for hours when updating very large tables. For the current "issues" table (on GitLab.com) rewriting all rows should take about 20 minutes.
-rw-r--r--lib/gitlab/database/migration_helpers.rb9
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb1
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index 3f65bc912de..bb4a5660c36 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -219,6 +219,7 @@ module Gitlab
# table - The name of the table.
# column - The name of the column to update.
# value - The value for the column.
+ # wait_time - The amount of time to wait between batches, in seconds.
#
# The `value` argument is typically a literal. To perform a computed
# update, an Arel literal can be used instead:
@@ -235,7 +236,7 @@ module Gitlab
# make things _more_ complex).
#
# rubocop: disable Metrics/AbcSize
- def update_column_in_batches(table, column, value)
+ def update_column_in_batches(table, column, value, wait_time: 2)
if transaction_open?
raise 'update_column_in_batches can not be run inside a transaction, ' \
'you can disable transactions by calling disable_ddl_transaction! ' \
@@ -253,9 +254,9 @@ module Gitlab
# Update in batches of 5% until we run out of any rows to update.
batch_size = ((total / 100.0) * 5.0).ceil
- max_size = 1000
+ max_size = 10_000
- # The upper limit is 1000 to ensure we don't lock too many rows. For
+ # The upper limit is 10_000 to ensure we don't lock too many rows. For
# example, for "merge_requests" even 1% of the table is around 35 000
# rows for GitLab.com.
batch_size = max_size if batch_size > max_size
@@ -289,6 +290,8 @@ module Gitlab
execute(update_arel.to_sql)
+ sleep(wait_time) if wait_time
+
# There are no more rows left to update.
break unless stop_row
end
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 664ba0f7234..97aff3e2b60 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -7,6 +7,7 @@ describe Gitlab::Database::MigrationHelpers do
before do
allow(model).to receive(:puts)
+ allow(model).to receive(:sleep)
end
describe '#add_timestamps_with_timezone' do