ar_mysql_flexmaster 0.4.4 → 0.5.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 +7 -0
- data/.travis.yml +22 -4
- data/Gemfile +2 -3
- data/README.md +44 -30
- data/Rakefile +4 -3
- data/ar_mysql_flexmaster.gemspec +4 -3
- data/gemfiles/rails2.3.gemfile +7 -0
- data/gemfiles/{rails2.gemfile.lock → rails2.3.gemfile.lock} +13 -20
- data/gemfiles/rails3.0.gemfile +7 -0
- data/gemfiles/{rails3.gemfile.lock → rails3.0.gemfile.lock} +20 -27
- data/gemfiles/rails3.2.gemfile +4 -7
- data/gemfiles/rails3.2.gemfile.lock +53 -61
- data/gemfiles/rails4.0.gemfile +7 -0
- data/gemfiles/rails4.0.gemfile.lock +92 -0
- data/gemfiles/rails4.1.gemfile +7 -0
- data/gemfiles/rails4.1.gemfile.lock +98 -0
- data/gemfiles/rails4.2.gemfile +7 -0
- data/gemfiles/rails4.2.gemfile.lock +123 -0
- data/test/ar_flexmaster_test.rb +14 -16
- data/test/boot_mysql_env.rb +12 -1
- data/test/integration/no_traffic_test.rb +10 -18
- data/test/integration/there_and_back_again_test.rb +16 -28
- data/test/integration/with_queries_to_be_killed_test.rb +25 -35
- data/test/integration/wrong_setup_test.rb +21 -29
- data/test/integration_helper.rb +19 -0
- metadata +50 -44
- data/Appraisals +0 -14
- data/gemfiles/rails2.gemfile +0 -10
- data/gemfiles/rails3.gemfile +0 -10
@@ -1,34 +1,22 @@
|
|
1
|
-
|
2
|
-
require 'mysql2'
|
3
|
-
require 'test/unit/assertions'
|
1
|
+
require_relative "../integration_helper"
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
class ThereAndBackAgain < Minitest::Test
|
4
|
+
def test_there_and_back
|
5
|
+
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
6
|
+
$mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
|
8
7
|
|
9
|
-
|
10
|
-
$mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
|
8
|
+
puts "testing first cutover..."
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
$stderr.puts("#{str} is #{bool ? 'read-write' : 'read-only'} but I expected otherwise!")
|
16
|
-
exit 1
|
17
|
-
end
|
18
|
-
end
|
19
|
-
puts "testing first cutover..."
|
20
|
-
|
21
|
-
system "#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p '' -r -s"
|
22
|
-
assert_ro($mysql_master.connection, 'original master', true)
|
23
|
-
assert_ro($mysql_slave.connection, 'original slave', false)
|
24
|
-
|
25
|
-
assert "Yes" == $mysql_master.connection.query("show slave status").first['Slave_IO_Running']
|
10
|
+
system "#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p '' -r -s"
|
11
|
+
assert_ro($mysql_master.connection, 'original master', true)
|
12
|
+
assert_ro($mysql_slave.connection, 'original slave', false)
|
26
13
|
|
27
|
-
|
28
|
-
assert_ro($mysql_master.connection, 'original master', false)
|
29
|
-
assert_ro($mysql_slave.connection, 'original slave', true)
|
14
|
+
assert "Yes" == $mysql_master.connection.query("show slave status").first['Slave_IO_Running']
|
30
15
|
|
31
|
-
|
32
|
-
|
33
|
-
|
16
|
+
system "#{master_cut_script} 127.0.0.1:#{$mysql_slave.port} 127.0.0.1:#{$mysql_master.port} root -p '' -r"
|
17
|
+
assert_ro($mysql_master.connection, 'original master', false)
|
18
|
+
assert_ro($mysql_slave.connection, 'original slave', true)
|
34
19
|
|
20
|
+
assert "No" == $mysql_slave.connection.query("show slave status").first['Slave_IO_Running']
|
21
|
+
end
|
22
|
+
end
|
@@ -1,37 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
$
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
require_relative "../integration_helper"
|
2
|
+
class WithKillableQueries < Minitest::Test
|
3
|
+
def test_with_queries_to_be_killed
|
4
|
+
puts "testing with long running queries..."
|
5
|
+
|
6
|
+
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
7
|
+
$mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
|
8
|
+
|
9
|
+
thread = Thread.new {
|
10
|
+
begin
|
11
|
+
$mysql_master.connection.query("update flexmaster_test.users set name=sleep(600)")
|
12
|
+
assert false, "Query did not get killed! Bad."
|
13
|
+
exit 1
|
14
|
+
rescue Exception => e
|
15
|
+
puts e
|
16
|
+
end
|
17
|
+
}
|
18
|
+
|
19
|
+
system "#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p ''"
|
20
|
+
|
21
|
+
thread.join
|
22
|
+
|
23
|
+
$mysql_master.reconnect!
|
24
|
+
assert_ro($mysql_master.connection, 'master', true)
|
25
|
+
assert_ro($mysql_slave.connection, 'slave', false)
|
20
26
|
end
|
21
|
-
}
|
22
|
-
|
23
|
-
system "#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p ''"
|
24
|
-
|
25
|
-
thread.join
|
26
|
-
|
27
|
-
if $mysql_master.connection.query("select @@read_only as ro").first['ro'] != 1
|
28
|
-
puts "Master is not readonly!"
|
29
|
-
exit 1
|
30
|
-
end
|
31
|
-
|
32
|
-
if $mysql_slave.connection.query("select @@read_only as ro").first['ro'] != 0
|
33
|
-
puts "Slave is not readwrite!"
|
34
|
-
exit 1
|
35
27
|
end
|
36
|
-
|
37
|
-
puts "everything seemed to go ok..."
|
@@ -1,32 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require_relative "../integration_helper"
|
2
|
+
class WrongSetupTest < Minitest::Test
|
3
|
+
def assert_script_failed
|
4
|
+
assert(!system("#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p ''"))
|
5
|
+
end
|
5
6
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def test_wrong
|
8
|
+
puts "testing cutover with incorrect master config..."
|
9
|
+
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
10
|
+
$mysql_slave.connection.query("set GLOBAL READ_ONLY=0")
|
11
|
+
assert_script_failed
|
12
|
+
|
13
|
+
puts "testing cutover with incorrect slave config..."
|
14
|
+
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
15
|
+
$mysql_slave.connection.query("set GLOBAL READ_ONLY=0")
|
16
|
+
assert_script_failed
|
17
|
+
|
18
|
+
puts "testing cutover with stopped slave"
|
19
|
+
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
20
|
+
$mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
|
21
|
+
$mysql_slave.connection.query("slave stop")
|
22
|
+
assert_script_failed
|
11
23
|
end
|
12
24
|
end
|
13
|
-
|
14
|
-
puts "testing cutover with incorrect master config..."
|
15
|
-
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
16
|
-
$mysql_slave.connection.query("set GLOBAL READ_ONLY=0")
|
17
|
-
assert_script_failed
|
18
|
-
|
19
|
-
puts "testing cutover with incorrect slave config..."
|
20
|
-
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
21
|
-
$mysql_slave.connection.query("set GLOBAL READ_ONLY=0")
|
22
|
-
assert_script_failed
|
23
|
-
|
24
|
-
puts "testing cutover with stopped slave"
|
25
|
-
$mysql_master.connection.query("set GLOBAL READ_ONLY=0")
|
26
|
-
$mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
|
27
|
-
$mysql_slave.connection.query("slave stop")
|
28
|
-
assert_script_failed
|
29
|
-
|
30
|
-
|
31
|
-
puts "Tests passed."
|
32
|
-
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'mysql2'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
if !defined?(Minitest::Test)
|
6
|
+
Minitest::Test = MiniTest::Unit::TestCase
|
7
|
+
end
|
8
|
+
|
9
|
+
require_relative 'boot_mysql_env'
|
10
|
+
|
11
|
+
def assert_ro(cx, str, bool)
|
12
|
+
expected = bool ? 1 : 0
|
13
|
+
assert_equal expected, cx.query("select @@read_only as ro").first['ro'], "#{str} is #{bool ? 'read-write' : 'read-only'} but I expected otherwise!"
|
14
|
+
end
|
15
|
+
|
16
|
+
def master_cut_script
|
17
|
+
File.expand_path(File.dirname(__FILE__)) + "/../bin/master_cut"
|
18
|
+
end
|
19
|
+
|
metadata
CHANGED
@@ -1,112 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_mysql_flexmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ben Osheroff
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-12-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: mysql2
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: activerecord
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: activesupport
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
56
|
+
name: wwtd
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: bump
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: mysql_isolated_server
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
|
-
- - ~>
|
101
|
+
- - "~>"
|
100
102
|
- !ruby/object:Gem::Version
|
101
|
-
version: 0.
|
103
|
+
version: '0.5'
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
|
-
- - ~>
|
108
|
+
- - "~>"
|
108
109
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0.
|
110
|
+
version: '0.5'
|
110
111
|
description: ar_mysql_flexmaster allows configuring N mysql servers in database.yml
|
111
112
|
and auto-selects which is a master at runtime
|
112
113
|
email:
|
@@ -116,21 +117,26 @@ executables:
|
|
116
117
|
extensions: []
|
117
118
|
extra_rdoc_files: []
|
118
119
|
files:
|
119
|
-
- .gitignore
|
120
|
-
- .travis.yml
|
121
|
-
- Appraisals
|
120
|
+
- ".gitignore"
|
121
|
+
- ".travis.yml"
|
122
122
|
- Gemfile
|
123
123
|
- LICENSE
|
124
124
|
- README.md
|
125
125
|
- Rakefile
|
126
126
|
- ar_mysql_flexmaster.gemspec
|
127
127
|
- bin/master_cut
|
128
|
-
- gemfiles/rails2.gemfile
|
129
|
-
- gemfiles/rails2.gemfile.lock
|
128
|
+
- gemfiles/rails2.3.gemfile
|
129
|
+
- gemfiles/rails2.3.gemfile.lock
|
130
|
+
- gemfiles/rails3.0.gemfile
|
131
|
+
- gemfiles/rails3.0.gemfile.lock
|
130
132
|
- gemfiles/rails3.2.gemfile
|
131
133
|
- gemfiles/rails3.2.gemfile.lock
|
132
|
-
- gemfiles/
|
133
|
-
- gemfiles/
|
134
|
+
- gemfiles/rails4.0.gemfile
|
135
|
+
- gemfiles/rails4.0.gemfile.lock
|
136
|
+
- gemfiles/rails4.1.gemfile
|
137
|
+
- gemfiles/rails4.1.gemfile.lock
|
138
|
+
- gemfiles/rails4.2.gemfile
|
139
|
+
- gemfiles/rails4.2.gemfile.lock
|
134
140
|
- lib/active_record/connection_adapters/mysql_flexmaster_adapter.rb
|
135
141
|
- lib/ar_mysql_flexmaster.rb
|
136
142
|
- test/ar_flexmaster_test.rb
|
@@ -141,30 +147,30 @@ files:
|
|
141
147
|
- test/integration/there_and_back_again_test.rb
|
142
148
|
- test/integration/with_queries_to_be_killed_test.rb
|
143
149
|
- test/integration/wrong_setup_test.rb
|
150
|
+
- test/integration_helper.rb
|
144
151
|
- unplanned_failovers.md
|
145
152
|
homepage: http://github.com/osheroff/ar_mysql_flexmaster
|
146
153
|
licenses: []
|
154
|
+
metadata: {}
|
147
155
|
post_install_message:
|
148
156
|
rdoc_options: []
|
149
157
|
require_paths:
|
150
158
|
- lib
|
151
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
-
none: false
|
153
160
|
requirements:
|
154
|
-
- -
|
161
|
+
- - ">="
|
155
162
|
- !ruby/object:Gem::Version
|
156
163
|
version: '0'
|
157
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
-
none: false
|
159
165
|
requirements:
|
160
|
-
- -
|
166
|
+
- - ">="
|
161
167
|
- !ruby/object:Gem::Version
|
162
168
|
version: '0'
|
163
169
|
requirements: []
|
164
170
|
rubyforge_project:
|
165
|
-
rubygems_version:
|
171
|
+
rubygems_version: 2.2.2
|
166
172
|
signing_key:
|
167
|
-
specification_version:
|
173
|
+
specification_version: 4
|
168
174
|
summary: select a master at runtime from a list
|
169
175
|
test_files:
|
170
176
|
- test/ar_flexmaster_test.rb
|
@@ -175,4 +181,4 @@ test_files:
|
|
175
181
|
- test/integration/there_and_back_again_test.rb
|
176
182
|
- test/integration/with_queries_to_be_killed_test.rb
|
177
183
|
- test/integration/wrong_setup_test.rb
|
178
|
-
|
184
|
+
- test/integration_helper.rb
|
data/Appraisals
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
appraise "rails2" do
|
2
|
-
gem "rails", "~> 2.3.15"
|
3
|
-
gem 'mysql2', "~> 0.2.0"
|
4
|
-
end
|
5
|
-
|
6
|
-
appraise "rails3" do
|
7
|
-
gem "rails", "~> 3.0.0"
|
8
|
-
gem 'mysql2', "~> 0.2.0"
|
9
|
-
end
|
10
|
-
|
11
|
-
appraise "rails3.2" do
|
12
|
-
gem "rails", "~> 3.2.0"
|
13
|
-
gem 'mysql2', "~> 0.3.0"
|
14
|
-
end
|
data/gemfiles/rails2.gemfile
DELETED