From 8b46f14744d4bab9339d075825914d86da6bd5eb Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 9 Apr 2020 14:17:43 -0400 Subject: [PATCH] We have had errors reported due to migrations breaking and are reverting these series of commits. See: https://meta.discourse.org/t/new-installation-fails-on-migration/147425 This reverts commit 80e832662b719425872e7ac3736fb9fc56d85aca. This reverts commit de5f2d33087c8e9c12f83d573015d275098bd68f. This reverts commit 6b192d29fa095e91cb40b71e76dfc811f4aa205c. This reverts commit a5b582f686c0a8427aad3f6caf9f3a8105e66ee9. This reverts commit 708dd97dfd0380c703678a0ee070dc62880e57f1. --- lib/freedom_patches/safe_migrations.rb | 12 +-- lib/tasks/db.rake | 100 ------------------------- 2 files changed, 3 insertions(+), 109 deletions(-) diff --git a/lib/freedom_patches/safe_migrations.rb b/lib/freedom_patches/safe_migrations.rb index cdf989fdd5b..718ffffb89f 100644 --- a/lib/freedom_patches/safe_migrations.rb +++ b/lib/freedom_patches/safe_migrations.rb @@ -1,11 +1,5 @@ # frozen_string_literal: true -# We do not run this in production cause it is intrusive and has -# potential to break stuff, it also breaks under concurrent use -# which rake:multisite_migrate uses -# -# The protection is only needed in Dev and Test -if ENV['RAILS_ENV'] != "production" - require_dependency 'migration/safe_migrate' - Migration::SafeMigrate.patch_active_record! -end +require_dependency 'migration/safe_migrate' + +Migration::SafeMigrate.patch_active_record! diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 81087473a0e..14b2eb4e202 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -66,106 +66,6 @@ task 'db:rollback' => ['environment', 'set_locale'] do |_, args| Rake::Task['db:_dump'].invoke end -# our optimized version of multisite migrate, we have many sites and we have seeds -# this ensures we can run migrations concurrently to save huge amounts of time -Rake::Task['multisite:migrate'].clear - -class StdOutDemux - def initialize(stdout) - @stdout = stdout - @data = {} - end - - def write(data) - (@data[Thread.current] ||= +"") << data - end - - def close - finish_chunk - end - - def finish_chunk - data = @data[Thread.current] - if data - @stdout.write(data) - @data.delete Thread.current - end - end -end - -task 'multisite:migrate' => ['db:load_config', 'environment', 'set_locale'] do |_, args| - if ENV["RAILS_ENV"] != "production" - raise "Multisite migrate is only supported in production" - end - - concurrency = (ENV['MIGRATE_CONCURRENCY'].presence || "20").to_i - - puts "Multisite migrator is running using #{concurrency} threads" - puts - - queue = Queue.new - exceptions = Queue.new - - old_stdout = $stdout - $stdout = StdOutDemux.new($stdout) - - RailsMultisite::ConnectionManagement.each_connection do |db| - queue << db - end - - concurrency.times { queue << :done } - - SeedFu.quiet = true - - (1..concurrency).map do - Thread.new { - while true - db = queue.pop - break if db == :done - - RailsMultisite::ConnectionManagement.with_connection(db) do - begin - puts "Migrating #{db}" - ActiveRecord::Tasks::DatabaseTasks.migrate - SeedFu.seed(DiscoursePluginRegistry.seed_paths) - if !Discourse.skip_post_deployment_migrations? && ENV['SKIP_OPTIMIZE_ICONS'] != '1' - SiteIconManager.ensure_optimized! - end - rescue => e - exceptions << [db, e] - ensure - begin - $stdout.finish_chunk - rescue => ex - STDERR.puts ex.inspect - STDERR.puts ex.backtrace - end - end - end - end - } - end.each(&:join) - - $stdout = old_stdout - - if exceptions.length > 0 - STDERR.puts - STDERR.puts "-" * 80 - STDERR.puts "#{exceptions.length} migrations failed!" - while !exceptions.empty? - db, e = exceptions.pop - STDERR.puts - STDERR.puts "Failed to migrate #{db}" - STDERR.puts e.inspect - STDERR.puts e.backtrace - STDERR.puts - end - exit 1 - end - - Rake::Task['db:_dump'].invoke -end - # we need to run seed_fu every time we run rake db:migrate task 'db:migrate' => ['load_config', 'environment', 'set_locale'] do |_, args|