active_record_host_pool 1.2.4 → 2.0.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_host_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 2.0.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Quorning
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-03-20 00:00:00.000000000 Z
14
+ date: 2023-11-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -19,160 +19,20 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 5.1.0
22
+ version: 6.1.0
23
23
  - - "<"
24
24
  - !ruby/object:Gem::Version
25
- version: '7.1'
25
+ version: '7.2'
26
26
  type: :runtime
27
27
  prerelease: false
28
28
  version_requirements: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 5.1.0
32
+ version: 6.1.0
33
33
  - - "<"
34
34
  - !ruby/object:Gem::Version
35
- version: '7.1'
36
- - !ruby/object:Gem::Dependency
37
- name: mysql2
38
- requirement: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
- type: :runtime
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: '0'
50
- - !ruby/object:Gem::Dependency
51
- name: bump
52
- requirement: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: '0'
57
- type: :development
58
- prerelease: false
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: '0'
64
- - !ruby/object:Gem::Dependency
65
- name: minitest
66
- requirement: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 5.10.0
71
- type: :development
72
- prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: 5.10.0
78
- - !ruby/object:Gem::Dependency
79
- name: minitest-fail-fast
80
- requirement: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- version: '0'
85
- type: :development
86
- prerelease: false
87
- version_requirements: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: '0'
92
- - !ruby/object:Gem::Dependency
93
- name: minitest-line
94
- requirement: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: '0'
99
- type: :development
100
- prerelease: false
101
- version_requirements: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- version: '0'
106
- - !ruby/object:Gem::Dependency
107
- name: minitest-mock_expectations
108
- requirement: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: 1.1.3
113
- type: :development
114
- prerelease: false
115
- version_requirements: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: 1.1.3
120
- - !ruby/object:Gem::Dependency
121
- name: phenix
122
- requirement: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- version: 1.0.1
127
- type: :development
128
- prerelease: false
129
- version_requirements: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- version: 1.0.1
134
- - !ruby/object:Gem::Dependency
135
- name: pry-byebug
136
- requirement: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - "~>"
139
- - !ruby/object:Gem::Version
140
- version: '3.9'
141
- type: :development
142
- prerelease: false
143
- version_requirements: !ruby/object:Gem::Requirement
144
- requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: '3.9'
148
- - !ruby/object:Gem::Dependency
149
- name: rake
150
- requirement: !ruby/object:Gem::Requirement
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- version: 12.0.0
155
- type: :development
156
- prerelease: false
157
- version_requirements: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - ">="
160
- - !ruby/object:Gem::Version
161
- version: 12.0.0
162
- - !ruby/object:Gem::Dependency
163
- name: rubocop
164
- requirement: !ruby/object:Gem::Requirement
165
- requirements:
166
- - - "~>"
167
- - !ruby/object:Gem::Version
168
- version: 0.80.0
169
- type: :development
170
- prerelease: false
171
- version_requirements: !ruby/object:Gem::Requirement
172
- requirements:
173
- - - "~>"
174
- - !ruby/object:Gem::Version
175
- version: 0.80.0
35
+ version: '7.2'
176
36
  description: ''
177
37
  email:
178
38
  - bquorning@zendesk.com
@@ -184,6 +44,7 @@ extra_rdoc_files:
184
44
  - MIT-LICENSE
185
45
  - Readme.md
186
46
  files:
47
+ - Changelog.md
187
48
  - MIT-LICENSE
188
49
  - Readme.md
189
50
  - lib/active_record_host_pool.rb
@@ -191,13 +52,7 @@ files:
191
52
  - lib/active_record_host_pool/connection_adapter_mixin.rb
192
53
  - lib/active_record_host_pool/connection_proxy.rb
193
54
  - lib/active_record_host_pool/pool_proxy.rb
194
- - lib/active_record_host_pool/pool_proxy_6_1.rb
195
- - lib/active_record_host_pool/pool_proxy_legacy.rb
196
55
  - lib/active_record_host_pool/version.rb
197
- - test/database.yml
198
- - test/helper.rb
199
- - test/schema.rb
200
- - test/test_arhp.rb
201
56
  homepage: https://github.com/zendesk/active_record_host_pool
202
57
  licenses:
203
58
  - MIT
@@ -210,20 +65,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
210
65
  requirements:
211
66
  - - ">="
212
67
  - !ruby/object:Gem::Version
213
- version: 2.6.0
68
+ version: 2.7.0
214
69
  required_rubygems_version: !ruby/object:Gem::Requirement
215
70
  requirements:
216
- - - ">="
71
+ - - ">"
217
72
  - !ruby/object:Gem::Version
218
- version: '0'
73
+ version: 1.3.1
219
74
  requirements: []
220
75
  rubygems_version: 3.0.3.1
221
76
  signing_key:
222
77
  specification_version: 4
223
78
  summary: Allow ActiveRecord to share a connection to multiple databases on the same
224
79
  host
225
- test_files:
226
- - test/database.yml
227
- - test/helper.rb
228
- - test/schema.rb
229
- - test/test_arhp.rb
80
+ test_files: []
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'delegate'
4
- require 'active_record'
5
- require 'active_record_host_pool/connection_adapter_mixin'
6
-
7
- # this module sits in between ConnectionHandler and a bunch of different ConnectionPools (one per host).
8
- # when a connection is requested, it goes like:
9
- # ActiveRecordClass -> ConnectionHandler#connection
10
- # ConnectionHandler#connection -> (find or create PoolProxy)
11
- # PoolProxy -> shared list of Pools
12
- # Pool actually gives back a connection, then PoolProxy turns this
13
- # into a ConnectionProxy that can inform (on execute) which db we should be on.
14
-
15
- module ActiveRecordHostPool
16
- # Sits between ConnectionHandler and a bunch of different ConnectionPools (one per host).
17
- class PoolProxy < Delegator
18
- def initialize(pool_config)
19
- super(pool_config)
20
- @pool_config = pool_config
21
- @config = pool_config.db_config.configuration_hash
22
- end
23
-
24
- def __getobj__
25
- _connection_pool
26
- end
27
-
28
- def __setobj__(pool_config)
29
- @pool_config = pool_config
30
- @config = pool_config.db_config.configuration_hash
31
- @_pool_key = nil
32
- end
33
-
34
- attr_reader :pool_config
35
-
36
- def connection(*args)
37
- real_connection = _unproxied_connection(*args)
38
- _connection_proxy_for(real_connection, @config[:database])
39
- rescue Mysql2::Error, ActiveRecord::NoDatabaseError
40
- _connection_pools.delete(_pool_key)
41
- Kernel.raise
42
- end
43
-
44
- def _unproxied_connection(*args)
45
- _connection_pool.connection(*args)
46
- end
47
-
48
- # by the time we are patched into ActiveRecord, the current thread has already established
49
- # a connection. thus we need to patch both connection and checkout/checkin
50
- def checkout(*args, &block)
51
- cx = _connection_pool.checkout(*args, &block)
52
- _connection_proxy_for(cx, @config[:database])
53
- end
54
-
55
- def checkin(cx)
56
- cx = cx.unproxied
57
- _connection_pool.checkin(cx)
58
- end
59
-
60
- def with_connection
61
- cx = checkout
62
- yield cx
63
- ensure
64
- checkin cx
65
- end
66
-
67
- def disconnect!
68
- p = _connection_pool(false)
69
- return unless p
70
-
71
- p.disconnect!
72
- p.automatic_reconnect = true if p.respond_to?(:automatic_reconnect=)
73
- _clear_connection_proxy_cache
74
- end
75
-
76
- def automatic_reconnect=(value)
77
- p = _connection_pool(false)
78
- return unless p
79
-
80
- p.automatic_reconnect = value if p.respond_to?(:automatic_reconnect=)
81
- end
82
-
83
- def clear_reloadable_connections!
84
- _connection_pool.clear_reloadable_connections!
85
- _clear_connection_proxy_cache
86
- end
87
-
88
- def release_connection(*args)
89
- p = _connection_pool(false)
90
- return unless p
91
-
92
- p.release_connection(*args)
93
- end
94
-
95
- def flush!
96
- p = _connection_pool(false)
97
- return unless p
98
-
99
- p.flush!
100
- end
101
-
102
- def discard!
103
- p = _connection_pool(false)
104
- return unless p
105
-
106
- p.discard!
107
-
108
- # All connections in the pool (even if they're currently
109
- # leased!) have just been discarded, along with the pool itself.
110
- # Any further interaction with the pool (except #pool_config and #schema_cache)
111
- # is undefined.
112
- # Remove the connection for the given key so a new one can be created in its place
113
- _connection_pools.delete(_pool_key)
114
- end
115
-
116
- private
117
-
118
- def _connection_pools
119
- @@_connection_pools ||= {}
120
- end
121
-
122
- def _pool_key
123
- @_pool_key ||= "#{@config[:host]}/#{@config[:port]}/#{@config[:socket]}/" \
124
- "#{@config[:username]}/#{replica_configuration? && 'replica'}"
125
- end
126
-
127
- def _connection_pool(auto_create = true)
128
- pool = _connection_pools[_pool_key]
129
- if pool.nil? && auto_create
130
- pool = _connection_pools[_pool_key] = ActiveRecord::ConnectionAdapters::ConnectionPool.new(@pool_config)
131
- end
132
- pool
133
- end
134
-
135
- def _connection_proxy_for(connection, database)
136
- @connection_proxy_cache ||= {}
137
- key = [connection, database]
138
-
139
- @connection_proxy_cache[key] ||= begin
140
- cx = ActiveRecordHostPool::ConnectionProxy.new(connection, database)
141
- cx.execute('select 1')
142
- cx
143
- end
144
- end
145
-
146
- def _clear_connection_proxy_cache
147
- @connection_proxy_cache = {}
148
- end
149
-
150
- def replica_configuration?
151
- @config[:replica] || @config[:slave]
152
- end
153
- end
154
- end
@@ -1,156 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # For versions of Rails < 6.1
4
-
5
- require 'delegate'
6
- require 'active_record'
7
- require 'active_record_host_pool/connection_adapter_mixin'
8
-
9
- # this module sits in between ConnectionHandler and a bunch of different ConnectionPools (one per host).
10
- # when a connection is requested, it goes like:
11
- # ActiveRecordClass -> ConnectionHandler#connection
12
- # ConnectionHandler#connection -> (find or create PoolProxy)
13
- # PoolProxy -> shared list of Pools
14
- # Pool actually gives back a connection, then PoolProxy turns this
15
- # into a ConnectionProxy that can inform (on execute) which db we should be on.
16
-
17
- module ActiveRecordHostPool
18
- # Sits between ConnectionHandler and a bunch of different ConnectionPools (one per host).
19
- class PoolProxy < Delegator
20
- def initialize(spec)
21
- super(spec)
22
- @spec = spec
23
- @config = spec.config
24
- end
25
-
26
- def __getobj__
27
- _connection_pool
28
- end
29
-
30
- def __setobj__(spec)
31
- @spec = spec
32
- @config = spec.config
33
- @_pool_key = nil
34
- end
35
-
36
- attr_reader :spec
37
-
38
- def connection(*args)
39
- real_connection = _unproxied_connection(*args)
40
- _connection_proxy_for(real_connection, @config[:database])
41
- rescue Mysql2::Error, ActiveRecord::NoDatabaseError
42
- _connection_pools.delete(_pool_key)
43
- Kernel.raise
44
- end
45
-
46
- def _unproxied_connection(*args)
47
- _connection_pool.connection(*args)
48
- end
49
-
50
- # by the time we are patched into ActiveRecord, the current thread has already established
51
- # a connection. thus we need to patch both connection and checkout/checkin
52
- def checkout(*args, &block)
53
- cx = _connection_pool.checkout(*args, &block)
54
- _connection_proxy_for(cx, @config[:database])
55
- end
56
-
57
- def checkin(cx)
58
- cx = cx.unproxied
59
- _connection_pool.checkin(cx)
60
- end
61
-
62
- def with_connection
63
- cx = checkout
64
- yield cx
65
- ensure
66
- checkin cx
67
- end
68
-
69
- def disconnect!
70
- p = _connection_pool(false)
71
- return unless p
72
-
73
- p.disconnect!
74
- p.automatic_reconnect = true if p.respond_to?(:automatic_reconnect=)
75
- _clear_connection_proxy_cache
76
- end
77
-
78
- def automatic_reconnect=(value)
79
- p = _connection_pool(false)
80
- return unless p
81
-
82
- p.automatic_reconnect = value if p.respond_to?(:automatic_reconnect=)
83
- end
84
-
85
- def clear_reloadable_connections!
86
- _connection_pool.clear_reloadable_connections!
87
- _clear_connection_proxy_cache
88
- end
89
-
90
- def release_connection(*args)
91
- p = _connection_pool(false)
92
- return unless p
93
-
94
- p.release_connection(*args)
95
- end
96
-
97
- def flush!
98
- p = _connection_pool(false)
99
- return unless p
100
-
101
- p.flush!
102
- end
103
-
104
- def discard!
105
- p = _connection_pool(false)
106
- return unless p
107
-
108
- p.discard!
109
-
110
- # All connections in the pool (even if they're currently
111
- # leased!) have just been discarded, along with the pool itself.
112
- # Any further interaction with the pool (except #spec and #schema_cache)
113
- # is undefined.
114
- # Remove the connection for the given key so a new one can be created in its place
115
- _connection_pools.delete(_pool_key)
116
- end
117
-
118
- private
119
-
120
- def _connection_pools
121
- @@_connection_pools ||= {}
122
- end
123
-
124
- def _pool_key
125
- @_pool_key ||= "#{@config[:host]}/#{@config[:port]}/#{@config[:socket]}/" \
126
- "#{@config[:username]}/#{replica_configuration? && 'replica'}"
127
- end
128
-
129
- def _connection_pool(auto_create = true)
130
- pool = _connection_pools[_pool_key]
131
- if pool.nil? && auto_create
132
- pool = _connection_pools[_pool_key] = ActiveRecord::ConnectionAdapters::ConnectionPool.new(@spec)
133
- end
134
- pool
135
- end
136
-
137
- def _connection_proxy_for(connection, database)
138
- @connection_proxy_cache ||= {}
139
- key = [connection, database]
140
-
141
- @connection_proxy_cache[key] ||= begin
142
- cx = ActiveRecordHostPool::ConnectionProxy.new(connection, database)
143
- cx.execute('select 1')
144
- cx
145
- end
146
- end
147
-
148
- def _clear_connection_proxy_cache
149
- @connection_proxy_cache = {}
150
- end
151
-
152
- def replica_configuration?
153
- @config[:replica] || @config[:slave]
154
- end
155
- end
156
- end
data/test/database.yml DELETED
@@ -1,108 +0,0 @@
1
- <% mysql = URI(ENV['MYSQL_URL'] || 'mysql://root@127.0.0.1:3306') %>
2
- # ARHP creates separate connection pools based on the pool key.
3
- # The pool key is defined as:
4
- # host / port / socket / username / replica
5
- #
6
- # Therefore two databases with identical host, port, socket, username, and replica status will share a connection pool.
7
- # If any part (host, port, etc.) of the pool key differ, two databases will _not_ share a connection pool.
8
- #
9
- # Below, "test_pool_1..." and "test_pool_2..." have identical host, username, socket, and replica status but the port information differs.
10
- # Here the yml configurations are reformatted as a table to give a visual example:
11
- #
12
- # |----------+----------------+----------------|
13
- # | | test_pool_1 | test_pool_2 |
14
- # |----------+----------------+----------------+
15
- # | host | 127.0.0.1 | 127.0.0.1 |
16
- # | port | | 3306 |
17
- # | socket | | |
18
- # | username | root | root |
19
- # | replica | false | false |
20
- # |----------+----------------+----------------|
21
- #
22
- # Note: The configuration items must be explicitly defined or will be blank in the pool key.
23
- # Configurations with matching _implicit_ items but differing _explicit_ items will create separate pools.
24
- # e.g. "test_pool_1" will default to port 3306 but because it is not explicitly defined it will not share a pool with test_pool_2
25
- #
26
- # ARHP will therefore create the following pool keys:
27
- # test_pool_1 => 127.0.0.1///root/false
28
- # test_pool_2 => 127.0.0.1/3306//root/false
29
-
30
- test_pool_1_db_a:
31
- adapter: mysql2
32
- encoding: utf8
33
- database: arhp_test_db_a
34
- username: <%= mysql.user %>
35
- password: <%= mysql.password %>
36
- host: <%= mysql.host %>
37
- reconnect: true
38
-
39
- # Mimic configurations as read by active_record_shards/ar_flexmaster
40
- test_pool_1_db_a_replica:
41
- adapter: mysql2
42
- encoding: utf8
43
- database: arhp_test_db_a_replica
44
- username: <%= mysql.user %>
45
- password: <%= mysql.password %>
46
- host: <%= mysql.host %>
47
- reconnect: true
48
- slave: true
49
-
50
- test_pool_1_db_b:
51
- adapter: mysql2
52
- encoding: utf8
53
- database: arhp_test_db_b
54
- username: <%= mysql.user %>
55
- password: <%= mysql.password %>
56
- host: <%= mysql.host %>
57
- reconnect: true
58
-
59
- test_pool_1_db_not_there:
60
- adapter: mysql2
61
- encoding: utf8
62
- database: arhp_test_db_not_there
63
- username: <%= mysql.user %>
64
- password: <%= mysql.password %>
65
- host: <%= mysql.host %>
66
- reconnect: true
67
-
68
- test_pool_2_db_d:
69
- adapter: mysql2
70
- encoding: utf8
71
- database: arhp_test_db_d
72
- username: <%= mysql.user %>
73
- password: <%= mysql.password %>
74
- host: <%= mysql.host %>
75
- port: <%= mysql.port %>
76
- reconnect: true
77
-
78
- test_pool_2_db_e:
79
- adapter: mysql2
80
- encoding: utf8
81
- database: arhp_test_db_e
82
- username: <%= mysql.user %>
83
- password: <%= mysql.password %>
84
- host: <%= mysql.host %>
85
- port: <%= mysql.port %>
86
- reconnect: true
87
-
88
- test_pool_3_db_e:
89
- adapter: mysql2
90
- encoding: utf8
91
- database: arhp_test_db_e
92
- username: john-doe
93
- password:
94
- host: <%= mysql.host %>
95
- port: <%= mysql.port %>
96
- reconnect: true
97
-
98
- # test_pool_1_db_c needs to be the last database defined in the file
99
- # otherwise the test_models_with_matching_hosts_and_non_matching_databases_issue_exists_without_arhp_patch
100
- # test fails
101
- test_pool_1_db_c:
102
- adapter: mysql2
103
- encoding: utf8
104
- database: arhp_test_db_c
105
- username: <%= mysql.user %>
106
- password: <%= mysql.password %>
107
- host: <%= mysql.host %>
108
- reconnect: true