diff options
author | eileencodes <eileencodes@gmail.com> | 2017-01-13 16:16:40 -0800 |
---|---|---|
committer | eileencodes <eileencodes@gmail.com> | 2017-01-13 16:34:01 -0800 |
commit | e15a23fa355ed29d70c2ec573cd7b2418f7ac8db (patch) | |
tree | 6794c17dfd4f8a036b985a8ca830c1aa6026df5f /activerecord/test/cases/connection_adapters | |
parent | f2ef5159073db0fc30e7af59497be7e2f155f807 (diff) | |
download | rails-e15a23fa355ed29d70c2ec573cd7b2418f7ac8db.tar.gz rails-e15a23fa355ed29d70c2ec573cd7b2418f7ac8db.tar.bz2 rails-e15a23fa355ed29d70c2ec573cd7b2418f7ac8db.zip |
Fix pool_from_any_process to use most recent spec
If a process is forked more than once, the pool was grabbing the oldest
spec, not the most recent spec. This wasn't noticed before because most
folks are lilely forking the process only once.
If you're forking the process multiple times however the wrong spec name
will be returned and an incorrect connection will be used for the
process.
This fixes the issue by reversing the list of spec names so we can grab
the most recent spec rather than the oldest spec.
Diffstat (limited to 'activerecord/test/cases/connection_adapters')
-rw-r--r-- | activerecord/test/cases/connection_adapters/connection_handler_test.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/activerecord/test/cases/connection_adapters/connection_handler_test.rb b/activerecord/test/cases/connection_adapters/connection_handler_test.rb index 2c33bf22ab..4f2392042b 100644 --- a/activerecord/test/cases/connection_adapters/connection_handler_test.rb +++ b/activerecord/test/cases/connection_adapters/connection_handler_test.rb @@ -89,6 +89,41 @@ module ActiveRecord rd.close end + def test_pool_from_any_process_for_uses_most_recent_spec + skip unless current_adapter?(:SQLite3Adapter) + + file = Tempfile.new "lol.sqlite3" + + rd, wr = IO.pipe + rd.binmode + wr.binmode + + pid = fork do + ActiveRecord::Base.configurations["arunit"]["database"] = file.path + ActiveRecord::Base.establish_connection(:arunit) + + pid2 = fork do + wr.write ActiveRecord::Base.connection_config[:database] + wr.close + end + + Process.waitpid pid2 + end + + Process.waitpid pid + + wr.close + + assert_equal file.path, rd.read + + rd.close + ensure + if file + file.close + file.unlink + end + end + def test_a_class_using_custom_pool_and_switching_back_to_primary klass2 = Class.new(Base) { def self.name; "klass2"; end } |