ar_mysql_flexmaster 0.4.2 → 0.4.3

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.
@@ -12,7 +12,7 @@ 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.4.2"
15
+ gem.version = "0.4.3"
16
16
 
17
17
  gem.add_runtime_dependency("mysql2")
18
18
  gem.add_runtime_dependency("activerecord")
@@ -68,6 +68,15 @@ module ActiveRecord
68
68
  end
69
69
  end
70
70
 
71
+ # after a cluster recovers from a bad state, an insert or SELECT will bring us back
72
+ # into sanity, but sometimes would we never get there and would get stuck crashing in this function instead.
73
+ def quote(*args)
74
+ if !@connection
75
+ soft_verify
76
+ end
77
+ super
78
+ end
79
+
71
80
  def current_host
72
81
  @connection.query_options[:host]
73
82
  end
@@ -191,25 +191,52 @@ class TestArFlexmaster < Test::Unit::TestCase
191
191
  ActiveRecord::Base.configurations["test"]["hosts"].pop
192
192
  end
193
193
 
194
- def test_shooting_the_master_in_the_head
194
+ def test_limping_along_with_a_slave_acting_as_a_master
195
195
  User.create!
196
- UserSlave.first
197
-
198
196
  $mysql_master.down!
199
197
 
200
- # protected against 'gone away' errors?
201
- assert User.first
198
+ # the test here is that even though we've asserted we want the master,
199
+ # since we're doing a SELECT we'll stay limping along by running the SELECT on a slave instead.
200
+ User.first
201
+
202
+ assert [$mysql_slave, $mysql_slave_2].include?(master_connection)
203
+ ensure
204
+ $mysql_master.up!
205
+ end
206
+
207
+ def test_recovering_after_losing_connection_to_the_master
208
+ User.create!
209
+ assert User.connection.instance_variable_get("@connection")
202
210
 
203
- # this statement should
204
- # put us into a bad state -- our @connection should be nil, as we'll fail to get a master connection
211
+ $mysql_master.down!
212
+ # trying to do an INSERT with the master down puts is into a precious state --
213
+ # we've got a nil @connection object. There's two possible solutions here;
214
+ #
215
+ # 1 - substitute a slave connection in for the master object but raise an exception anyway
216
+ # 2 - deal with a nil connection object later
217
+ #
218
+ # opting for (2) now
219
+ #
205
220
  assert_raises(ActiveRecord::ConnectionAdapters::MysqlFlexmasterAdapter::NoServerAvailableException) do
206
221
  User.create!
207
222
  end
208
223
 
209
- # now test that the next time through we ask for a read connection, we'll grudgingly give back the slave
210
- User.first
224
+ assert_equal nil, User.connection.instance_variable_get("@connection")
211
225
 
212
- assert [$mysql_slave, $mysql_slave_2].include?(master_connection)
226
+ # this proxies to @connection and has been the cause of some crashes
227
+ assert User.connection.quote("foo")
228
+ ensure
229
+ $mysql_master.up!
230
+ end
231
+
232
+ def test_recovering_after_the_master_is_back_up
233
+ User.create!
234
+ $mysql_master.down!
235
+
236
+ assert_raises(ActiveRecord::ConnectionAdapters::MysqlFlexmasterAdapter::NoServerAvailableException) do
237
+ User.create!
238
+ end
239
+ # bad state again.
213
240
 
214
241
  # now a dba or someone comes along and flips the read-only bit on the slave
215
242
  $mysql_slave.set_rw(true)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_mysql_flexmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: