ar-octopus 0.0.11 → 0.0.12
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.
- data/Rakefile +2 -2
- data/ar-octopus.gemspec +5 -5
- data/lib/octopus/proxy.rb +4 -3
- data/spec/config/shards.yml +25 -1
- data/spec/octopus/replication_specs.rb +44 -4
- metadata +8 -6
data/Rakefile
CHANGED
@@ -28,8 +28,8 @@ begin
|
|
28
28
|
gem.homepage = "http://github.com/tchandy/octopus"
|
29
29
|
gem.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
|
30
30
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
31
|
-
gem.add_dependency('activerecord')
|
32
|
-
gem.version = "0.0.
|
31
|
+
gem.add_dependency('activerecord', '>= 3.0.0beta')
|
32
|
+
gem.version = "0.0.12"
|
33
33
|
end
|
34
34
|
Jeweler::GemcutterTasks.new
|
35
35
|
rescue LoadError
|
data/ar-octopus.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ar-octopus}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.12"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
|
12
|
-
s.date = %q{2010-06-
|
12
|
+
s.date = %q{2010-06-29}
|
13
13
|
s.description = %q{This gem allows you to use sharded databases with ActiveRecord. this also provides a interface for replication and for running migrations with multiples shards.}
|
14
14
|
s.email = %q{tchandy@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -101,14 +101,14 @@ Gem::Specification.new do |s|
|
|
101
101
|
|
102
102
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
103
103
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
104
|
-
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
104
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 3.0.0beta"])
|
105
105
|
else
|
106
106
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
107
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
107
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0beta"])
|
108
108
|
end
|
109
109
|
else
|
110
110
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
111
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
111
|
+
s.add_dependency(%q<activerecord>, [">= 3.0.0beta"])
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
data/lib/octopus/proxy.rb
CHANGED
@@ -3,7 +3,7 @@ class Octopus::Proxy
|
|
3
3
|
|
4
4
|
def initialize(config)
|
5
5
|
initialize_shards(config)
|
6
|
-
initialize_replication() if have_a_valid_configuration?(config) && config[Octopus.env()]["replicated"]
|
6
|
+
initialize_replication(config) if have_a_valid_configuration?(config) && config[Octopus.env()]["replicated"]
|
7
7
|
end
|
8
8
|
|
9
9
|
def initialize_shards(config)
|
@@ -31,8 +31,9 @@ class Octopus::Proxy
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def initialize_replication()
|
34
|
+
def initialize_replication(config)
|
35
35
|
@replicated = true
|
36
|
+
@entire_replicated = config[Octopus.env()]["entire_replicated"]
|
36
37
|
@slaves_list = @shards.keys.map {|sym| sym.to_s}.sort
|
37
38
|
@slaves_list.delete('master')
|
38
39
|
end
|
@@ -187,7 +188,7 @@ class Octopus::Proxy
|
|
187
188
|
def send_queries_to_selected_slave(method, *args, &block)
|
188
189
|
old_shard = self.current_shard
|
189
190
|
|
190
|
-
if current_model.read_inheritable_attribute(:replicated)
|
191
|
+
if current_model.read_inheritable_attribute(:replicated) || @entire_replicated
|
191
192
|
if !using_enabled
|
192
193
|
self.current_shard = @slaves_list.shift.to_sym
|
193
194
|
@slaves_list << self.current_shard
|
data/spec/config/shards.yml
CHANGED
@@ -73,4 +73,28 @@ production_replicated:
|
|
73
73
|
slave4:
|
74
74
|
adapter: mysql
|
75
75
|
host: localhost
|
76
|
-
database: octopus_shard5
|
76
|
+
database: octopus_shard5
|
77
|
+
|
78
|
+
|
79
|
+
production_entire_replicated:
|
80
|
+
replicated: true
|
81
|
+
entire_replicated: true
|
82
|
+
shards:
|
83
|
+
slave1:
|
84
|
+
adapter: mysql
|
85
|
+
host: localhost
|
86
|
+
database: octopus_shard2
|
87
|
+
slave2:
|
88
|
+
adapter: mysql
|
89
|
+
host: localhost
|
90
|
+
database: octopus_shard3
|
91
|
+
slave3:
|
92
|
+
adapter: mysql
|
93
|
+
host: localhost
|
94
|
+
database: octopus_shard4
|
95
|
+
slave4:
|
96
|
+
adapter: mysql
|
97
|
+
host: localhost
|
98
|
+
database: octopus_shard5
|
99
|
+
|
100
|
+
|
@@ -6,7 +6,7 @@ describe "when the database is replicated" do
|
|
6
6
|
clean_connection_proxy()
|
7
7
|
end
|
8
8
|
|
9
|
-
it "should send all writes/reads queries to master when you have a replicated model" do
|
9
|
+
it "should send all writes/reads queries to master when you have a non replicated model" do
|
10
10
|
u = User.create!(:name => "Replicated")
|
11
11
|
User.count.should == 1
|
12
12
|
User.find(u.id).should == u
|
@@ -15,11 +15,11 @@ describe "when the database is replicated" do
|
|
15
15
|
it "should send read queries to slaves, when you have a replicated model, using a round robin algorithm" do
|
16
16
|
u = Cat.create!(:name => "master")
|
17
17
|
c = Client.create!(:name => "client_master")
|
18
|
-
|
18
|
+
|
19
19
|
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
20
20
|
Cat.using(sym).create!(:name => "Replicated_#{sym}")
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
Client.find(:first).should_not be_nil
|
24
24
|
Cat.find(:first).name.should == "Replicated_slave1"
|
25
25
|
Client.find(:first).should_not be_nil
|
@@ -31,9 +31,49 @@ describe "when the database is replicated" do
|
|
31
31
|
Client.find(:first).should_not be_nil
|
32
32
|
Cat.find(:first).name.should == "Replicated_slave1"
|
33
33
|
Client.find(:first).should_not be_nil
|
34
|
-
|
34
|
+
|
35
35
|
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
36
36
|
Cat.using(sym).find_by_name("master").should be_false
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
|
42
|
+
describe "when the database is replicated and the entire application is replicated" do
|
43
|
+
before(:each) do
|
44
|
+
Octopus.stub!(:env).and_return("production_entire_replicated")
|
45
|
+
clean_connection_proxy()
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should send read queries to slaves,to all models, using a round robin algorithm" do
|
49
|
+
u = Cat.create!(:name => "master")
|
50
|
+
c = Client.create!(:name => "client_master")
|
51
|
+
|
52
|
+
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
53
|
+
Cat.using(sym).create!(:name => "Replicated_#{sym}")
|
54
|
+
end
|
55
|
+
|
56
|
+
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
57
|
+
Client.using(sym).create!(:name => "Replicated_#{sym}")
|
58
|
+
end
|
59
|
+
|
60
|
+
Client.find(:first).name.should == "Replicated_slave1"
|
61
|
+
Cat.find(:first).name.should == "Replicated_slave2"
|
62
|
+
Client.find(:first).name.should == "Replicated_slave3"
|
63
|
+
Cat.find(:first).name.should == "Replicated_slave4"
|
64
|
+
Cat.find(:first).name.should == "Replicated_slave1"
|
65
|
+
Client.find(:first).name.should == "Replicated_slave2"
|
66
|
+
Cat.find(:first).name.should == "Replicated_slave3"
|
67
|
+
Client.find(:first).name.should == "Replicated_slave4"
|
68
|
+
|
69
|
+
|
70
|
+
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
71
|
+
Cat.using(sym).find_by_name("master").should be_false
|
72
|
+
end
|
73
|
+
|
74
|
+
[:slave4, :slave1, :slave2, :slave3].each do |sym|
|
75
|
+
Client.using(sym).find_by_name("master").should be_false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar-octopus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 12
|
10
|
+
version: 0.0.12
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Thiago Pradi
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-06-
|
20
|
+
date: 2010-06-29 00:00:00 -03:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -44,10 +44,12 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
hash:
|
47
|
+
hash: -1139874873
|
48
48
|
segments:
|
49
|
+
- 3
|
49
50
|
- 0
|
50
|
-
|
51
|
+
- 0beta
|
52
|
+
version: 3.0.0beta
|
51
53
|
type: :runtime
|
52
54
|
version_requirements: *id002
|
53
55
|
description: This gem allows you to use sharded databases with ActiveRecord. this also provides a interface for replication and for running migrations with multiples shards.
|