ar_mysql_flexmaster 0.6.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d979b832a9129feb067d6993efc2ac5fc58ae92
4
- data.tar.gz: 600daab5842bf3edebc12e17ede751032b3c3c53
3
+ metadata.gz: 2b32c2b9162fc4959df4858f60552cbfd4fbfdff
4
+ data.tar.gz: 1e5f07d3984485add95bb95af4b8e690660746c5
5
5
  SHA512:
6
- metadata.gz: 20975216d3400b8755321d8e9de0f506e3a661de0e698fb9e89f54ec647017700c9596b3f341a0acd7b059d4721d10b129b4af3439b5c9ff3eece408f6ea153b
7
- data.tar.gz: eedcce97ab154e6b2886fd51cf8cda509b3e77b382ccd84df9333e66805ed3b4a2da79ed2d274f9f1c880fbf69700fbec842719d34eaa749fd19f4d3f8e7c211
6
+ metadata.gz: fc8509dfa2ab7a83421f483a68c533e41804519ad93f4e07dd89f98a0b5e4d5f4958faae57f159235c3c4201dc4f542bfd58d6411894b3522e4108124d48f4a8
7
+ data.tar.gz: 1f4328dec6136634e150ed7fdc47e907fc91a7b463d1ab42a568aee67ec1644cc844fdc7f6ae83c912052a364d90b63313e6913303a9ff799cfe561f9cdf404b
@@ -12,13 +12,15 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "ar_mysql_flexmaster"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = "0.6.0"
15
+ gem.version = "1.0.0"
16
16
 
17
17
  gem.add_runtime_dependency("mysql2")
18
18
  gem.add_runtime_dependency("activerecord")
19
19
  gem.add_runtime_dependency("activesupport")
20
20
  gem.add_development_dependency("wwtd")
21
21
  gem.add_development_dependency("minitest")
22
+ gem.add_development_dependency("mocha", "~> 1.1.0")
22
23
  gem.add_development_dependency("bump")
24
+ gem.add_development_dependency("pry")
23
25
  gem.add_development_dependency("mysql_isolated_server", "~> 0.5")
24
26
  end
@@ -35,8 +35,8 @@ def usage
35
35
  end
36
36
 
37
37
  $old_master, $new_master, $username = *ARGV
38
- unless $old_master && $new_master && $username
39
- usage
38
+ unless $old_master && $new_master && $username
39
+ usage
40
40
  end
41
41
 
42
42
 
@@ -47,11 +47,11 @@ def open_cx(host)
47
47
  end
48
48
 
49
49
  def set_rw(cx)
50
- cx.query("SET GLOBAL READ_ONLY=0")
50
+ cx.query("SET GLOBAL READ_ONLY=0")
51
51
  end
52
52
 
53
53
  def set_ro(cx)
54
- cx.query("SET GLOBAL READ_ONLY=1")
54
+ cx.query("SET GLOBAL READ_ONLY=1")
55
55
  end
56
56
 
57
57
  $swapped_ok = false
@@ -85,20 +85,20 @@ def preflight_check
85
85
  slave_info = slave_cx.query("show slave status").first
86
86
  fail("no slave configured!") if slave_info.nil?
87
87
  fail("slave is stopped!") unless slave_info['Slave_IO_Running'] == 'Yes' && slave_info['Slave_SQL_Running'] == 'Yes'
88
- fail("slave is delayed") if slave_info['Seconds_Behind_Master'].nil? || slave_info['Seconds_Behind_Master'] > 0
88
+ fail("slave is delayed") if slave_info['Seconds_Behind_Master'].nil? || slave_info['Seconds_Behind_Master'] > 0
89
89
 
90
90
  masters_slave_info = cx.query("show slave status").first
91
91
  if $rehome_master && (masters_slave_info.nil? || masters_slave_info['Master_User'] == 'test')
92
92
  fail("I can't rehome the original master -- it has no slave user or password.")
93
93
  end
94
-
94
+
95
95
  master_ip, slave_master_ip = [$old_master, slave_info['Master_Host']].map do |h|
96
96
  h = h.split(':').first
97
- Socket.gethostbyname(h)[3].unpack("CCCC")
97
+ Socket.gethostbyname(h)[3].unpack("CCCC")
98
98
  end
99
99
 
100
100
  if master_ip != slave_master_ip
101
- fail("slave does not appear to be replicating off master! (master: #{master_ip.join('.')}, slave's master: #{slave_master_ip.join('.')})")
101
+ fail("slave does not appear to be replicating off master! (master: #{master_ip.join('.')}, slave's master: #{slave_master_ip.join('.')})")
102
102
  end
103
103
  end
104
104
 
@@ -122,24 +122,24 @@ end
122
122
 
123
123
  def kill_query!(cx, id)
124
124
  begin
125
- cx.query("kill #{id}")
125
+ cx.query("kill #{id}")
126
126
  rescue Mysql2::Error => e
127
127
  raise e unless e.errno == 1094 # unknown thread id error
128
128
  end
129
129
  end
130
130
 
131
131
  def swap_thread
132
- Thread.new do
132
+ Thread.new do
133
133
  master = open_cx($old_master)
134
134
  slave = open_cx($new_master)
135
135
  set_ro(master)
136
- slave.query("slave stop")
136
+ slave.query("STOP SLAVE")
137
137
  new_master_info = slave.query("show master status").first
138
138
  set_rw(slave)
139
139
  $swapped_ok = true
140
140
  puts "Swapped #{$old_master} and #{$new_master}"
141
141
  puts "New master information at time of swap: "
142
- pp new_master_info
142
+ pp new_master_info
143
143
  if $rehome_master
144
144
  rehome_master(new_master_info, $start_slave)
145
145
  end
@@ -153,18 +153,15 @@ def rehome_master(info, start_slave)
153
153
  port_clause = port ? "master_port = #{port}," : ""
154
154
  cx = open_cx($old_master)
155
155
  cx.query("change master to master_host='#{host}', #{port_clause} master_log_file = '#{info['File']}', master_log_pos=#{info['Position']}")
156
- cx.query("slave start") if start_slave
156
+ cx.query("START SLAVE") if start_slave
157
157
  end
158
158
 
159
159
  ask_for_password
160
160
  preflight_check
161
161
 
162
162
  threads = []
163
- threads << process_kill_thread
164
163
  threads << swap_thread
164
+ threads << process_kill_thread
165
165
  threads.each(&:join)
166
166
 
167
167
  rehome_master
168
-
169
-
170
-
@@ -2,6 +2,7 @@ require 'bundler/setup'
2
2
  require 'ar_mysql_flexmaster'
3
3
  require 'active_record'
4
4
  require 'minitest/autorun'
5
+ require 'mocha/mini_test'
5
6
 
6
7
  if !defined?(Minitest::Test)
7
8
  Minitest::Test = MiniTest::Unit::TestCase
@@ -286,6 +287,18 @@ class TestArFlexmaster < Minitest::Test
286
287
  $mysql_slave_2.up!
287
288
  end
288
289
 
290
+ def test_connection_multiple_attempts
291
+ # We're simulating connection timeout, so mocha's Expectation#times doesn't register the calls
292
+ attempts = 0
293
+ null_logger = Logger.new('/dev/null')
294
+ config = { hosts: ['localhost'], connection_timeout: 0.01, connection_attempts: 5 }
295
+
296
+ Mysql2::Client.stubs(:new).with { attempts += 1; sleep 1 }
297
+ assert_raises(ActiveRecord::ConnectionAdapters::MysqlFlexmasterAdapter::NoServerAvailableException) do
298
+ ActiveRecord::ConnectionAdapters::MysqlFlexmasterAdapter.new(null_logger, config)
299
+ end
300
+ assert_equal 5, attempts
301
+ end
289
302
 
290
303
  private
291
304
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_mysql_flexmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Osheroff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-30 00:00:00.000000000 Z
11
+ date: 2015-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mysql2
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.1.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.1.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bump
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: mysql_isolated_server
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -168,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
196
  version: '0'
169
197
  requirements: []
170
198
  rubyforge_project:
171
- rubygems_version: 2.2.2
199
+ rubygems_version: 2.4.5.1
172
200
  signing_key:
173
201
  specification_version: 4
174
202
  summary: select a master at runtime from a list