]> cat aescling's git repositories - mastodon.git/commitdiff
Make CopyStatusStats migration use batches of 1000 to avoid locks (#8256)
authorEugen Rochko <eugen@zeonfederated.com>
Sat, 18 Aug 2018 01:44:50 +0000 (03:44 +0200)
committerGitHub <noreply@github.com>
Sat, 18 Aug 2018 01:44:50 +0000 (03:44 +0200)
db/migrate/20180812173710_copy_status_stats.rb

index 64a564ca07ba3ce9649f4467d5290bde6f134825..0c5907c301c7a147f6c3a09136efaf83b8b5e5f3 100644 (file)
@@ -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