Make CopyStatusStats migration use batches of 1000 to avoid locks (#8256)
This commit is contained in:
		
							parent
							
								
									d010816ba8
								
							
						
					
					
						commit
						edb1de7800
					
				
					 1 changed files with 10 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue