Migration warning helper, and only run in production env (#24253)
parent
e633b26f4f
commit
b9e34ef098
|
@ -1,7 +1,9 @@
|
||||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
|
require_relative '../../lib/mastodon/migration_helpers'
|
||||||
|
require_relative '../../lib/mastodon/migration_warning'
|
||||||
|
|
||||||
class IdsToBigints < ActiveRecord::Migration[5.1]
|
class IdsToBigints < ActiveRecord::Migration[5.1]
|
||||||
include Mastodon::MigrationHelpers
|
include Mastodon::MigrationHelpers
|
||||||
|
include Mastodon::MigrationWarning
|
||||||
|
|
||||||
disable_ddl_transaction!
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
@ -69,24 +71,12 @@ class IdsToBigints < ActiveRecord::Migration[5.1]
|
||||||
]
|
]
|
||||||
included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
|
included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
|
||||||
|
|
||||||
# Print out a warning that this will probably take a while.
|
migration_duration_warning(<<~EXPLANATION)
|
||||||
if $stdout.isatty
|
This migration has some sections that can be safely interrupted
|
||||||
say ''
|
and restarted later, and will tell you when those are occurring.
|
||||||
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/mastodon/mastodon/pull/5088'
|
|
||||||
|
|
||||||
10.downto(1) do |i|
|
For more information, see https://github.com/mastodon/mastodon/pull/5088
|
||||||
say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
|
EXPLANATION
|
||||||
sleep 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
tables = included_columns.map(&:first).uniq
|
tables = included_columns.map(&:first).uniq
|
||||||
table_sizes = {}
|
table_sizes = {}
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
require_relative '../../lib/mastodon/migration_warning'
|
||||||
|
|
||||||
class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
|
class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
|
||||||
|
include Mastodon::MigrationWarning
|
||||||
|
|
||||||
class Account < ApplicationRecord
|
class Account < ApplicationRecord
|
||||||
# Dummy class, to make migration possible across version changes
|
# Dummy class, to make migration possible across version changes
|
||||||
has_one :user, inverse_of: :account
|
has_one :user, inverse_of: :account
|
||||||
|
@ -35,22 +39,11 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
|
||||||
disable_ddl_transaction!
|
disable_ddl_transaction!
|
||||||
|
|
||||||
def up
|
def up
|
||||||
if $stdout.isatty
|
migration_duration_warning(<<~EXPLANATION)
|
||||||
say ''
|
This migration will irreversibly delete user accounts with duplicate
|
||||||
say 'WARNING: This migration may take a *long* time for large instances'
|
usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`
|
||||||
say 'It will *not* lock tables for any significant time, but it may run'
|
task to manually deal with such accounts before running this migration.
|
||||||
say 'for a very long time. We will pause for 10 seconds to allow you to'
|
EXPLANATION
|
||||||
say 'interrupt this migration if you are not ready.'
|
|
||||||
say ''
|
|
||||||
say 'This migration will irreversibly delete user accounts with duplicate'
|
|
||||||
say 'usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`'
|
|
||||||
say 'task to manually deal with such accounts before running this migration.'
|
|
||||||
|
|
||||||
10.downto(1) do |i|
|
|
||||||
say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
|
|
||||||
sleep 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_ary
|
duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_ary
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
require_relative '../../lib/mastodon/migration_warning'
|
||||||
|
|
||||||
class MigrateAccountConversations < ActiveRecord::Migration[5.2]
|
class MigrateAccountConversations < ActiveRecord::Migration[5.2]
|
||||||
|
include Mastodon::MigrationWarning
|
||||||
|
|
||||||
disable_ddl_transaction!
|
disable_ddl_transaction!
|
||||||
|
|
||||||
class Mention < ApplicationRecord
|
class Mention < ApplicationRecord
|
||||||
|
@ -62,19 +66,7 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2]
|
||||||
end
|
end
|
||||||
|
|
||||||
def up
|
def up
|
||||||
if $stdout.isatty
|
migration_duration_warning
|
||||||
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 ''
|
|
||||||
|
|
||||||
10.downto(1) do |i|
|
|
||||||
say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
|
|
||||||
sleep 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
migrated = 0
|
migrated = 0
|
||||||
last_time = Time.zone.now
|
last_time = Time.zone.now
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Mastodon
|
||||||
|
module MigrationWarning
|
||||||
|
WARNING_SECONDS = 10
|
||||||
|
|
||||||
|
DEFAULT_WARNING = <<~WARNING_MESSAGE
|
||||||
|
WARNING: This migration may take a *long* time for large instances.
|
||||||
|
It will *not* lock tables for any significant time, but it may run
|
||||||
|
for a very long time. We will pause for #{WARNING_SECONDS} seconds to allow you to
|
||||||
|
interrupt this migration if you are not ready.
|
||||||
|
WARNING_MESSAGE
|
||||||
|
|
||||||
|
def migration_duration_warning(explanation = nil)
|
||||||
|
return unless valid_environment?
|
||||||
|
|
||||||
|
announce_warning(explanation)
|
||||||
|
|
||||||
|
announce_countdown
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def announce_countdown
|
||||||
|
WARNING_SECONDS.downto(1) do |i|
|
||||||
|
say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_environment?
|
||||||
|
$stdout.isatty && Rails.env.production?
|
||||||
|
end
|
||||||
|
|
||||||
|
def announce_warning(explanation)
|
||||||
|
announce_message prepare_message(explanation)
|
||||||
|
end
|
||||||
|
|
||||||
|
def announce_message(text)
|
||||||
|
say ''
|
||||||
|
text.each_line do |line|
|
||||||
|
say(line)
|
||||||
|
end
|
||||||
|
say ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_message(explanation)
|
||||||
|
if explanation.blank?
|
||||||
|
DEFAULT_WARNING
|
||||||
|
else
|
||||||
|
DEFAULT_WARNING + "\n#{explanation}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Reference in New Issue