diff options
| author | Tom Lane | 2013-03-17 03:22:17 +0000 |
|---|---|---|
| committer | Tom Lane | 2013-03-17 03:22:57 +0000 |
| commit | d43837d03067487560af481474ae985df894f786 (patch) | |
| tree | 7289d038a184fa3dc59195aaa27538714ea85ad9 /src/test/isolation | |
| parent | d2bef5f7db5f3afdbbb3f58b8eff49f0bc7ef790 (diff) | |
Add lock_timeout configuration parameter.
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 Babu
Diffstat (limited to 'src/test/isolation')
| -rw-r--r-- | src/test/isolation/expected/timeouts.out | 73 | ||||
| -rw-r--r-- | src/test/isolation/isolation_schedule | 1 | ||||
| -rw-r--r-- | src/test/isolation/specs/timeouts.spec | 45 |
3 files changed, 119 insertions, 0 deletions
diff --git a/src/test/isolation/expected/timeouts.out b/src/test/isolation/expected/timeouts.out new file mode 100644 index 00000000000..0ad792ae098 --- /dev/null +++ b/src/test/isolation/expected/timeouts.out @@ -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 diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index c4d6719de6d..081e11f2a1e 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -20,3 +20,4 @@ test: delete-abort-savept test: delete-abort-savept-2 test: aborted-keyrevoke test: drop-index-concurrently-1 +test: timeouts diff --git a/src/test/isolation/specs/timeouts.spec b/src/test/isolation/specs/timeouts.spec new file mode 100644 index 00000000000..000b50c9c92 --- /dev/null +++ b/src/test/isolation/specs/timeouts.spec @@ -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" |
