aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/adapters/postgresql
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2017-11-11 19:53:40 +0900
committerRyuta Kamizono <kamipo@gmail.com>2017-11-11 19:53:40 +0900
commit4a65dfcb9adae8fb12a86521c1a34b392e6084c2 (patch)
treeb5c97722ffc168327b5fc594a1c8620b5437edcd /activerecord/test/cases/adapters/postgresql
parentee5cf14ab06c366b37a6339f2af7c41457b3557b (diff)
downloadrails-4a65dfcb9adae8fb12a86521c1a34b392e6084c2.tar.gz
rails-4a65dfcb9adae8fb12a86521c1a34b392e6084c2.tar.bz2
rails-4a65dfcb9adae8fb12a86521c1a34b392e6084c2.zip
Raise `TransactionTimeout` when lock wait timeout exceeded for PG adapter
Follow up of #30360.
Diffstat (limited to 'activerecord/test/cases/adapters/postgresql')
-rw-r--r--activerecord/test/cases/adapters/postgresql/transaction_test.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/activerecord/test/cases/adapters/postgresql/transaction_test.rb b/activerecord/test/cases/adapters/postgresql/transaction_test.rb
index f56adf4a5e..b6aec8e993 100644
--- a/activerecord/test/cases/adapters/postgresql/transaction_test.rb
+++ b/activerecord/test/cases/adapters/postgresql/transaction_test.rb
@@ -91,6 +91,35 @@ module ActiveRecord
end
end
+ test "raises TransactionTimeout when lock wait timeout exceeded" do
+ skip unless ActiveRecord::Base.connection.postgresql_version >= 90300
+ assert_raises(ActiveRecord::TransactionTimeout) do
+ s = Sample.create!(value: 1)
+ latch1 = Concurrent::CountDownLatch.new
+ latch2 = Concurrent::CountDownLatch.new
+
+ thread = Thread.new do
+ Sample.transaction do
+ Sample.lock.find(s.id)
+ latch1.count_down
+ latch2.wait
+ end
+ end
+
+ begin
+ Sample.transaction do
+ latch1.wait
+ Sample.connection.execute("SET lock_timeout = 1")
+ Sample.lock.find(s.id)
+ end
+ ensure
+ Sample.connection.execute("SET lock_timeout = DEFAULT")
+ latch2.count_down
+ thread.join
+ end
+ end
+ end
+
private
def with_warning_suppression