active_record_shards 5.3.3 → 5.5.0
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9e4c9f26a03dde94772c0888e49e3af56d68ffc4576fff3123a8dd50a73cce7
|
4
|
+
data.tar.gz: d4ea926bf565928ac2873e02b08b481cf731d3d62483482de450137886505d4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 699945070cfc1dde026841e71489a1e3d9e743cb4b49ff8e9a5f0849c1f50f3a55dab9833614377b8a998b8b181755c0efd2d090d3acd1d0f180c7dffee69c03
|
7
|
+
data.tar.gz: 6c1d7c1eb206352102e9d13b2f045e4e9cbd7262f8fe6baab0218ad9273e0ecab21442900730d8b1b07754b65e15d07f7341415f495930265ff892e455eb73c7
|
@@ -5,6 +5,11 @@ require 'active_record_shards/shard_support'
|
|
5
5
|
module ActiveRecordShards
|
6
6
|
module ConnectionSwitcher
|
7
7
|
class LegacyConnectionHandlingError < StandardError; end
|
8
|
+
class IsolationLevelError < StandardError; end
|
9
|
+
|
10
|
+
Thread.attr_accessor :_active_record_shards_disallow_replica_by_thread,
|
11
|
+
:_active_record_shards_in_migration,
|
12
|
+
:_active_record_shards_shard_selection
|
8
13
|
|
9
14
|
case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
|
10
15
|
when '6.1', '7.0'
|
@@ -19,6 +24,9 @@ module ActiveRecordShards
|
|
19
24
|
|
20
25
|
base.singleton_class.send(:alias_method, :table_exists_without_default_shard?, :table_exists?)
|
21
26
|
base.singleton_class.send(:alias_method, :table_exists?, :table_exists_with_default_shard?)
|
27
|
+
|
28
|
+
base.singleton_class.send(:alias_method, :reset_primary_key_without_default_shard, :reset_primary_key)
|
29
|
+
base.singleton_class.send(:alias_method, :reset_primary_key, :reset_primary_key_with_default_shard)
|
22
30
|
end
|
23
31
|
|
24
32
|
def on_primary_db(&block)
|
@@ -118,11 +126,11 @@ module ActiveRecordShards
|
|
118
126
|
end
|
119
127
|
|
120
128
|
def disallow_replica=(value)
|
121
|
-
Thread.current
|
129
|
+
Thread.current._active_record_shards_disallow_replica_by_thread = value
|
122
130
|
end
|
123
131
|
|
124
132
|
def disallow_replica
|
125
|
-
Thread.current
|
133
|
+
Thread.current._active_record_shards_disallow_replica_by_thread ||= 0
|
126
134
|
end
|
127
135
|
|
128
136
|
def supports_sharding?
|
@@ -134,7 +142,7 @@ module ActiveRecordShards
|
|
134
142
|
end
|
135
143
|
|
136
144
|
def current_shard_selection
|
137
|
-
Thread.current
|
145
|
+
Thread.current._active_record_shards_shard_selection ||= ShardSelection.new
|
138
146
|
end
|
139
147
|
|
140
148
|
def current_shard_id
|
@@ -145,6 +153,10 @@ module ActiveRecordShards
|
|
145
153
|
config_for_env[SHARD_NAMES_CONFIG_KEY] || []
|
146
154
|
end
|
147
155
|
|
156
|
+
def reset_primary_key_with_default_shard
|
157
|
+
with_default_shard { reset_primary_key_without_default_shard }
|
158
|
+
end
|
159
|
+
|
148
160
|
private
|
149
161
|
|
150
162
|
def config_for_env
|
@@ -177,6 +189,7 @@ module ActiveRecordShards
|
|
177
189
|
|
178
190
|
def switch_connection(options)
|
179
191
|
ensure_legacy_connection_handling if ActiveRecord.version >= Gem::Version.new('6.1')
|
192
|
+
ensure_thread_isolation_level if ActiveRecord.version >= Gem::Version.new('7.0')
|
180
193
|
|
181
194
|
if options.any?
|
182
195
|
if options.key?(:replica)
|
@@ -199,6 +212,12 @@ module ActiveRecordShards
|
|
199
212
|
end
|
200
213
|
end
|
201
214
|
|
215
|
+
def ensure_thread_isolation_level
|
216
|
+
unless ActiveSupport::IsolatedExecutionState.isolation_level == :thread
|
217
|
+
raise IsolationLevelError, "ActiveRecordShards is _only_ compatible when ActiveSupport::IsolatedExecutionState's isolation_level is set to :thread"
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
202
221
|
def legacy_connection_handling_owner
|
203
222
|
@legacy_connection_handling_owner ||=
|
204
223
|
case "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
|
@@ -29,21 +29,6 @@ module ActiveRecordShards
|
|
29
29
|
RUBY
|
30
30
|
end
|
31
31
|
|
32
|
-
def transaction_with_replica_off(*args, &block)
|
33
|
-
if on_replica_by_default?
|
34
|
-
begin
|
35
|
-
old_val = Thread.current[:_active_record_shards_in_tx]
|
36
|
-
Thread.current[:_active_record_shards_in_tx] = true
|
37
|
-
transaction_without_replica_off(*args, &block)
|
38
|
-
ensure
|
39
|
-
Thread.current[:_active_record_shards_in_tx] = old_val
|
40
|
-
end
|
41
|
-
else
|
42
|
-
transaction_without_replica_off(*args, &block)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
ruby2_keywords(:transaction_with_replica_off) if respond_to?(:ruby2_keywords, true)
|
46
|
-
|
47
32
|
module InstanceMethods
|
48
33
|
def on_replica_unless_tx
|
49
34
|
self.class.on_replica_unless_tx { yield }
|
@@ -80,17 +65,12 @@ module ActiveRecordShards
|
|
80
65
|
|
81
66
|
base.class_eval do
|
82
67
|
include InstanceMethods
|
83
|
-
|
84
|
-
class << self
|
85
|
-
alias_method :transaction_without_replica_off, :transaction
|
86
|
-
alias_method :transaction, :transaction_with_replica_off
|
87
|
-
end
|
88
68
|
end
|
89
69
|
end
|
90
70
|
|
91
71
|
def on_replica_unless_tx(&block)
|
92
|
-
return yield if Thread.current
|
93
|
-
return yield if
|
72
|
+
return yield if Thread.current._active_record_shards_in_migration
|
73
|
+
return yield if _in_transaction?
|
94
74
|
|
95
75
|
if on_replica_by_default?
|
96
76
|
on_replica(&block)
|
@@ -99,8 +79,12 @@ module ActiveRecordShards
|
|
99
79
|
end
|
100
80
|
end
|
101
81
|
|
82
|
+
def _in_transaction?
|
83
|
+
connected? && connection.transaction_open?
|
84
|
+
end
|
85
|
+
|
102
86
|
def force_on_replica(&block)
|
103
|
-
return yield if Thread.current
|
87
|
+
return yield if Thread.current._active_record_shards_in_migration
|
104
88
|
|
105
89
|
on_cx_switch_block(:replica, construct_ro_scope: false, force: true, &block)
|
106
90
|
end
|
@@ -121,8 +105,8 @@ module ActiveRecordShards
|
|
121
105
|
|
122
106
|
module Rails52RelationPatches
|
123
107
|
def connection
|
124
|
-
return super if Thread.current
|
125
|
-
return super if
|
108
|
+
return super if Thread.current._active_record_shards_in_migration
|
109
|
+
return super if _in_transaction?
|
126
110
|
|
127
111
|
if @klass.on_replica_by_default?
|
128
112
|
@klass.on_replica.connection
|
@@ -213,8 +197,8 @@ module ActiveRecordShards
|
|
213
197
|
|
214
198
|
module TypeCasterConnectionConnectionPatch
|
215
199
|
def connection
|
216
|
-
return super if Thread.current
|
217
|
-
return super if
|
200
|
+
return super if Thread.current._active_record_shards_in_migration
|
201
|
+
return super if ActiveRecord::Base._in_transaction?
|
218
202
|
|
219
203
|
if @klass.on_replica_by_default?
|
220
204
|
@klass.on_replica.connection
|
@@ -226,11 +210,11 @@ module ActiveRecordShards
|
|
226
210
|
|
227
211
|
module SchemaDefinePatch
|
228
212
|
def define(info, &block)
|
229
|
-
old_val = Thread.current
|
230
|
-
Thread.current
|
213
|
+
old_val = Thread.current._active_record_shards_in_migration
|
214
|
+
Thread.current._active_record_shards_in_migration = true
|
231
215
|
super
|
232
216
|
ensure
|
233
|
-
Thread.current
|
217
|
+
Thread.current._active_record_shards_in_migration = old_val
|
234
218
|
end
|
235
219
|
end
|
236
220
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_shards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Quorning
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2023-
|
16
|
+
date: 2023-08-26 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: activerecord
|
@@ -83,20 +83,6 @@ dependencies:
|
|
83
83
|
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: 5.10.0
|
86
|
-
- !ruby/object:Gem::Dependency
|
87
|
-
name: minitest-rg
|
88
|
-
requirement: !ruby/object:Gem::Requirement
|
89
|
-
requirements:
|
90
|
-
- - ">="
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: '0'
|
93
|
-
type: :development
|
94
|
-
prerelease: false
|
95
|
-
version_requirements: !ruby/object:Gem::Requirement
|
96
|
-
requirements:
|
97
|
-
- - ">="
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
version: '0'
|
100
86
|
- !ruby/object:Gem::Dependency
|
101
87
|
name: mysql2
|
102
88
|
requirement: !ruby/object:Gem::Requirement
|