switchman 1.12.3 → 1.12.4
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 +5 -5
- data/app/models/switchman/shard_internal.rb +21 -25
- data/db/migrate/20180828183945_add_default_shard_index.rb +13 -0
- data/db/migrate/20180828192111_add_timestamps_to_shards.rb +9 -0
- data/lib/switchman/active_record/connection_handler.rb +12 -8
- data/lib/switchman/r_spec_helper.rb +4 -0
- data/lib/switchman/version.rb +1 -1
- metadata +5 -4
- data/db/shard_1708.sqlite3 +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4aa0193a7496422746f84c2f7f9e97641ba11790a668dc34456719fbc61bec73
|
4
|
+
data.tar.gz: d932aa66cddb7c71934cb016d330dd23b77b9580ab7ca3f6fe3db4494e72085f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47ae6fae556db8c38e80989c5676bae68cd358bdbd664be065dbbba07230ca7ef58e30964bc776e18f98db3b889b68233a600700443573588aba4df4dd72a5b7
|
7
|
+
data.tar.gz: 6d49615fed9167e04e4a5db8a704e1810df401d69555e25d7477eaaa56e60051b918fe81dff0b870479999fbfcbfe996c5a5090803d2607c38cb8522b39ab2ef
|
@@ -56,7 +56,7 @@ module Switchman
|
|
56
56
|
|
57
57
|
# Now find the actual record, if it exists; rescue the fake default if the table doesn't exist
|
58
58
|
@default = begin
|
59
|
-
Shard.where(default: true).
|
59
|
+
find_cached("default_shard") { Shard.where(default: true).take } || default
|
60
60
|
rescue
|
61
61
|
default
|
62
62
|
end
|
@@ -111,30 +111,7 @@ module Switchman
|
|
111
111
|
|
112
112
|
unless cached_shards.has_key?(id)
|
113
113
|
cached_shards[id] = Shard.default.activate do
|
114
|
-
|
115
|
-
# that calls this method
|
116
|
-
attributes = Switchman.cache.fetch(['shard', id].join('/')) do
|
117
|
-
shard = find_by_id(id)
|
118
|
-
if shard
|
119
|
-
shard.attributes
|
120
|
-
else
|
121
|
-
:nil
|
122
|
-
end
|
123
|
-
end
|
124
|
-
if attributes == :nil
|
125
|
-
nil
|
126
|
-
else
|
127
|
-
shard = Shard.new
|
128
|
-
attributes.each do |attr, value|
|
129
|
-
shard.send(:"#{attr}=", value)
|
130
|
-
end
|
131
|
-
shard.clear_changes_information
|
132
|
-
shard.instance_variable_set(:@new_record, false)
|
133
|
-
# connection info doesn't exist in database.yml;
|
134
|
-
# pretend the shard doesn't exist either
|
135
|
-
shard = nil unless shard.database_server
|
136
|
-
shard
|
137
|
-
end
|
114
|
+
find_cached(['shard', id]) { find_by(id: id) }
|
138
115
|
end
|
139
116
|
end
|
140
117
|
cached_shards[id]
|
@@ -540,6 +517,24 @@ module Switchman
|
|
540
517
|
cached_shards.delete(shard.id)
|
541
518
|
end
|
542
519
|
|
520
|
+
def find_cached(key)
|
521
|
+
# can't simply cache the AR object since Shard has a custom serializer
|
522
|
+
# that calls this method
|
523
|
+
attributes = Switchman.cache.fetch(key) { yield&.attributes }
|
524
|
+
return nil unless attributes
|
525
|
+
|
526
|
+
shard = Shard.new
|
527
|
+
attributes.each do |attr, value|
|
528
|
+
shard.send(:"#{attr}=", value)
|
529
|
+
end
|
530
|
+
shard.clear_changes_information
|
531
|
+
shard.instance_variable_set(:@new_record, false)
|
532
|
+
# connection info doesn't exist in database.yml;
|
533
|
+
# pretend the shard doesn't exist either
|
534
|
+
shard = nil unless shard.database_server
|
535
|
+
shard
|
536
|
+
end
|
537
|
+
|
543
538
|
def active_shards
|
544
539
|
Thread.current[:active_shards] ||= {}.compare_by_identity
|
545
540
|
end
|
@@ -673,6 +668,7 @@ module Switchman
|
|
673
668
|
def clear_cache
|
674
669
|
Shard.default.activate do
|
675
670
|
Switchman.cache.delete(['shard', id].join('/'))
|
671
|
+
Switchman.cache.delete("default_shard") if default?
|
676
672
|
end
|
677
673
|
end
|
678
674
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddDefaultShardIndex < ActiveRecord::Migration[4.2]
|
2
|
+
def change
|
3
|
+
Switchman::Shard.where(default: nil).update_all(default: false)
|
4
|
+
change_column_default :switchman_shards, :default, false
|
5
|
+
change_column_null :switchman_shards, :default, false
|
6
|
+
options = if connection.adapter_name == 'PostgreSQL'
|
7
|
+
{ unique: true, where: "\"default\"" }
|
8
|
+
else
|
9
|
+
{}
|
10
|
+
end
|
11
|
+
add_index :switchman_shards, :default, options
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class AddTimestampsToShards < ActiveRecord::Migration[4.2]
|
2
|
+
def change
|
3
|
+
add_timestamps :switchman_shards, null: true
|
4
|
+
now = Time.now.utc
|
5
|
+
Switchman::Shard.update_all(updated_at: now, created_at: now)
|
6
|
+
change_column_null :switchman_shards, :updated_at, false
|
7
|
+
change_column_null :switchman_shards, :created_at, false
|
8
|
+
end
|
9
|
+
end
|
@@ -3,13 +3,14 @@ require 'switchman/connection_pool_proxy'
|
|
3
3
|
module Switchman
|
4
4
|
module ActiveRecord
|
5
5
|
module ConnectionHandler
|
6
|
-
def self.make_sharing_automagic(config)
|
6
|
+
def self.make_sharing_automagic(config, shard = Shard.current)
|
7
7
|
key = config[:adapter] == 'postgresql' ? :schema_search_path : :database
|
8
8
|
|
9
9
|
# only load the shard name from the db if we have to
|
10
|
-
if
|
10
|
+
if !config[:shard_name]
|
11
11
|
# we may not be able to connect to this shard yet, cause it might be an empty database server
|
12
|
-
|
12
|
+
shard = shard.call if shard.is_a?(Proc)
|
13
|
+
shard_name = shard.name rescue nil
|
13
14
|
return unless shard_name
|
14
15
|
|
15
16
|
config[:shard_name] ||= shard_name
|
@@ -84,12 +85,15 @@ module Switchman
|
|
84
85
|
if Shard.default.is_a?(Shard)
|
85
86
|
DatabaseServer.all.each do |server|
|
86
87
|
next if server == Shard.default.database_server
|
87
|
-
|
88
|
-
shard
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
|
89
|
+
shard = nil
|
90
|
+
shard_proc = -> do
|
91
|
+
shard ||= server.shards.where(:name => nil).first
|
92
|
+
shard ||= Shard.new(:database_server => server)
|
93
|
+
shard
|
92
94
|
end
|
95
|
+
ConnectionHandler.make_sharing_automagic(server.config, shard_proc)
|
96
|
+
ConnectionHandler.make_sharing_automagic(proxy.current_pool.spec.config, shard_proc)
|
93
97
|
end
|
94
98
|
end
|
95
99
|
# we may have established some connections above trying to infer the shard's name.
|
@@ -36,6 +36,7 @@ module Switchman
|
|
36
36
|
|
37
37
|
puts "Setting up sharding for all specs..."
|
38
38
|
Shard.delete_all
|
39
|
+
Switchman.cache.delete("default_shard")
|
39
40
|
|
40
41
|
@@shard1, @@shard2 = TestHelper.recreate_persistent_test_shards
|
41
42
|
@@default_shard = Shard.default
|
@@ -71,6 +72,7 @@ module Switchman
|
|
71
72
|
# we'll re-persist in the group's `before :all`; we don't want them to exist
|
72
73
|
# in the db before then
|
73
74
|
Shard.delete_all
|
75
|
+
Switchman.cache.delete("default_shard")
|
74
76
|
Shard.default(true)
|
75
77
|
puts "Done!"
|
76
78
|
|
@@ -99,6 +101,7 @@ module Switchman
|
|
99
101
|
dup = @@default_shard.dup
|
100
102
|
dup.id = @@default_shard.id
|
101
103
|
dup.save!
|
104
|
+
Switchman.cache.delete("default_shard")
|
102
105
|
Shard.default(true)
|
103
106
|
dup = @@shard1.dup
|
104
107
|
dup.id = @@shard1.id
|
@@ -147,6 +150,7 @@ module Switchman
|
|
147
150
|
|
148
151
|
klass.after(:all) do
|
149
152
|
Shard.delete_all
|
153
|
+
Switchman.cache.delete("default_shard")
|
150
154
|
Shard.default(true)
|
151
155
|
end
|
152
156
|
end
|
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: 1.12.
|
4
|
+
version: 1.12.4
|
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: 2018-08-
|
13
|
+
date: 2018-08-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: railties
|
@@ -191,7 +191,8 @@ files:
|
|
191
191
|
- db/migrate/20130328212039_create_switchman_shards.rb
|
192
192
|
- db/migrate/20130328224244_create_default_shard.rb
|
193
193
|
- db/migrate/20161206323434_add_back_default_string_limits_switchman.rb
|
194
|
-
- db/
|
194
|
+
- db/migrate/20180828183945_add_default_shard_index.rb
|
195
|
+
- db/migrate/20180828192111_add_timestamps_to_shards.rb
|
195
196
|
- lib/switchman.rb
|
196
197
|
- lib/switchman/action_controller/caching.rb
|
197
198
|
- lib/switchman/active_record/abstract_adapter.rb
|
@@ -258,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
258
259
|
version: '0'
|
259
260
|
requirements: []
|
260
261
|
rubyforge_project:
|
261
|
-
rubygems_version: 2.6
|
262
|
+
rubygems_version: 2.7.6
|
262
263
|
signing_key:
|
263
264
|
specification_version: 4
|
264
265
|
summary: Rails 4 sharding magic
|
data/db/shard_1708.sqlite3
DELETED
File without changes
|