active_record_host_pool 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a62e23b1cbccc5365b119d31329f4c227a6efebf729ce49edb5f2dd63d704e39
4
- data.tar.gz: 815dcd119bebc0ddb5ad7308ca41b4906e15cc72ede2048d164623cdd539df7f
3
+ metadata.gz: 5eb359cbe2626874bf6836ee5b5b1826ccf02fef7b474f81f5eec273435232d0
4
+ data.tar.gz: 40383e9f54da681dd340b7dba75aac65613a34fd083862bf96a905f766c9f7ea
5
5
  SHA512:
6
- metadata.gz: 8c4022f240849bdc6be2140d5b6abda363264e1f1011e6781436537516c356c2ac4a05b82d30891143274113cf18575b0817b76ccc5f22a6fcb0ebd190148db1
7
- data.tar.gz: dd7d2ffed45316302a921ab8f70c7ae067cef09e5ae01a0961b1f899cc34808e5b6077d488182e590bc88b767dd670d29ebb6b83aaf18222c370a5fdd3c06f12
6
+ metadata.gz: 84d8eaafd2a6ebd88a42e89c8a52113b1ae3654123bf6d6735256e4787563862024af288b9755c254d445151c43d35502f52608e468beed6daad309225fb4480
7
+ data.tar.gz: 9a6493969b78849cea22220f562371e25a8215015ee747c5bf8ca533dfca4db21a637336c127c7abc50e6eee7d31843dd75b14fcbe7f329e461e2a24dc0fbd35
data/Readme.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build status](https://circleci.com/gh/zendesk/active_record_host_pool.svg?style=svg)](https://circleci.com/gh/zendesk/active_record_host_pool)
1
+ [![Build Status](https://github.com/zendesk/active_record_host_pool/workflows/CI/badge.svg)](https://github.com/zendesk/active_record_host_pool/actions?query=workflow%3ACI)
2
2
 
3
3
  # ActiveRecord host pooling
4
4
 
@@ -4,6 +4,7 @@ require 'active_record'
4
4
  require 'active_record/base'
5
5
  require 'active_record/connection_adapters/abstract_adapter'
6
6
 
7
+ require 'active_record_host_pool/clear_query_cache_patch'
7
8
  require 'active_record_host_pool/connection_proxy'
8
9
  require 'active_record_host_pool/pool_proxy'
9
10
  require 'active_record_host_pool/connection_adapter_mixin'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordHostPool
4
- VERSION = "1.0.1"
4
+ VERSION = "1.0.2"
5
5
  end
data/test/database.yml CHANGED
@@ -66,3 +66,12 @@ test_host_1_db_not_there:
66
66
  password: <%= mysql.password %>
67
67
  host: <%= mysql.host %>
68
68
  reconnect: true
69
+
70
+ test_host_1_db_shard:
71
+ adapter: mysql2
72
+ encoding: utf8
73
+ database: arhp_test_1_shard
74
+ username: <%= mysql.user %>
75
+ password: <%= mysql.password %>
76
+ host: <%= mysql.host %>
77
+ reconnect: true
data/test/helper.rb CHANGED
@@ -25,6 +25,13 @@ module ARHPTestSetup
25
25
  return if ARHPTestSetup.const_defined?('Test1')
26
26
 
27
27
  eval <<-RUBY
28
+ # The placement of the Test1Shard class is important so that its
29
+ # connection will not be the most recent connection established
30
+ # for test_host_1.
31
+ class Test1Shard < ::ActiveRecord::Base
32
+ establish_connection(:test_host_1_db_shard)
33
+ end
34
+
28
35
  class Test1 < ActiveRecord::Base
29
36
  self.table_name = "tests"
30
37
  establish_connection(:test_host_1_db_1)
@@ -60,4 +67,15 @@ module ARHPTestSetup
60
67
  def current_database(klass)
61
68
  klass.connection.select_value('select DATABASE()')
62
69
  end
70
+
71
+ # Remove a method from a given module that fixes something.
72
+ # Execute the passed in block.
73
+ # Re-add the method back to the module.
74
+ def without_module_patch(mod, method_name)
75
+ method_body = mod.instance_method(method_name)
76
+ mod.remove_method(method_name)
77
+ yield if block_given?
78
+ ensure
79
+ mod.define_method(method_name, method_body)
80
+ end
63
81
  end
data/test/schema.rb CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
  require_relative 'helper'
4
4
  ActiveRecord::Schema.define(version: 1) do
5
- create_table 'tests' do |t|
5
+ create_table 'tests', force: true do |t|
6
6
  t.string 'val'
7
7
  end
8
+
9
+ # Add a table only the shard database will have. Conditional
10
+ # exists since Phenix loads the schema file for every database.
11
+ if ActiveRecord::Base.connection.current_database == 'arhp_test_1_shard'
12
+ create_table 'test1_shards' do |t|
13
+ t.string 'name'
14
+ end
15
+ end
8
16
  end
data/test/test_arhp.rb CHANGED
@@ -19,7 +19,7 @@ class ActiveRecordHostPoolTest < Minitest::Test
19
19
 
20
20
  # Verify that when we fork, the process doesn't crash
21
21
  pid = Process.fork do
22
- if ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR == 2
22
+ if ActiveRecord.version >= Gem::Version.new('5.2')
23
23
  assert_equal(false, ActiveRecord::Base.connected?) # New to Rails 5.2
24
24
  else
25
25
  assert_equal(true, ActiveRecord::Base.connected?)
@@ -55,6 +55,38 @@ class ActiveRecordHostPoolTest < Minitest::Test
55
55
  assert_action_uses_correct_database(:insert, "insert into tests values(NULL, 'foo')")
56
56
  end
57
57
 
58
+ def test_models_with_matching_hosts_and_non_matching_databases_should_share_a_connection
59
+ simulate_rails_app_active_record_railties
60
+ assert_equal(Test1.connection.raw_connection, Test1Shard.connection.raw_connection)
61
+ end
62
+
63
+ if ActiveRecord.version >= Gem::Version.new('6.0')
64
+ def test_models_with_matching_hosts_and_non_matching_databases_issue_exists_without_arhp_patch
65
+ simulate_rails_app_active_record_railties
66
+
67
+ # Remove patch that fixes an issue in Rails 6+ to ensure it still
68
+ # exists. If this begins to fail then it may mean that Rails has fixed
69
+ # the issue so that it no longer occurs.
70
+ without_module_patch(ActiveRecordHostPool::ClearQueryCachePatch, :clear_query_caches_for_current_thread) do
71
+ exception = assert_raises(ActiveRecord::StatementInvalid) do
72
+ ActiveRecord::Base.cache { Test1Shard.create! }
73
+ end
74
+
75
+ assert_equal("Mysql2::Error: Table 'arhp_test_2.test1_shards' doesn't exist", exception.message)
76
+ end
77
+ end
78
+
79
+ def test_models_with_matching_hosts_and_non_matching_databases_do_not_mix_up_underlying_database
80
+ simulate_rails_app_active_record_railties
81
+
82
+ # ActiveRecord 6.0 introduced a change that surfaced a problematic code
83
+ # path in active_record_host_pool when clearing caches across connection
84
+ # handlers which can cause the database to change.
85
+ # See ActiveRecordHostPool::ClearQueryCachePatch
86
+ ActiveRecord::Base.cache { Test1Shard.create! }
87
+ end
88
+ end
89
+
58
90
  def test_connection_returns_a_proxy
59
91
  assert_kind_of ActiveRecordHostPool::ConnectionProxy, Test1.connection
60
92
  end
@@ -180,4 +212,16 @@ class ActiveRecordHostPoolTest < Minitest::Test
180
212
  assert_equal desired_db, current_database(klass)
181
213
  end
182
214
  end
215
+
216
+ def simulate_rails_app_active_record_railties
217
+ if ActiveRecord.version >= Gem::Version.new('6.0')
218
+ # Necessary for testing ActiveRecord 6.0 which uses the connection
219
+ # handlers when clearing query caches across all handlers when
220
+ # an operation that dirties the cache is involved (e.g. create/insert,
221
+ # update, delete/destroy, truncate, etc.)
222
+ ActiveRecord::Base.connection_handlers = {
223
+ ActiveRecord::Base.writing_role => ActiveRecord::Base.default_connection_handler
224
+ }
225
+ end
226
+ end
183
227
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_host_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Quorning
8
8
  - Gabe Martin-Dempesy
9
9
  - Pierre Schambacher
10
10
  - Ben Osheroff
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-03-30 00:00:00.000000000 Z
14
+ date: 2021-02-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -157,7 +157,7 @@ homepage: https://github.com/zendesk/active_record_host_pool
157
157
  licenses:
158
158
  - MIT
159
159
  metadata: {}
160
- post_install_message:
160
+ post_install_message:
161
161
  rdoc_options: []
162
162
  require_paths:
163
163
  - lib
@@ -172,8 +172,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0'
174
174
  requirements: []
175
- rubygems_version: 3.1.1
176
- signing_key:
175
+ rubygems_version: 3.2.2
176
+ signing_key:
177
177
  specification_version: 4
178
178
  summary: Allow ActiveRecord to share a connection to multiple databases on the same
179
179
  host