switchman 4.2.0 → 4.2.2
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/switchman/active_record/abstract_adapter.rb +9 -1
- data/lib/switchman/active_record/calculations.rb +1 -1
- data/lib/switchman/active_record/relation.rb +8 -2
- data/lib/switchman/active_record/test_fixtures.rb +2 -2
- data/lib/switchman/shard.rb +1 -1
- data/lib/switchman/sharded_instrumenter.rb +7 -1
- data/lib/switchman/version.rb +1 -1
- metadata +2 -156
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 631d6e59b4e4f67ba719a92371f020bc3b39ca8fd8501344b469194f7b6e6d66
|
4
|
+
data.tar.gz: 888809fc92e8489f578c72fe685d811108f8f268cc0309f559837f9f36c4139a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eaeb2a4153632f20cba6ad4fbe4810b64c946a5db7596a22ab9e17303ec5a2d36add1e5114e7ca5af94c53e7b9f25d10cec2631a5f8b586d5a1bff670546a7a
|
7
|
+
data.tar.gz: 3ce30e552e0293f3541046a23a0aaf732001dc910b2ab5e8dd928a5c5edfdc0c504ca23b432807895c0a42ed1cb2e4a95029aa465d6f5dae0052e774d18df6ac
|
@@ -19,10 +19,18 @@ module Switchman
|
|
19
19
|
|
20
20
|
def initialize(*args)
|
21
21
|
super
|
22
|
-
|
22
|
+
|
23
|
+
@instrumenter = Switchman::ShardedInstrumenter.new(@instrumenter, self) if ::Rails.version < "8.0"
|
24
|
+
|
23
25
|
@last_query_at = Time.now
|
24
26
|
end
|
25
27
|
|
28
|
+
if ::Rails.version >= "8.0"
|
29
|
+
def instrumenter # :nodoc:
|
30
|
+
@instrumenter ||= Switchman::ShardedInstrumenter.new(::ActiveSupport::Notifications.instrumenter, self)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
26
34
|
def quote_local_table_name(name)
|
27
35
|
quote_table_name(name)
|
28
36
|
end
|
@@ -31,7 +31,7 @@ module Switchman
|
|
31
31
|
if operation == "average"
|
32
32
|
result = calculate_simple_average(column_name, distinct)
|
33
33
|
else
|
34
|
-
result = activate do |relation|
|
34
|
+
result = activate(count: operation == "count") do |relation|
|
35
35
|
relation.call_super(:execute_simple_calculation, Calculations, operation, column_name, distinct)
|
36
36
|
end
|
37
37
|
if result.is_a?(Array)
|
@@ -163,7 +163,7 @@ module Switchman
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
def activate(unordered: false, &block)
|
166
|
+
def activate(count: false, unordered: false, &block)
|
167
167
|
shards = all_shards
|
168
168
|
if Array === shards && shards.length == 1
|
169
169
|
if !loaded? && shard_value != shards.first
|
@@ -189,7 +189,13 @@ module Switchman
|
|
189
189
|
|
190
190
|
shard_results = relation.activate(&block)
|
191
191
|
|
192
|
-
if shard_results.present? &&
|
192
|
+
if shard_results.present? && count
|
193
|
+
unless shard_results.is_a?(Integer)
|
194
|
+
raise "expected integer result for count, got #{shard_results.class.name}"
|
195
|
+
end
|
196
|
+
|
197
|
+
result_count += shard_results
|
198
|
+
elsif shard_results.present? && !unordered
|
193
199
|
can_order ||= can_order_cross_shard_results? unless order_values.empty?
|
194
200
|
raise OrderOnMultiShardQuery if !can_order && !order_values.empty? && result_count.positive?
|
195
201
|
|
@@ -20,7 +20,7 @@ module Switchman
|
|
20
20
|
|
21
21
|
if spec_name && !FORBIDDEN_DB_ENVS.include?(shard)
|
22
22
|
begin
|
23
|
-
connection = ::ActiveRecord::Base.connection_handler.retrieve_connection(spec_name, shard:
|
23
|
+
connection = ::ActiveRecord::Base.connection_handler.retrieve_connection(spec_name, shard:)
|
24
24
|
connection.connect! # eagerly validate the connection
|
25
25
|
rescue ::ActiveRecord::ConnectionNotEstablished
|
26
26
|
connection = nil
|
@@ -70,7 +70,7 @@ module Switchman
|
|
70
70
|
|
71
71
|
# INST: filter by FORBIDDEN_DB_ENVS
|
72
72
|
if connection_name && !FORBIDDEN_DB_ENVS.include?(shard)
|
73
|
-
pool = ::ActiveRecord::Base.connection_handler.retrieve_connection_pool(connection_name, shard:
|
73
|
+
pool = ::ActiveRecord::Base.connection_handler.retrieve_connection_pool(connection_name, shard:)
|
74
74
|
if pool
|
75
75
|
setup_shared_connection_pool
|
76
76
|
|
data/lib/switchman/shard.rb
CHANGED
@@ -204,7 +204,7 @@ module Switchman
|
|
204
204
|
database_servers = scope.reorder("database_server_id").select(:database_server_id).distinct
|
205
205
|
.filter_map(&:database_server).uniq
|
206
206
|
# nothing to do
|
207
|
-
return if database_servers.
|
207
|
+
return if database_servers.none?
|
208
208
|
|
209
209
|
scopes = database_servers.to_h do |server|
|
210
210
|
[server, scope.merge(server.shards)]
|
@@ -13,10 +13,16 @@ module Switchman
|
|
13
13
|
# when we might be doing a query while defining attribute methods,
|
14
14
|
# so just avoid logging then
|
15
15
|
if shard.is_a?(Shard) && Shard.instance_variable_get(:@attribute_methods_generated)
|
16
|
+
env = if ::Rails.version < "8.0"
|
17
|
+
@shard_host.pool.connection_class&.current_role
|
18
|
+
else
|
19
|
+
@shard_host.pool.connection_descriptor.name.constantize&.current_role
|
20
|
+
end
|
21
|
+
|
16
22
|
payload[:shard] = {
|
17
23
|
database_server_id: shard.database_server.id,
|
18
24
|
id: shard.id,
|
19
|
-
env:
|
25
|
+
env:
|
20
26
|
}
|
21
27
|
end
|
22
28
|
super
|
data/lib/switchman/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: switchman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2025-08
|
13
|
+
date: 2025-10-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -80,160 +80,6 @@ dependencies:
|
|
80
80
|
- - "<"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '8.1'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: debug
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.8'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.8'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pg
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.2'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '1.2'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rake
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '13.0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '13.0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rspec-mocks
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '3.5'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '3.5'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rspec-rails
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '6.0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '6.0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: rubocop
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - "~>"
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '1.10'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '1.10'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: rubocop-inst
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '1'
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '1'
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: rubocop-rake
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - "~>"
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '0.5'
|
188
|
-
type: :development
|
189
|
-
prerelease: false
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
requirements:
|
192
|
-
- - "~>"
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: '0.5'
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: rubocop-rspec
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
198
|
-
requirements:
|
199
|
-
- - "~>"
|
200
|
-
- !ruby/object:Gem::Version
|
201
|
-
version: '3.0'
|
202
|
-
type: :development
|
203
|
-
prerelease: false
|
204
|
-
version_requirements: !ruby/object:Gem::Requirement
|
205
|
-
requirements:
|
206
|
-
- - "~>"
|
207
|
-
- !ruby/object:Gem::Version
|
208
|
-
version: '3.0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: rubocop-rspec_rails
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - "~>"
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '2.29'
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - "~>"
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '2.29'
|
223
|
-
- !ruby/object:Gem::Dependency
|
224
|
-
name: simplecov
|
225
|
-
requirement: !ruby/object:Gem::Requirement
|
226
|
-
requirements:
|
227
|
-
- - "~>"
|
228
|
-
- !ruby/object:Gem::Version
|
229
|
-
version: '0.15'
|
230
|
-
type: :development
|
231
|
-
prerelease: false
|
232
|
-
version_requirements: !ruby/object:Gem::Requirement
|
233
|
-
requirements:
|
234
|
-
- - "~>"
|
235
|
-
- !ruby/object:Gem::Version
|
236
|
-
version: '0.15'
|
237
83
|
description: Sharding
|
238
84
|
email:
|
239
85
|
- cody@instructure.com
|