20170918125918_ids_to_bigints.rb 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. require Rails.root.join('lib', 'mastodon', 'migration_helpers')
  2. class IdsToBigints < ActiveRecord::Migration[5.1]
  3. include Mastodon::MigrationHelpers
  4. disable_ddl_transaction!
  5. def migrate_columns(to_type)
  6. included_columns = [
  7. [:account_domain_blocks, :account_id],
  8. [:account_domain_blocks, :id],
  9. [:accounts, :id],
  10. [:blocks, :account_id],
  11. [:blocks, :id],
  12. [:blocks, :target_account_id],
  13. [:conversation_mutes, :account_id],
  14. [:conversation_mutes, :id],
  15. [:domain_blocks, :id],
  16. [:favourites, :account_id],
  17. [:favourites, :id],
  18. [:favourites, :status_id],
  19. [:follow_requests, :account_id],
  20. [:follow_requests, :id],
  21. [:follow_requests, :target_account_id],
  22. [:follows, :account_id],
  23. [:follows, :id],
  24. [:follows, :target_account_id],
  25. [:imports, :account_id],
  26. [:imports, :id],
  27. [:media_attachments, :account_id],
  28. [:media_attachments, :id],
  29. [:mentions, :account_id],
  30. [:mentions, :id],
  31. [:mutes, :account_id],
  32. [:mutes, :id],
  33. [:mutes, :target_account_id],
  34. [:notifications, :account_id],
  35. [:notifications, :from_account_id],
  36. [:notifications, :id],
  37. [:oauth_access_grants, :application_id],
  38. [:oauth_access_grants, :id],
  39. [:oauth_access_grants, :resource_owner_id],
  40. [:oauth_access_tokens, :application_id],
  41. [:oauth_access_tokens, :id],
  42. [:oauth_access_tokens, :resource_owner_id],
  43. [:oauth_applications, :id],
  44. [:oauth_applications, :owner_id],
  45. [:reports, :account_id],
  46. [:reports, :action_taken_by_account_id],
  47. [:reports, :id],
  48. [:reports, :target_account_id],
  49. [:session_activations, :access_token_id],
  50. [:session_activations, :user_id],
  51. [:session_activations, :web_push_subscription_id],
  52. [:settings, :id],
  53. [:settings, :thing_id],
  54. [:statuses, :account_id],
  55. [:statuses, :application_id],
  56. [:statuses, :in_reply_to_account_id],
  57. [:stream_entries, :account_id],
  58. [:stream_entries, :id],
  59. [:subscriptions, :account_id],
  60. [:subscriptions, :id],
  61. [:tags, :id],
  62. [:users, :account_id],
  63. [:users, :id],
  64. [:web_settings, :id],
  65. [:web_settings, :user_id],
  66. ]
  67. included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
  68. # Print out a warning that this will probably take a while.
  69. if $stdout.isatty
  70. say ''
  71. say 'WARNING: This migration may take a *long* time for large instances'
  72. say 'It will *not* lock tables for any significant time, but it may run'
  73. say 'for a very long time. We will pause for 10 seconds to allow you to'
  74. say 'interrupt this migration if you are not ready.'
  75. say ''
  76. say 'This migration has some sections that can be safely interrupted'
  77. say 'and restarted later, and will tell you when those are occurring.'
  78. say ''
  79. say 'For more information, see https://github.com/tootsuite/mastodon/pull/5088'
  80. 10.downto(1) do |i|
  81. say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
  82. sleep 1
  83. end
  84. end
  85. tables = included_columns.map(&:first).uniq
  86. table_sizes = {}
  87. # Sort tables by their size
  88. tables.each do |table|
  89. table_sizes[table] = estimate_rows_in_table(table)
  90. end
  91. ordered_columns = included_columns.sort_by do |col_parts|
  92. [-table_sizes[col_parts.first], col_parts.last]
  93. end
  94. ordered_columns.each do |column_parts|
  95. table, column = column_parts
  96. # Skip this if we're resuming and already did this one.
  97. next if column_for(table, column).sql_type == to_type.to_s
  98. change_column_type_concurrently table, column, to_type
  99. cleanup_concurrent_column_type_change table, column
  100. end
  101. end
  102. def up
  103. migrate_columns(:bigint)
  104. end
  105. def down
  106. migrate_columns(:integer)
  107. end
  108. end