From edb1de780060a0d62bc57153d743002c0a8bde67 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 18 Aug 2018 03:44:50 +0200
Subject: [PATCH] Make CopyStatusStats migration use batches of 1000 to avoid
locks (#8256)
---
db/migrate/20180812173710_copy_status_stats.rb | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/db/migrate/20180812173710_copy_status_stats.rb b/db/migrate/20180812173710_copy_status_stats.rb
index 64a564ca07..0c5907c301 100644
--- a/db/migrate/20180812173710_copy_status_stats.rb
+++ b/db/migrate/20180812173710_copy_status_stats.rb
@@ -3,13 +3,16 @@ class CopyStatusStats < ActiveRecord::Migration[5.2]
def up
safety_assured do
- execute <<-SQL.squish
- INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at)
- SELECT id, reblogs_count, favourites_count, created_at, updated_at
- FROM statuses
- ON CONFLICT (status_id) DO UPDATE
- SET reblogs_count = EXCLUDED.reblogs_count, favourites_count = EXCLUDED.favourites_count
- SQL
+ Status.where.not(id: StatusStat.select('status_id')).select('id').find_in_batches do |statuses|
+ execute <<-SQL.squish
+ INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at)
+ SELECT id, reblogs_count, favourites_count, created_at, updated_at
+ FROM statuses
+ WHERE id IN (#{statuses.map(&:id).join(', ')})
+ ON CONFLICT (status_id) DO UPDATE
+ SET reblogs_count = EXCLUDED.reblogs_count, favourites_count = EXCLUDED.favourites_count
+ SQL
+ end
end
end
--
GitLab