ar-octopus 0.8.1 → 0.8.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.
Files changed (35) hide show
  1. checksums.yaml +8 -8
  2. data/README.mkdn +80 -55
  3. data/lib/octopus.rb +20 -6
  4. data/lib/octopus/{rails3/abstract_adapter.rb → abstract_adapter.rb} +1 -4
  5. data/lib/octopus/association.rb +5 -99
  6. data/lib/octopus/association_shard_tracking.rb +105 -0
  7. data/lib/octopus/collection_association.rb +9 -0
  8. data/lib/octopus/collection_proxy.rb +14 -0
  9. data/lib/octopus/has_and_belongs_to_many_association.rb +2 -12
  10. data/lib/octopus/load_balancing.rb +3 -0
  11. data/lib/octopus/load_balancing/round_robin.rb +15 -0
  12. data/lib/octopus/{rails3/log_subscriber.rb → log_subscriber.rb} +0 -0
  13. data/lib/octopus/model.rb +74 -85
  14. data/lib/octopus/{rails3/persistence.rb → persistence.rb} +0 -0
  15. data/lib/octopus/proxy.rb +166 -29
  16. data/lib/octopus/relation_proxy.rb +39 -0
  17. data/lib/octopus/scope_proxy.rb +7 -10
  18. data/lib/octopus/shard_tracking.rb +45 -0
  19. data/lib/octopus/shard_tracking/attribute.rb +24 -0
  20. data/lib/octopus/shard_tracking/dynamic.rb +7 -0
  21. data/lib/octopus/singular_association.rb +7 -0
  22. data/lib/octopus/slave_group.rb +11 -0
  23. data/lib/octopus/version.rb +1 -1
  24. data/spec/config/shards.yml +53 -0
  25. data/spec/octopus/{association_spec.rb → association_shard_tracking_spec.rb} +1 -1
  26. data/spec/octopus/collection_proxy_spec.rb +15 -0
  27. data/spec/octopus/model_spec.rb +2 -2
  28. data/spec/octopus/octopus_spec.rb +34 -0
  29. data/spec/octopus/relation_proxy_spec.rb +77 -0
  30. data/spec/octopus/replicated_slave_grouped_spec.rb +64 -0
  31. data/spec/octopus/sharded_replicated_slave_grouped_spec.rb +55 -0
  32. data/spec/support/octopus_helper.rb +1 -0
  33. metadata +26 -9
  34. data/lib/octopus/association_collection.rb +0 -49
  35. data/lib/octopus/rails3/singular_association.rb +0 -34
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+
3
+ describe "when the database is both sharded and replicated" do
4
+
5
+ it "should pick the shard based on current_shard when you have a sharded model" do
6
+
7
+ OctopusHelper.using_environment :sharded_replicated_slave_grouped do
8
+ Octopus.using(:russia) do
9
+ Cat.create!(:name => "Thiago1")
10
+ Cat.create!(:name => "Thiago2")
11
+ end
12
+
13
+ # We must stub here to make it effective (not in the `before(:each)` block)
14
+ Octopus.stub(:env).and_return("sharded_replicated_slave_grouped")
15
+
16
+ Cat.using(:russia).count.should == 2
17
+ # It distributes queries between two slaves in the slave group
18
+ Cat.using(shard: :russia, slave_group: :slaves1).count.should == 0
19
+ Cat.using(shard: :russia, slave_group: :slaves1).count.should == 2
20
+ Cat.using(shard: :russia, slave_group: :slaves1).count.should == 0
21
+ # It distributes queries between two slaves in the slave group
22
+ Cat.using(shard: :russia, slave_group: :slaves2).count.should == 2
23
+ Cat.using(shard: :russia, slave_group: :slaves2).count.should == 0
24
+ Cat.using(shard: :russia, slave_group: :slaves2).count.should == 2
25
+
26
+ Cat.using(:europe).count.should == 0
27
+ Cat.using(shard: :europe, slave_group: :slaves1)
28
+ .count.should == 0
29
+ Cat.using(shard: :europe, slave_group: :slaves2)
30
+ .count.should == 2
31
+ end
32
+ end
33
+
34
+ it "should make queries to master when slave groups are configured for the shard but not selected" do
35
+ OctopusHelper.using_environment :sharded_replicated_slave_grouped do
36
+ Octopus.using(:europe) do
37
+ # All the queries go to :master(`octopus_shard_1`)
38
+
39
+ Cat.create!(:name => "Thiago1")
40
+ Cat.create!(:name => "Thiago2")
41
+
42
+ # In `database.yml` and `shards.yml`, we have configured 1 master and 6 slaves for `sharded_replicated_slave_grouped`
43
+ # So we can ensure Octopus is not distributing queries between them
44
+ # by asserting 1 + 6 = 7 queries go to :master(`octopus_shard_1`)
45
+ Cat.count.should == 2
46
+ Cat.count.should == 2
47
+ Cat.count.should == 2
48
+ Cat.count.should == 2
49
+ Cat.count.should == 2
50
+ Cat.count.should == 2
51
+ Cat.count.should == 2
52
+ end
53
+ end
54
+ end
55
+ end
@@ -21,6 +21,7 @@ module OctopusHelper
21
21
  Thread.current["octopus.current_model"] = nil
22
22
  Thread.current["octopus.current_shard"] = nil
23
23
  Thread.current["octopus.current_group"] = nil
24
+ Thread.current["octopus.current_slave_group"] = nil
24
25
  Thread.current["octopus.block"] = nil
25
26
  Thread.current["octopus.last_current_shard"] = nil
26
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar-octopus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago Pradi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-01-28 00:00:00.000000000 Z
13
+ date: 2014-07-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -164,18 +164,27 @@ files:
164
164
  - init.rb
165
165
  - lib/ar-octopus.rb
166
166
  - lib/octopus.rb
167
+ - lib/octopus/abstract_adapter.rb
167
168
  - lib/octopus/association.rb
168
- - lib/octopus/association_collection.rb
169
+ - lib/octopus/association_shard_tracking.rb
170
+ - lib/octopus/collection_association.rb
171
+ - lib/octopus/collection_proxy.rb
169
172
  - lib/octopus/has_and_belongs_to_many_association.rb
173
+ - lib/octopus/load_balancing.rb
174
+ - lib/octopus/load_balancing/round_robin.rb
175
+ - lib/octopus/log_subscriber.rb
170
176
  - lib/octopus/migration.rb
171
177
  - lib/octopus/model.rb
178
+ - lib/octopus/persistence.rb
172
179
  - lib/octopus/proxy.rb
173
- - lib/octopus/rails3/abstract_adapter.rb
174
- - lib/octopus/rails3/log_subscriber.rb
175
- - lib/octopus/rails3/persistence.rb
176
- - lib/octopus/rails3/singular_association.rb
177
180
  - lib/octopus/railtie.rb
181
+ - lib/octopus/relation_proxy.rb
178
182
  - lib/octopus/scope_proxy.rb
183
+ - lib/octopus/shard_tracking.rb
184
+ - lib/octopus/shard_tracking/attribute.rb
185
+ - lib/octopus/shard_tracking/dynamic.rb
186
+ - lib/octopus/singular_association.rb
187
+ - lib/octopus/slave_group.rb
179
188
  - lib/octopus/version.rb
180
189
  - lib/tasks/octopus.rake
181
190
  - rails/init.rb
@@ -270,14 +279,18 @@ files:
270
279
  - spec/migrations/7_raise_exception_with_invalid_multiple_shard_names.rb
271
280
  - spec/migrations/8_raise_exception_with_invalid_group_name.rb
272
281
  - spec/migrations/9_raise_exception_with_multiple_invalid_group_names.rb
273
- - spec/octopus/association_spec.rb
282
+ - spec/octopus/association_shard_tracking_spec.rb
283
+ - spec/octopus/collection_proxy_spec.rb
274
284
  - spec/octopus/log_subscriber_spec.rb
275
285
  - spec/octopus/migration_spec.rb
276
286
  - spec/octopus/model_spec.rb
277
287
  - spec/octopus/octopus_spec.rb
278
288
  - spec/octopus/proxy_spec.rb
289
+ - spec/octopus/relation_proxy_spec.rb
290
+ - spec/octopus/replicated_slave_grouped_spec.rb
279
291
  - spec/octopus/replication_spec.rb
280
292
  - spec/octopus/scope_proxy_spec.rb
293
+ - spec/octopus/sharded_replicated_slave_grouped_spec.rb
281
294
  - spec/octopus/sharded_spec.rb
282
295
  - spec/spec_helper.rb
283
296
  - spec/support/active_record/connection_adapters/modify_config_adapter.rb
@@ -335,14 +348,18 @@ test_files:
335
348
  - spec/migrations/7_raise_exception_with_invalid_multiple_shard_names.rb
336
349
  - spec/migrations/8_raise_exception_with_invalid_group_name.rb
337
350
  - spec/migrations/9_raise_exception_with_multiple_invalid_group_names.rb
338
- - spec/octopus/association_spec.rb
351
+ - spec/octopus/association_shard_tracking_spec.rb
352
+ - spec/octopus/collection_proxy_spec.rb
339
353
  - spec/octopus/log_subscriber_spec.rb
340
354
  - spec/octopus/migration_spec.rb
341
355
  - spec/octopus/model_spec.rb
342
356
  - spec/octopus/octopus_spec.rb
343
357
  - spec/octopus/proxy_spec.rb
358
+ - spec/octopus/relation_proxy_spec.rb
359
+ - spec/octopus/replicated_slave_grouped_spec.rb
344
360
  - spec/octopus/replication_spec.rb
345
361
  - spec/octopus/scope_proxy_spec.rb
362
+ - spec/octopus/sharded_replicated_slave_grouped_spec.rb
346
363
  - spec/octopus/sharded_spec.rb
347
364
  - spec/spec_helper.rb
348
365
  - spec/support/active_record/connection_adapters/modify_config_adapter.rb
@@ -1,49 +0,0 @@
1
- module Octopus::AssociationCollection
2
-
3
- METHODS = %w[
4
- reader
5
- writer
6
- ids_reader
7
- ids_writer
8
- create
9
- create!
10
- build
11
- any?
12
- count
13
- empty?
14
- first
15
- include?
16
- last
17
- length
18
- load_target
19
- many?
20
- size
21
- select
22
- uniq
23
- ]
24
-
25
- def self.included(base)
26
- base.instance_eval do
27
- METHODS.each do |m|
28
- alias_method_chain m.to_sym, :octopus
29
- end
30
- end
31
- end
32
-
33
- METHODS.each do |m|
34
- m =~ /([^!?]+)([!?])?/
35
- method, punctuation = [ $1, $2 ]
36
- with = :"#{method}_with_octopus#{punctuation}"
37
- without = :"#{method}_without_octopus#{punctuation}"
38
- define_method with do |*args, &block|
39
- @owner.run_on_shard { send(without, *args, &block) }
40
- end
41
- end
42
-
43
- def should_wrap_the_connection?
44
- @owner.respond_to?(:current_shard) && @owner.current_shard != nil
45
- end
46
-
47
- end
48
-
49
- ActiveRecord::Associations::CollectionAssociation.send(:include, Octopus::AssociationCollection)
@@ -1,34 +0,0 @@
1
- module Octopus::SingularAssociation
2
- def self.included(base)
3
- base.instance_eval do
4
- alias_method_chain :reader, :octopus
5
- alias_method_chain :writer, :octopus
6
- alias_method_chain :create, :octopus
7
- alias_method_chain :create!, :octopus
8
- alias_method_chain :build, :octopus
9
- end
10
- end
11
-
12
- def reader_with_octopus(*args)
13
- owner.run_on_shard { reader_without_octopus(*args) }
14
- end
15
-
16
- def writer_with_octopus(*args)
17
- owner.run_on_shard { writer_without_octopus(*args) }
18
- end
19
-
20
- def create_with_octopus(*args)
21
- owner.run_on_shard { create_without_octopus(*args) }
22
- end
23
-
24
- def create_with_octopus!(*args)
25
- owner.run_on_shard { create_without_octopus!(*args) }
26
- end
27
-
28
- def build_with_octopus(*args)
29
- owner.run_on_shard { build_without_octopus(*args) }
30
- end
31
-
32
- end
33
-
34
- ActiveRecord::Associations::SingularAssociation.send(:include, Octopus::SingularAssociation)