active_record_shards 5.3.3 → 5.4.1

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: e71e05125d6c15ad696e8243cb09234c09d29e1c381b47adeee2a81b0b79e188
4
- data.tar.gz: f06e143aabfc0e14d3058e03acc367e54d0219bcbf9355df57ee33e174393dbf
3
+ metadata.gz: 0dad44339b071fbea35fbf5298c8a1ded5f78ecabb97a4e48da974c1191b94cd
4
+ data.tar.gz: ddfe5d8a76e1007ea68a85d7cd0bad6b8c0334752136a8a72574d2d776fb1de5
5
5
  SHA512:
6
- metadata.gz: 60629cde5e087c941d9ce3d753a57c5d73f37cbd78d9e7b0f6f1d921834c25267371a0b2e957a92112eac3f295a837a2a41681cda63dc3a6bfd981811dfbcd91
7
- data.tar.gz: 2c4e012130eead2088089cefb2204508141b3bd5056f733ccd26029fa053ae78b10b077750b64f5b364731b752842210086e368f813b3b1b333e9cdf2fecefb9
6
+ metadata.gz: 751f5301b1a0fac6834ed5571b992e71ae0e6e18c4ac9cd94acd64c56650fe08961d50350bed19b0db23d9bdac98d18b8ba7cf46f958278dcc882418b3408257
7
+ data.tar.gz: 4866f71bd64c603cf997638607fd93100c264c0ac4b910d7ee5e20237f53cd06756093f2cf27712453d536e52fc9898b688466fd7c080d893db5494480fcf3e8
@@ -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'
@@ -118,11 +123,11 @@ module ActiveRecordShards
118
123
  end
119
124
 
120
125
  def disallow_replica=(value)
121
- Thread.current[:__active_record_shards__disallow_replica_by_thread] = value
126
+ Thread.current._active_record_shards_disallow_replica_by_thread = value
122
127
  end
123
128
 
124
129
  def disallow_replica
125
- Thread.current[:__active_record_shards__disallow_replica_by_thread] ||= 0
130
+ Thread.current._active_record_shards_disallow_replica_by_thread ||= 0
126
131
  end
127
132
 
128
133
  def supports_sharding?
@@ -134,7 +139,7 @@ module ActiveRecordShards
134
139
  end
135
140
 
136
141
  def current_shard_selection
137
- Thread.current[:shard_selection] ||= ShardSelection.new
142
+ Thread.current._active_record_shards_shard_selection ||= ShardSelection.new
138
143
  end
139
144
 
140
145
  def current_shard_id
@@ -177,6 +182,7 @@ module ActiveRecordShards
177
182
 
178
183
  def switch_connection(options)
179
184
  ensure_legacy_connection_handling if ActiveRecord.version >= Gem::Version.new('6.1')
185
+ ensure_thread_isolation_level if ActiveRecord.version >= Gem::Version.new('7.0')
180
186
 
181
187
  if options.any?
182
188
  if options.key?(:replica)
@@ -199,6 +205,12 @@ module ActiveRecordShards
199
205
  end
200
206
  end
201
207
 
208
+ def ensure_thread_isolation_level
209
+ unless ActiveSupport::IsolatedExecutionState.isolation_level == :thread
210
+ raise IsolationLevelError, "ActiveRecordShards is _only_ compatible when ActiveSupport::IsolatedExecutionState's isolation_level is set to :thread"
211
+ end
212
+ end
213
+
202
214
  def legacy_connection_handling_owner
203
215
  @legacy_connection_handling_owner ||=
204
216
  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[:_active_record_shards_in_migration]
93
- return yield if Thread.current[:_active_record_shards_in_tx]
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[:_active_record_shards_in_migration]
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[:_active_record_shards_in_migration]
125
- return super if Thread.current[:_active_record_shards_in_tx]
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[:_active_record_shards_in_migration]
217
- return super if Thread.current[:_active_record_shards_in_tx]
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[:_active_record_shards_in_migration]
230
- Thread.current[:_active_record_shards_in_migration] = true
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[:_active_record_shards_in_migration] = old_val
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.3.3
4
+ version: 5.4.1
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-04-28 00:00:00.000000000 Z
16
+ date: 2023-08-04 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