active_record_host_pool 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_record_host_pool/clear_query_cache_patch.rb +35 -31
- data/lib/active_record_host_pool/connection_adapter_mixin.rb +6 -3
- data/lib/active_record_host_pool/connection_proxy.rb +2 -0
- data/lib/active_record_host_pool/pool_proxy_6_1.rb +9 -4
- data/lib/active_record_host_pool/pool_proxy_legacy.rb +1 -1
- data/lib/active_record_host_pool/version.rb +1 -1
- data/test/helper.rb +1 -0
- metadata +3 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cef6cffe1f0c00bea6d588f48093d20abb29f87e9cdab6d84eba31f9b918a44e
|
4
|
+
data.tar.gz: 9e443c3874c4b24b2955245dfa12183521386696937bc27d21ce9037b9e90ee5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cadfa3a2d2c582a71a3538692edd4fbde67e2266f98d6fdcc1133d40bd0db33969eca2ef1a0ef8ccb22b20a01fb263d76a7cfa88a877b3ac46b7d19d1852346
|
7
|
+
data.tar.gz: 1ddd95edd00b9bd496cb861db3ecbc7be607c0174ca59e68ca4eebf2546137dff24881d4a6d3d4cc940fabcc1d5a1c9e7477df14c744f9e00814d7bcf5b5d29a
|
@@ -1,42 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ensure
|
26
|
-
# restore in case clearing the cache changed the database
|
27
|
-
connection_pool._unproxied_connection._host_pool_current_database = host_pool_current_database_was
|
3
|
+
# ActiveRecord 6.0 introduced multiple database support. With that, an update
|
4
|
+
# has been made in https://github.com/rails/rails/pull/35089 to ensure that
|
5
|
+
# all query caches are cleared across connection handlers and pools. If you
|
6
|
+
# write on one connection, the other connection will have the update that
|
7
|
+
# occurred.
|
8
|
+
#
|
9
|
+
# This broke ARHP which implements its own pool, allowing you to access
|
10
|
+
# multiple databases with the same connection (e.g. 1 connection for 100
|
11
|
+
# shards on the same server).
|
12
|
+
#
|
13
|
+
# This patch maintains the reference to the database during the cache clearing
|
14
|
+
# to ensure that the database doesn't get swapped out mid-way into an
|
15
|
+
# operation.
|
16
|
+
#
|
17
|
+
# This is a private Rails API and may change in future releases as they're
|
18
|
+
# actively working on sharding in Rails 6 and above.
|
19
|
+
module ActiveRecordHostPool
|
20
|
+
# For Rails 6.1 & 7.0.
|
21
|
+
module ClearOnHandlerPatch
|
22
|
+
def clear_on_handler(handler)
|
23
|
+
handler.all_connection_pools.each do |pool|
|
24
|
+
pool._unproxied_connection.clear_query_cache if pool.active_connection?
|
28
25
|
end
|
26
|
+
end
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
# For Rails 6.0.
|
30
|
+
module ClearQueryCachePatch
|
31
|
+
def clear_query_caches_for_current_thread
|
32
|
+
ActiveRecord::Base.connection_handlers.each_value do |handler|
|
33
|
+
handler.connection_pool_list.each do |pool|
|
33
34
|
pool._unproxied_connection.clear_query_cache if pool.active_connection?
|
34
|
-
ensure
|
35
|
-
pool._unproxied_connection._host_pool_current_database = db_was
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
39
38
|
end
|
39
|
+
end
|
40
40
|
|
41
|
-
|
41
|
+
case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
|
42
|
+
when '6.1', '7.0'
|
43
|
+
ActiveRecord::Base.singleton_class.prepend(ActiveRecordHostPool::ClearOnHandlerPatch)
|
44
|
+
when '6.0'
|
45
|
+
ActiveRecord::Base.singleton_class.prepend(ActiveRecordHostPool::ClearQueryCachePatch)
|
42
46
|
end
|
@@ -33,11 +33,14 @@ module ActiveRecordHostPool
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.ruby2_keywords(*); end unless respond_to?(:ruby2_keywords, true)
|
36
|
-
ruby2_keywords
|
36
|
+
# This one really does need ruby2_keywords; in Rails 6.0 the method does not take
|
37
|
+
# any keyword arguments, but in Rails 7.0 it does. So, we don't know whether or not
|
38
|
+
# what we're delegating to takes kwargs, so ruby2_keywords is needed.
|
39
|
+
ruby2_keywords def execute_with_switching(*args)
|
37
40
|
if _host_pool_current_database && !_no_switch
|
38
41
|
_switch_connection
|
39
42
|
end
|
40
|
-
execute_without_switching(*args
|
43
|
+
execute_without_switching(*args)
|
41
44
|
end
|
42
45
|
|
43
46
|
def drop_database_with_no_switching(*args)
|
@@ -71,7 +74,7 @@ module ActiveRecordHostPool
|
|
71
74
|
@connection.object_id != @_cached_connection_object_id
|
72
75
|
)
|
73
76
|
log("select_db #{_host_pool_current_database}", "SQL") do
|
74
|
-
clear_cache!
|
77
|
+
clear_cache!
|
75
78
|
raw_connection.select_db(_host_pool_current_database)
|
76
79
|
end
|
77
80
|
@_cached_current_database = _host_pool_current_database
|
@@ -50,11 +50,13 @@ module ActiveRecordHostPool
|
|
50
50
|
__getobj__.send(symbol, *args, &blk)
|
51
51
|
end
|
52
52
|
end
|
53
|
+
ruby2_keywords :send if respond_to?(:ruby2_keywords, true)
|
53
54
|
|
54
55
|
private
|
55
56
|
|
56
57
|
def select(*args)
|
57
58
|
@cx.__send__(:select, *args)
|
58
59
|
end
|
60
|
+
ruby2_keywords :select if respond_to?(:ruby2_keywords, true)
|
59
61
|
end
|
60
62
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'delegate'
|
4
4
|
require 'active_record'
|
5
5
|
require 'active_record_host_pool/connection_adapter_mixin'
|
6
|
+
require 'mutex_m'
|
6
7
|
|
7
8
|
# this module sits in between ConnectionHandler and a bunch of different ConnectionPools (one per host).
|
8
9
|
# when a connection is requested, it goes like:
|
@@ -15,6 +16,8 @@ require 'active_record_host_pool/connection_adapter_mixin'
|
|
15
16
|
module ActiveRecordHostPool
|
16
17
|
# Sits between ConnectionHandler and a bunch of different ConnectionPools (one per host).
|
17
18
|
class PoolProxy < Delegator
|
19
|
+
include Mutex_m
|
20
|
+
|
18
21
|
def initialize(pool_config)
|
19
22
|
super(pool_config)
|
20
23
|
@pool_config = pool_config
|
@@ -68,16 +71,18 @@ module ActiveRecordHostPool
|
|
68
71
|
p = _connection_pool(false)
|
69
72
|
return unless p
|
70
73
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
+
synchronize do
|
75
|
+
p.disconnect!
|
76
|
+
p.automatic_reconnect = true
|
77
|
+
_clear_connection_proxy_cache
|
78
|
+
end
|
74
79
|
end
|
75
80
|
|
76
81
|
def automatic_reconnect=(value)
|
77
82
|
p = _connection_pool(false)
|
78
83
|
return unless p
|
79
84
|
|
80
|
-
p.automatic_reconnect = value
|
85
|
+
p.automatic_reconnect = value
|
81
86
|
end
|
82
87
|
|
83
88
|
def clear_reloadable_connections!
|
data/test/helper.rb
CHANGED
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
|
+
version: 1.2.5
|
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-
|
14
|
+
date: 2023-07-14 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activerecord
|
@@ -47,90 +47,6 @@ dependencies:
|
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
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-mock_expectations
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
requirements:
|
82
|
-
- - "~>"
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: 1.1.3
|
85
|
-
type: :development
|
86
|
-
prerelease: false
|
87
|
-
version_requirements: !ruby/object:Gem::Requirement
|
88
|
-
requirements:
|
89
|
-
- - "~>"
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: 1.1.3
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: phenix
|
94
|
-
requirement: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - ">="
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: 1.0.1
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: 1.0.1
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: rake
|
108
|
-
requirement: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: 12.0.0
|
113
|
-
type: :development
|
114
|
-
prerelease: false
|
115
|
-
version_requirements: !ruby/object:Gem::Requirement
|
116
|
-
requirements:
|
117
|
-
- - ">="
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
version: 12.0.0
|
120
|
-
- !ruby/object:Gem::Dependency
|
121
|
-
name: rubocop
|
122
|
-
requirement: !ruby/object:Gem::Requirement
|
123
|
-
requirements:
|
124
|
-
- - "~>"
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: 0.80.0
|
127
|
-
type: :development
|
128
|
-
prerelease: false
|
129
|
-
version_requirements: !ruby/object:Gem::Requirement
|
130
|
-
requirements:
|
131
|
-
- - "~>"
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 0.80.0
|
134
50
|
description: ''
|
135
51
|
email:
|
136
52
|
- bquorning@zendesk.com
|
@@ -168,7 +84,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
84
|
requirements:
|
169
85
|
- - ">="
|
170
86
|
- !ruby/object:Gem::Version
|
171
|
-
version: 2.
|
87
|
+
version: 2.7.0
|
172
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
89
|
requirements:
|
174
90
|
- - ">="
|