mirror of https://github.com/postgres/postgres
This GUC allows limiting the time spent waiting to acquire any one heavyweight lock. In support of this, improve the recently-added timeout infrastructure to permit efficiently enabling or disabling multiple timeouts at once. That reduces the performance hit from turning on lock_timeout, though it's still not zero. Zoltán Böszörményi, reviewed by Tom Lane, Stephen Frost, and Hari Babupull/3/head
parent
d2bef5f7db
commit
d43837d030
@ -0,0 +1,73 @@ |
||||
Parsed test spec with 2 sessions |
||||
|
||||
starting permutation: rdtbl sto locktbl |
||||
step rdtbl: SELECT * FROM accounts; |
||||
accountid balance |
||||
|
||||
checking 600 |
||||
savings 600 |
||||
step sto: SET statement_timeout = 1000; |
||||
step locktbl: LOCK TABLE accounts; <waiting ...> |
||||
step locktbl: <... completed> |
||||
ERROR: canceling statement due to statement timeout |
||||
|
||||
starting permutation: rdtbl lto locktbl |
||||
step rdtbl: SELECT * FROM accounts; |
||||
accountid balance |
||||
|
||||
checking 600 |
||||
savings 600 |
||||
step lto: SET lock_timeout = 1000; |
||||
step locktbl: LOCK TABLE accounts; <waiting ...> |
||||
step locktbl: <... completed> |
||||
ERROR: canceling statement due to lock timeout |
||||
|
||||
starting permutation: rdtbl lsto locktbl |
||||
step rdtbl: SELECT * FROM accounts; |
||||
accountid balance |
||||
|
||||
checking 600 |
||||
savings 600 |
||||
step lsto: SET lock_timeout = 1000; SET statement_timeout = 2000; |
||||
step locktbl: LOCK TABLE accounts; <waiting ...> |
||||
step locktbl: <... completed> |
||||
ERROR: canceling statement due to lock timeout |
||||
|
||||
starting permutation: rdtbl slto locktbl |
||||
step rdtbl: SELECT * FROM accounts; |
||||
accountid balance |
||||
|
||||
checking 600 |
||||
savings 600 |
||||
step slto: SET lock_timeout = 2000; SET statement_timeout = 1000; |
||||
step locktbl: LOCK TABLE accounts; <waiting ...> |
||||
step locktbl: <... completed> |
||||
ERROR: canceling statement due to statement timeout |
||||
|
||||
starting permutation: wrtbl sto update |
||||
step wrtbl: UPDATE accounts SET balance = balance + 100; |
||||
step sto: SET statement_timeout = 1000; |
||||
step update: DELETE FROM accounts WHERE accountid = 'checking'; <waiting ...> |
||||
step update: <... completed> |
||||
ERROR: canceling statement due to statement timeout |
||||
|
||||
starting permutation: wrtbl lto update |
||||
step wrtbl: UPDATE accounts SET balance = balance + 100; |
||||
step lto: SET lock_timeout = 1000; |
||||
step update: DELETE FROM accounts WHERE accountid = 'checking'; <waiting ...> |
||||
step update: <... completed> |
||||
ERROR: canceling statement due to lock timeout |
||||
|
||||
starting permutation: wrtbl lsto update |
||||
step wrtbl: UPDATE accounts SET balance = balance + 100; |
||||
step lsto: SET lock_timeout = 1000; SET statement_timeout = 2000; |
||||
step update: DELETE FROM accounts WHERE accountid = 'checking'; <waiting ...> |
||||
step update: <... completed> |
||||
ERROR: canceling statement due to lock timeout |
||||
|
||||
starting permutation: wrtbl slto update |
||||
step wrtbl: UPDATE accounts SET balance = balance + 100; |
||||
step slto: SET lock_timeout = 2000; SET statement_timeout = 1000; |
||||
step update: DELETE FROM accounts WHERE accountid = 'checking'; <waiting ...> |
||||
step update: <... completed> |
||||
ERROR: canceling statement due to statement timeout |
||||
@ -0,0 +1,45 @@ |
||||
# Simple tests for statement_timeout and lock_timeout features |
||||
|
||||
setup |
||||
{ |
||||
CREATE TABLE accounts (accountid text PRIMARY KEY, balance numeric not null); |
||||
INSERT INTO accounts VALUES ('checking', 600), ('savings', 600); |
||||
} |
||||
|
||||
teardown |
||||
{ |
||||
DROP TABLE accounts; |
||||
} |
||||
|
||||
session "s1" |
||||
setup { BEGIN ISOLATION LEVEL READ COMMITTED; } |
||||
step "rdtbl" { SELECT * FROM accounts; } |
||||
step "wrtbl" { UPDATE accounts SET balance = balance + 100; } |
||||
teardown { ABORT; } |
||||
|
||||
session "s2" |
||||
setup { BEGIN ISOLATION LEVEL READ COMMITTED; } |
||||
step "sto" { SET statement_timeout = 1000; } |
||||
step "lto" { SET lock_timeout = 1000; } |
||||
step "lsto" { SET lock_timeout = 1000; SET statement_timeout = 2000; } |
||||
step "slto" { SET lock_timeout = 2000; SET statement_timeout = 1000; } |
||||
step "locktbl" { LOCK TABLE accounts; } |
||||
step "update" { DELETE FROM accounts WHERE accountid = 'checking'; } |
||||
teardown { ABORT; } |
||||
|
||||
# statement timeout, table-level lock |
||||
permutation "rdtbl" "sto" "locktbl" |
||||
# lock timeout, table-level lock |
||||
permutation "rdtbl" "lto" "locktbl" |
||||
# lock timeout expires first, table-level lock |
||||
permutation "rdtbl" "lsto" "locktbl" |
||||
# statement timeout expires first, table-level lock |
||||
permutation "rdtbl" "slto" "locktbl" |
||||
# statement timeout, row-level lock |
||||
permutation "wrtbl" "sto" "update" |
||||
# lock timeout, row-level lock |
||||
permutation "wrtbl" "lto" "update" |
||||
# lock timeout expires first, row-level lock |
||||
permutation "wrtbl" "lsto" "update" |
||||
# statement timeout expires first, row-level lock |
||||
permutation "wrtbl" "slto" "update" |
||||
Loading…
Reference in new issue