Skip to content

Commit

Permalink
Sync parallel test DBs to schema using SHA
Browse files Browse the repository at this point in the history
Previously, every time we ran tests in parallel we would load the schema
for all N DBs.

Now that we have the ability to sync DBs with the schema file exactly
using metadata and a SHA, we can instead only load the schemas when they
change.
  • Loading branch information
jhawthorn committed Aug 9, 2019
1 parent 9ddd936 commit d8b8171
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 16 deletions.
18 changes: 18 additions & 0 deletions activerecord/lib/active_record/tasks/database_tasks.rb
Expand Up @@ -347,6 +347,24 @@ def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format,
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
end

def reconstruct_from_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary") # :nodoc:
file ||= dump_filename(spec_name, format)

check_schema_file(file)

ActiveRecord::Base.establish_connection(configuration)

if schema_up_to_date?(configuration, format, file, environment, spec_name)
truncate_tables(configuration)
else
purge(configuration)
load_schema(configuration, format, file, environment, spec_name)
end
rescue ActiveRecord::NoDatabaseError
create(configuration)
load_schema(configuration, format, file, environment, spec_name)
end

def dump_schema(configuration, format = ActiveRecord::Base.schema_format, spec_name = "primary") # :nodoc:
require "active_record/schema_dumper"
filename = dump_filename(spec_name, format)
Expand Down
17 changes: 1 addition & 16 deletions activerecord/lib/active_record/test_databases.rb
Expand Up @@ -8,31 +8,16 @@ module TestDatabases # :nodoc:
create_and_load_schema(i, env_name: Rails.env)
end

ActiveSupport::Testing::Parallelization.run_cleanup_hook do
drop(env_name: Rails.env)
end

def self.create_and_load_schema(i, env_name:)
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"

ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
db_config.config["database"] += "-#{i}"
ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
end
ensure
ActiveRecord::Base.establish_connection(Rails.env.to_sym)
ENV["VERBOSE"] = old
end

def self.drop(env_name:)
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"

ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
end
ensure
ENV["VERBOSE"] = old
end
end
end

0 comments on commit d8b8171

Please sign in to comment.