ar_mysql_flexmaster 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,34 +1,22 @@
1
- require 'bundler/setup'
2
- require 'mysql2'
3
- require 'test/unit/assertions'
1
+ require_relative "../integration_helper"
4
2
 
5
- include Test::Unit::Assertions
6
- require_relative '../boot_mysql_env'
7
- master_cut_script = File.expand_path(File.dirname(__FILE__)) + "/../../bin/master_cut"
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
- $mysql_master.connection.query("set GLOBAL READ_ONLY=0")
10
- $mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
8
+ puts "testing first cutover..."
11
9
 
12
- def assert_ro(cx, str, bool)
13
- expected = bool ? 1 : 0
14
- if expected != cx.query("select @@read_only as ro").first['ro']
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
- system "#{master_cut_script} 127.0.0.1:#{$mysql_slave.port} 127.0.0.1:#{$mysql_master.port} root -p '' -r"
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
- assert "No" == $mysql_slave.connection.query("show slave status").first['Slave_IO_Running']
32
-
33
- puts "everything went real nice."
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
- require 'bundler/setup'
2
- require 'mysql2'
3
- require_relative '../boot_mysql_env'
4
- master_cut_script = File.expand_path(File.dirname(__FILE__)) + "/../../bin/master_cut"
5
-
6
- puts "testing with long running queries..."
7
-
8
- $mysql_master.connection.query("set GLOBAL READ_ONLY=0")
9
- $mysql_slave.connection.query("set GLOBAL READ_ONLY=1")
10
- $mysql_master.connection.send(:reconnect=, true)
11
- $mysql_slave.connection.send(:reconnect=, true)
12
-
13
- thread = Thread.new {
14
- begin
15
- $mysql_master.connection.query("update flexmaster_test.users set name=sleep(600)")
16
- puts "Query did not get killed! Bad."
17
- exit 1
18
- rescue Exception => e
19
- puts e
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
- require 'bundler/setup'
2
- require 'mysql2'
3
- require_relative '../boot_mysql_env'
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 assert_script_failed
7
- master_cut_script = File.expand_path(File.dirname(__FILE__)) + "/../../bin/master_cut"
8
- if system "#{master_cut_script} 127.0.0.1:#{$mysql_master.port} 127.0.0.1:#{$mysql_slave.port} root -p ''"
9
- puts "Script returned ok instead of false!"
10
- exit 1
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.4.4
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: 2013-06-15 00:00:00.000000000 Z
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: appraisal
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.1.1
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.1.1
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/rails3.gemfile
133
- - gemfiles/rails3.gemfile.lock
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: 1.8.25
171
+ rubygems_version: 2.2.2
166
172
  signing_key:
167
- specification_version: 3
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
- has_rdoc:
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
@@ -1,10 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "debugger", "~>1.5.0"
6
- gem "appraisal"
7
- gem "rails", "~> 2.3.15"
8
- gem "mysql2", "~> 0.2.0"
9
-
10
- gemspec :path=>"../"
@@ -1,10 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "debugger", "~>1.5.0"
6
- gem "appraisal"
7
- gem "rails", "~> 3.0.0"
8
- gem "mysql2", "~> 0.2.0"
9
-
10
- gemspec :path=>"../"