122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
						|
 | 
						|
class IdsToBigints < ActiveRecord::Migration[5.1]
 | 
						|
  include Mastodon::MigrationHelpers
 | 
						|
 | 
						|
  disable_ddl_transaction!
 | 
						|
 | 
						|
  def migrate_columns(to_type)
 | 
						|
    included_columns = [
 | 
						|
      [:account_domain_blocks, :account_id],
 | 
						|
      [:account_domain_blocks, :id],
 | 
						|
      [:accounts, :id],
 | 
						|
      [:blocks, :account_id],
 | 
						|
      [:blocks, :id],
 | 
						|
      [:blocks, :target_account_id],
 | 
						|
      [:conversation_mutes, :account_id],
 | 
						|
      [:conversation_mutes, :id],
 | 
						|
      [:domain_blocks, :id],
 | 
						|
      [:favourites, :account_id],
 | 
						|
      [:favourites, :id],
 | 
						|
      [:favourites, :status_id],
 | 
						|
      [:follow_requests, :account_id],
 | 
						|
      [:follow_requests, :id],
 | 
						|
      [:follow_requests, :target_account_id],
 | 
						|
      [:follows, :account_id],
 | 
						|
      [:follows, :id],
 | 
						|
      [:follows, :target_account_id],
 | 
						|
      [:imports, :account_id],
 | 
						|
      [:imports, :id],
 | 
						|
      [:media_attachments, :account_id],
 | 
						|
      [:media_attachments, :id],
 | 
						|
      [:mentions, :account_id],
 | 
						|
      [:mentions, :id],
 | 
						|
      [:mutes, :account_id],
 | 
						|
      [:mutes, :id],
 | 
						|
      [:mutes, :target_account_id],
 | 
						|
      [:notifications, :account_id],
 | 
						|
      [:notifications, :from_account_id],
 | 
						|
      [:notifications, :id],
 | 
						|
      [:oauth_access_grants, :application_id],
 | 
						|
      [:oauth_access_grants, :id],
 | 
						|
      [:oauth_access_grants, :resource_owner_id],
 | 
						|
      [:oauth_access_tokens, :application_id],
 | 
						|
      [:oauth_access_tokens, :id],
 | 
						|
      [:oauth_access_tokens, :resource_owner_id],
 | 
						|
      [:oauth_applications, :id],
 | 
						|
      [:oauth_applications, :owner_id],
 | 
						|
      [:reports, :account_id],
 | 
						|
      [:reports, :action_taken_by_account_id],
 | 
						|
      [:reports, :id],
 | 
						|
      [:reports, :target_account_id],
 | 
						|
      [:session_activations, :access_token_id],
 | 
						|
      [:session_activations, :user_id],
 | 
						|
      [:session_activations, :web_push_subscription_id],
 | 
						|
      [:settings, :id],
 | 
						|
      [:settings, :thing_id],
 | 
						|
      [:statuses, :account_id],
 | 
						|
      [:statuses, :application_id],
 | 
						|
      [:statuses, :in_reply_to_account_id],
 | 
						|
      [:stream_entries, :account_id],
 | 
						|
      [:stream_entries, :id],
 | 
						|
      [:subscriptions, :account_id],
 | 
						|
      [:subscriptions, :id],
 | 
						|
      [:tags, :id],
 | 
						|
      [:users, :account_id],
 | 
						|
      [:users, :id],
 | 
						|
      [:web_settings, :id],
 | 
						|
      [:web_settings, :user_id],
 | 
						|
    ]
 | 
						|
    included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
 | 
						|
 | 
						|
    # Print out a warning that this will probably take a while.
 | 
						|
    if $stdout.isatty
 | 
						|
      say ''
 | 
						|
      say 'WARNING: This migration may take a *long* time for large instances'
 | 
						|
      say 'It will *not* lock tables for any significant time, but it may run'
 | 
						|
      say 'for a very long time. We will pause for 10 seconds to allow you to'
 | 
						|
      say 'interrupt this migration if you are not ready.'
 | 
						|
      say ''
 | 
						|
      say 'This migration has some sections that can be safely interrupted'
 | 
						|
      say 'and restarted later, and will tell you when those are occurring.'
 | 
						|
      say ''
 | 
						|
      say 'For more information, see https://github.com/tootsuite/mastodon/pull/5088'
 | 
						|
 | 
						|
      10.downto(1) do |i|
 | 
						|
        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
 | 
						|
        sleep 1
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    tables = included_columns.map(&:first).uniq
 | 
						|
    table_sizes = {}
 | 
						|
 | 
						|
    # Sort tables by their size
 | 
						|
    tables.each do |table|
 | 
						|
      table_sizes[table] = estimate_rows_in_table(table)
 | 
						|
    end
 | 
						|
 | 
						|
    ordered_columns = included_columns.sort_by do |col_parts|
 | 
						|
      [-table_sizes[col_parts.first], col_parts.last]
 | 
						|
    end
 | 
						|
 | 
						|
    ordered_columns.each do |column_parts|
 | 
						|
      table, column = column_parts
 | 
						|
 | 
						|
      # Skip this if we're resuming and already did this one.
 | 
						|
      next if column_for(table, column).sql_type == to_type.to_s
 | 
						|
 | 
						|
      change_column_type_concurrently table, column, to_type
 | 
						|
      cleanup_concurrent_column_type_change table, column
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def up
 | 
						|
    migrate_columns(:bigint)
 | 
						|
  end
 | 
						|
 | 
						|
  def down
 | 
						|
    migrate_columns(:integer)
 | 
						|
  end
 | 
						|
end
 |