diff options
author | eileencodes <eileencodes@gmail.com> | 2019-08-02 12:04:38 -0400 |
---|---|---|
committer | eileencodes <eileencodes@gmail.com> | 2019-08-02 12:10:32 -0400 |
commit | f2de448106ca3bb947dc88f96ca7d81d37b5be9a (patch) | |
tree | 4a12db093039c6d9546d37668a53996e80e54e61 /activerecord/test | |
parent | f3c68c59ed57302ca54f4dfad0e91dbff426962d (diff) | |
download | rails-f2de448106ca3bb947dc88f96ca7d81d37b5be9a.tar.gz rails-f2de448106ca3bb947dc88f96ca7d81d37b5be9a.tar.bz2 rails-f2de448106ca3bb947dc88f96ca7d81d37b5be9a.zip |
Add ability to unset preventing writes
Previously if an app attempts to do a write inside a read request it will be
impossilbe to switch back to writing to the primary. This PR adds an
argument to the `while_preventing_writes` so that we can make sure to
turn it off if we're doing a write on a primary.
Fixes #36830
Co-authored-by: John Crepezzi <john.crepezzi@gmail.com>
Diffstat (limited to 'activerecord/test')
-rw-r--r-- | activerecord/test/cases/database_selector_test.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/activerecord/test/cases/database_selector_test.rb b/activerecord/test/cases/database_selector_test.rb index fd02d2acb4..340151e6db 100644 --- a/activerecord/test/cases/database_selector_test.rb +++ b/activerecord/test/cases/database_selector_test.rb @@ -123,6 +123,40 @@ module ActiveRecord assert read end + def test_preventing_writes_turns_off_for_primary_write + resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 5.seconds) + + # Session should start empty + assert_nil @session_store[:last_write] + + called = false + resolver.write do + assert ActiveRecord::Base.connected_to?(role: :writing) + called = true + end + assert called + + # and be populated by the last write time + assert @session_store[:last_write] + + read = false + write = false + resolver.read do + assert ActiveRecord::Base.connected_to?(role: :writing) + assert ActiveRecord::Base.connection_handler.prevent_writes + read = true + + resolver.write do + assert ActiveRecord::Base.connected_to?(role: :writing) + assert_not ActiveRecord::Base.connection_handler.prevent_writes + write = true + end + end + + assert write + assert read + end + def test_read_from_replica_with_no_delay resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver.new(@session, delay: 0.seconds) |