mirror of
https://github.com/github/rails.git
synced 2026-01-09 14:48:01 -05:00
Backport PostgreSQL auto-reconnect test coverage
6d5f4de4c420ebb906109668f5702a537ac77692 Simulated & actual (manual/skipped) PostgreSQL auto-reconnection tests. 4b1bca04025a66c54e6e9d5eb6e4d4056bfa92f0 Stop being silly with formatting of method aliasing. c381d5cbf959208adeb38e7859ee815dfbd2cf54 Fix just-plain-wrongness of psql auto-reconnect test. 1e17a9d367c54c680368be72f44247ae28b98904 Fix only-once stub logic. f16c2043826ec1991cf94fe17cb671507b7a7f51 Changelog for PostgreSQL auto-reconnect test coverage backport.
This commit is contained in:
@@ -1,4 +1,9 @@
|
||||
## Rails 3.2.9 (unreleased)
|
||||
* Backport test coverage to ensure that PostgreSQL auto-reconnect functionality
|
||||
remains healthy.
|
||||
|
||||
*Steve Jorgensen
|
||||
|
||||
* Use config['encoding'] instead of config['charset'] when executing
|
||||
databases.rake in the mysql/mysql2. A correct option for a database.yml
|
||||
is 'encoding'.
|
||||
|
||||
@@ -354,6 +354,7 @@ module ActiveRecord
|
||||
def reconnect!
|
||||
clear_cache!
|
||||
@connection.reset
|
||||
@open_transactions = 0
|
||||
configure_connection
|
||||
end
|
||||
|
||||
|
||||
@@ -10,5 +10,79 @@ module ActiveRecord
|
||||
def test_encoding
|
||||
assert_not_nil @connection.encoding
|
||||
end
|
||||
|
||||
def test_reconnection_after_simulated_disconnection_with_verify
|
||||
assert @connection.active?
|
||||
original_connection_pid = @connection.query('select pg_backend_pid()')
|
||||
|
||||
# Fail with bad connection on next query attempt.
|
||||
raw_connection = @connection.raw_connection
|
||||
raw_connection_class = class << raw_connection ; self ; end
|
||||
raw_connection_class.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
||||
def query_fake(*args)
|
||||
if !( @called ||= false )
|
||||
self.stubs(:status).returns(PGconn::CONNECTION_BAD)
|
||||
@called = true
|
||||
raise PGError
|
||||
else
|
||||
self.unstub(:status)
|
||||
query_unfake(*args)
|
||||
end
|
||||
end
|
||||
|
||||
alias query_unfake query
|
||||
alias query query_fake
|
||||
CODE
|
||||
|
||||
begin
|
||||
@connection.verify!
|
||||
new_connection_pid = @connection.query('select pg_backend_pid()')
|
||||
ensure
|
||||
raw_connection_class.class_eval <<-CODE
|
||||
alias query query_unfake
|
||||
undef query_fake
|
||||
CODE
|
||||
end
|
||||
|
||||
assert_not_equal original_connection_pid, new_connection_pid, "Should have a new underlying connection pid"
|
||||
end
|
||||
|
||||
# Must have with_manual_interventions set to true for this
|
||||
# test to run.
|
||||
# When prompted, restart the PostgreSQL server with the
|
||||
# "-m fast" option or kill the individual connection assuming
|
||||
# you know the incantation to do that.
|
||||
# To restart PostgreSQL 9.1 on OS X, installed via MacPorts, ...
|
||||
# sudo su postgres -c "pg_ctl restart -D /opt/local/var/db/postgresql91/defaultdb/ -m fast"
|
||||
def test_reconnection_after_actual_disconnection_with_verify
|
||||
skip "with_manual_interventions is false in configuration" unless ARTest.config['with_manual_interventions']
|
||||
|
||||
original_connection_pid = @connection.query('select pg_backend_pid()')
|
||||
|
||||
# Sanity check.
|
||||
assert @connection.active?
|
||||
|
||||
puts 'Kill the connection now (e.g. by restarting the PostgreSQL ' +
|
||||
'server with the "-m fast" option) and then press enter.'
|
||||
$stdin.gets
|
||||
|
||||
@connection.verify!
|
||||
|
||||
assert @connection.active?
|
||||
|
||||
# If we get no exception here, then either we re-connected successfully, or
|
||||
# we never actually got disconnected.
|
||||
new_connection_pid = @connection.query('select pg_backend_pid()')
|
||||
|
||||
assert_not_equal original_connection_pid, new_connection_pid,
|
||||
"umm -- looks like you didn't break the connection, because we're still " +
|
||||
"successfully querying with the same connection pid."
|
||||
|
||||
# Repair all fixture connections so other tests won't break.
|
||||
@fixture_connections.each do |c|
|
||||
c.verify!
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
default_connection: <%= defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3' %>
|
||||
|
||||
with_manual_interventions: false
|
||||
|
||||
connections:
|
||||
jdbcderby:
|
||||
arunit: activerecord_unittest
|
||||
|
||||
Reference in New Issue
Block a user