switchman 3.0.16 → 3.0.17

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: 375c0ee6f7bf35265f46a5b5a2d5b77a60e461c84b6a7df48617e8ad6853087c
4
- data.tar.gz: b64d5c4b02f258cb25e8f60ce2b328d9377ef1c744a3d488c1cae249d1a50266
3
+ metadata.gz: 213adc61b124f8ba48e52259c47702cb601fdc9e0ef71c452c1eeee23dc94e46
4
+ data.tar.gz: f7982e2e7cb3efce13291382b7fa49f9cb0da87cfd5939581368ac5735ed3e00
5
5
  SHA512:
6
- metadata.gz: 286d7ed35829487f57f3e3af640861563aeea66338b78485974965b600f3cc2e3d2bd169c9a826158966466e26e8bde813067e4d904e253183b4a5dd33665e6b
7
- data.tar.gz: b62ab284455df8934811480724c92ccb9ed057541e4a36026d8925725886dd1795ea2fd81c5c22a595f1cd10f3e2516468491135fd485db437f6d12c9eca76f4
6
+ metadata.gz: e3651c9824e8258c8854e0281ecbc081b42f3fa97524d90eb41ac701f9a5eb0bef53ea77a700c682ffa5913ea71aa7816044cfa408b051f20f4b96b86a4e5307
7
+ data.tar.gz: 8fac15d77c092790b6410bf15aaccef4c90243308970eddd29e2c9145281cde67e4d6572439b97966ecc2c5924557c7916aca8665e722530c2ead0d43dbcdab2
@@ -407,6 +407,7 @@ module Switchman
407
407
 
408
408
  klass.connects_to shards: connects_to_hash
409
409
  end
410
+ DatabaseServer.all.each { |db| db.guard! if db.config[:prefer_secondary] } unless @sharding_initialized
410
411
 
411
412
  @sharding_initialized = true
412
413
  end
@@ -28,19 +28,11 @@ module Switchman
28
28
  if self != ::ActiveRecord::Base && current_scope
29
29
  current_scope.activate do
30
30
  db = Shard.current(connection_classes).database_server
31
- if ::GuardRail.environment == db.guard_rail_environment
32
- super
33
- else
34
- db.unguard { super }
35
- end
31
+ db.unguard { super }
36
32
  end
37
33
  else
38
34
  db = Shard.current(connection_classes).database_server
39
- if ::GuardRail.environment == db.guard_rail_environment
40
- super
41
- else
42
- db.unguard { super }
43
- end
35
+ db.unguard { super }
44
36
  end
45
37
  end
46
38
 
@@ -68,6 +60,28 @@ module Switchman
68
60
  end
69
61
  end
70
62
 
63
+ def current_role_overriden?
64
+ current_role != current_role(without_overrides: true)
65
+ end
66
+
67
+ # significant change: Allow per-shard roles
68
+ def current_role(without_overrides: false)
69
+ return super() if without_overrides
70
+
71
+ sharded_role = nil
72
+ connected_to_stack.reverse_each do |hash|
73
+ shard_role = hash.dig(:shard_roles, current_shard)
74
+ if shard_role && (hash[:klasses].include?(Base) || hash[:klasses].include?(connection_classes))
75
+ sharded_role = shard_role
76
+ break
77
+ end
78
+ end
79
+ # Allow a shard-specific role to be reverted to regular inheritance
80
+ return sharded_role if sharded_role && sharded_role != :_switchman_inherit
81
+
82
+ super()
83
+ end
84
+
71
85
  # significant change: _don't_ check if klasses.include?(Base)
72
86
  # i.e. other sharded models don't inherit the current shard of Base
73
87
  def current_shard
@@ -146,7 +160,8 @@ module Switchman
146
160
 
147
161
  def with_transaction_returning_status
148
162
  shard.activate(self.class.connection_classes) do
149
- super
163
+ db = Shard.current(self.class.connection_classes).database_server
164
+ db.unguard { super }
150
165
  end
151
166
  end
152
167
 
@@ -167,9 +182,7 @@ module Switchman
167
182
 
168
183
  def update_columns(*)
169
184
  db = shard.database_server
170
- return db.unguard { super } if ::GuardRail.environment != db.guard_rail_environment
171
-
172
- super
185
+ db.unguard { super }
173
186
  end
174
187
 
175
188
  def id_for_database
@@ -14,9 +14,7 @@ module Switchman
14
14
 
15
15
  def delete
16
16
  db = shard.database_server
17
- return db.unguard { super } unless ::GuardRail.environment == db.guard_rail_environment
18
-
19
- super
17
+ db.unguard { super }
20
18
  end
21
19
  end
22
20
  end
@@ -129,27 +129,26 @@ module Switchman
129
129
  end
130
130
  end
131
131
 
132
- def guard_rail_environment
133
- @guard_rail_environment || ::GuardRail.environment
134
- end
135
-
136
132
  # locks this db to a specific environment, except for
137
133
  # when doing writes (then it falls back to the current
138
134
  # value of GuardRail.environment)
139
135
  def guard!(environment = :secondary)
140
- @guard_rail_environment = environment
136
+ ::ActiveRecord::Base.connected_to_stack << { shard_roles: { id.to_sym => environment }, klasses: [::ActiveRecord::Base] }
141
137
  end
142
138
 
143
139
  def unguard!
144
- @guard_rail_environment = nil
140
+ ::ActiveRecord::Base.connected_to_stack << { shard_roles: { id.to_sym => :_switchman_inherit }, klasses: [::ActiveRecord::Base] }
145
141
  end
146
142
 
147
143
  def unguard
148
- old_env = @guard_rail_environment
149
- unguard!
150
- yield
151
- ensure
152
- guard!(old_env)
144
+ return yield unless ::ActiveRecord::Base.current_role_overriden?
145
+
146
+ begin
147
+ unguard!
148
+ yield
149
+ ensure
150
+ ::ActiveRecord::Base.connected_to_stack.pop
151
+ end
153
152
  end
154
153
 
155
154
  def shards
@@ -6,20 +6,17 @@ module Switchman
6
6
  def exec_queries(*args)
7
7
  if lock_value
8
8
  db = Shard.current(connection_classes).database_server
9
- return db.unguard { super } if ::GuardRail.environment != db.guard_rail_environment
9
+ db.unguard { super }
10
+ else
11
+ super
10
12
  end
11
- super
12
13
  end
13
14
 
14
15
  %w[update_all delete_all].each do |method|
15
16
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
16
17
  def #{method}(*args)
17
18
  db = Shard.current(connection_classes).database_server
18
- if ::GuardRail.environment != db.guard_rail_environment
19
- db.unguard { super }
20
- else
21
- super
22
- end
19
+ db.unguard { super }
23
20
  end
24
21
  RUBY
25
22
  end
@@ -3,6 +3,11 @@
3
3
  module Switchman
4
4
  module GuardRail
5
5
  module ClassMethods
6
+ def environment
7
+ # no overrides so we get the global role, not the role for the default shard
8
+ ::ActiveRecord::Base.current_role(without_overrides: true)
9
+ end
10
+
6
11
  def activate(role)
7
12
  DatabaseServer.send(:reference_role, role)
8
13
  super
@@ -16,7 +16,7 @@ module Switchman
16
16
  payload[:shard] = {
17
17
  database_server_id: shard.database_server.id,
18
18
  id: shard.id,
19
- env: shard.database_server.guard_rail_environment
19
+ env: @shard_host.pool.connection_klass&.current_role
20
20
  }
21
21
  end
22
22
  super name, payload
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Switchman
4
- VERSION = '3.0.16'
4
+ VERSION = '3.0.17'
5
5
  end
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: 3.0.16
4
+ version: 3.0.17
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: 2022-03-28 00:00:00.000000000 Z
13
+ date: 2022-04-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord