switchman 2.0.13 → 2.1.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: de9d4ea9f0368bf1bfe15fdb8dd6bef040a8ec107aed386eaa81f8fa444513df
4
- data.tar.gz: 71b7905b40d59a4767576552c8f5d16a2b3bdaec6d910f81f18d803a9c916256
3
+ metadata.gz: a4ef7325514ffe64ab4fd53de062392b9edba2e7089ff35a8bbebfa475338a9d
4
+ data.tar.gz: cb74519796fee752ec5dc5e5469e39db240fbf819b38ea8d1ff5ae75c939601a
5
5
  SHA512:
6
- metadata.gz: bac07aa4f15521f123a1d95f676448d649c71eddd86fdfbbb57504f59d0c71f9ce69618aa7d1e25e93fdc278708cb2a7385d111417f23a8fc0eb1e9b6f6eefb3
7
- data.tar.gz: 1c091615da88fe2f54de51de1e740336007fd13d66d0cac0b977d0e2770a6dfacd6a85bd12b689a0c610b1de5daeab4512743f0c50199e0f610806cc2f4dd629
6
+ metadata.gz: 6583450d651aa95d06ad5d53a294bb2247ceee6fca42659a666da13378422fdaeeced89a772622de5671812fd7990531f470fd3d630870e6306d53e3e1ebc873
7
+ data.tar.gz: d1c21d744f5b926620f32540ca5c5c68b86ba97355b1fb8548ea829ccb05702173228eb40bf25e729a773be210436cfeb369ac2918a8aacea4da63d59b294404
@@ -18,7 +18,7 @@ module Switchman
18
18
  :unsharded => [Shard]
19
19
  }
20
20
  private_constant :CATEGORIES
21
- @connection_specification_name = @shard_category = :unsharded
21
+ @connection_specification_name = 'unsharded'
22
22
 
23
23
  if defined?(::ProtectedAttributes)
24
24
  attr_accessible :default, :name, :database_server
@@ -283,17 +283,28 @@ module Switchman
283
283
 
284
284
  with_each_shard(subscope, categories, options) { yield }
285
285
  exception_pipe.last.close
286
- rescue => e
286
+ rescue Exception => e
287
287
  begin
288
288
  dumped = Marshal.dump(e)
289
+ dumped = nil if dumped.length > 64 * 1024
289
290
  rescue
291
+ dumped = nil
292
+ end
293
+
294
+ if dumped.nil?
290
295
  # couldn't dump the exception; create a copy with just
291
296
  # the message and the backtrace
292
297
  e2 = e.class.new(e.message)
293
- e2.set_backtrace(e.backtrace)
298
+ backtrace = e.backtrace
299
+ # truncate excessively long backtraces
300
+ if backtrace.length > 50
301
+ backtrace = backtrace[0...25] + ['...'] + backtrace[-25..-1]
302
+ end
303
+ e2.set_backtrace(backtrace)
294
304
  e2.instance_variable_set(:@active_shards, e.instance_variable_get(:@active_shards))
295
305
  dumped = Marshal.dump(e2)
296
306
  end
307
+
297
308
  exception_pipe.last.set_encoding(dumped.encoding)
298
309
  exception_pipe.last.write(dumped)
299
310
  exception_pipe.last.flush
@@ -112,8 +112,20 @@ module Switchman
112
112
  end
113
113
 
114
114
  def remove_connection(spec_name)
115
+ # also remove pools based on the same spec name that are for shard category purposes
116
+ # can't just use delete_if, because it's a Concurrent::Map, not a Hash
117
+ owner_to_pool.keys.each do |k|
118
+ next if k == spec_name
119
+
120
+ v = owner_to_pool[k]
121
+ owner_to_pool.delete(k) if v.is_a?(ConnectionPoolProxy) && v.spec.name == spec_name
122
+ end
123
+
124
+ # unwrap the pool from inside a ConnectionPoolProxy
115
125
  pool = owner_to_pool[spec_name]
116
126
  owner_to_pool[spec_name] = pool.default_pool if pool.is_a?(ConnectionPoolProxy)
127
+
128
+ # now let Rails do its thing with the data type it expects
117
129
  super
118
130
  end
119
131
 
@@ -128,15 +140,21 @@ module Switchman
128
140
  else
129
141
  ancestor_pool.spec
130
142
  end
131
- pool = establish_connection(spec.to_hash)
132
- pool.instance_variable_set(:@schema_cache, ancestor_pool.schema_cache) if ancestor_pool.schema_cache
133
- pool
134
- elsif spec_name != "primary"
143
+ # avoid copying "duplicate" pools that implement shard categories.
144
+ # they'll have a spec.name of primary, but a spec_name of something else, like unsharded
145
+ if spec.name == spec_name
146
+ pool = establish_connection(spec.to_hash)
147
+ pool.instance_variable_set(:@schema_cache, ancestor_pool.schema_cache) if ancestor_pool.schema_cache
148
+ next pool
149
+ end
150
+ end
151
+
152
+ if spec_name != "primary"
135
153
  primary_pool = retrieve_connection_pool("primary")
136
154
  if primary_pool.is_a?(ConnectionPoolProxy)
137
155
  pool = ConnectionPoolProxy.new(spec_name.to_sym, primary_pool.default_pool, @shard_connection_pools)
138
156
  pool.schema_cache.copy_references(primary_pool.schema_cache)
139
- pool
157
+ owner_to_pool[spec_name] = pool
140
158
  else
141
159
  primary_pool
142
160
  end
@@ -28,15 +28,26 @@ module Switchman
28
28
  # this technically belongs on AssociationReflection, but we put it on
29
29
  # ThroughReflection as well, instead of delegating to its internal
30
30
  # HasManyAssociation, losing its proper `klass`
31
- def association_scope_cache(conn, owner, &block)
32
- key = conn.prepared_statements
33
- if polymorphic?
34
- key = [key, owner._read_attribute(@foreign_type)]
31
+ if ::Rails.version < '6.0.4'
32
+ def association_scope_cache(conn, owner, &block)
33
+ key = conn.prepared_statements
34
+ if polymorphic?
35
+ key = [key, owner._read_attribute(@foreign_type)]
36
+ end
37
+ key = [key, shard(owner).id].flatten
38
+ @association_scope_cache[key] ||= @scope_lock.synchronize {
39
+ @association_scope_cache[key] ||= (::Rails.version >= "5.2" ? ::ActiveRecord::StatementCache.create(conn, &block) : block.call)
40
+ }
41
+ end
42
+ else
43
+ def association_scope_cache(klass, owner, &block)
44
+ key = self
45
+ if polymorphic?
46
+ key = [key, owner._read_attribute(@foreign_type)]
47
+ end
48
+ key = [key, shard(owner).id].flatten
49
+ klass.cached_find_by_statement(key, &block)
35
50
  end
36
- key = [key, shard(owner).id].flatten
37
- @association_scope_cache[key] ||= @scope_lock.synchronize {
38
- @association_scope_cache[key] ||= (::Rails.version >= "5.2" ? ::ActiveRecord::StatementCache.create(conn, &block) : block.call)
39
- }
40
51
  end
41
52
  end
42
53
 
@@ -17,13 +17,7 @@ module Switchman
17
17
  Shard.default(reload: true)
18
18
  end
19
19
 
20
- # can't auto-create a new shard on the default shard's db server if the
21
- # default shard is split across multiple db servers
22
- if ::ActiveRecord::Base.connection_handler.connection_pool_list.length > 1
23
- server1 = DatabaseServer.create(Shard.default.database_server.config)
24
- else
25
- server1 = Shard.default.database_server
26
- end
20
+ server1 = Shard.default.database_server
27
21
  server2 = DatabaseServer.create(Shard.default.database_server.config.merge(server2: true))
28
22
 
29
23
  if server1 == Shard.default.database_server && server1.config[:shard1] && server1.config[:shard2]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Switchman
4
- VERSION = "2.0.13"
4
+ VERSION = "2.1.0"
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: 2.0.13
4
+ version: 2.1.0
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: 2021-06-11 00:00:00.000000000 Z
13
+ date: 2021-07-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: railties