mirror of https://github.com/postgres/postgres
This test covers a few lines of subxid-overflow-handling code in various part of the backend, which are otherwise uncovered. Author: Simon Riggs <simon.riggs@enterprisedb.com> Reviewed-by: Dilip Kumar <dilipbalaut@gmail.com> Discussion: https://postgr.es/m/CANbhV-H8ov5+nCMBYQFKhO+UZJjrFgY_ORiMWr3RhS4+x44PzA@mail.gmail.compull/104/head
parent
3fd1f4b9cd
commit
0e733278e3
@ -0,0 +1,82 @@ |
||||
Parsed test spec with 3 sessions |
||||
|
||||
starting permutation: ins subxov xmax s2sel s1c |
||||
step ins: TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); |
||||
step subxov: BEGIN; SELECT gen_subxids(100); |
||||
gen_subxids |
||||
----------- |
||||
|
||||
(1 row) |
||||
|
||||
step xmax: BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT; |
||||
step s2sel: SELECT val FROM subxids WHERE subx = 0; |
||||
val |
||||
--- |
||||
0 |
||||
(1 row) |
||||
|
||||
step s1c: COMMIT; |
||||
|
||||
starting permutation: ins subxov sub3 xmax s2brr s2s3 s3c s2s3 s2c s1c |
||||
step ins: TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); |
||||
step subxov: BEGIN; SELECT gen_subxids(100); |
||||
gen_subxids |
||||
----------- |
||||
|
||||
(1 row) |
||||
|
||||
step sub3: BEGIN; SAVEPOINT s; INSERT INTO subxids VALUES (1, 0); |
||||
step xmax: BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT; |
||||
step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; |
||||
step s2s3: SELECT val FROM subxids WHERE subx = 1; |
||||
val |
||||
--- |
||||
(0 rows) |
||||
|
||||
step s3c: COMMIT; |
||||
step s2s3: SELECT val FROM subxids WHERE subx = 1; |
||||
val |
||||
--- |
||||
(0 rows) |
||||
|
||||
step s2c: COMMIT; |
||||
step s1c: COMMIT; |
||||
|
||||
starting permutation: ins subxov sub3 xmax s2brc s2s3 s3c s2s3 s2c s1c |
||||
step ins: TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); |
||||
step subxov: BEGIN; SELECT gen_subxids(100); |
||||
gen_subxids |
||||
----------- |
||||
|
||||
(1 row) |
||||
|
||||
step sub3: BEGIN; SAVEPOINT s; INSERT INTO subxids VALUES (1, 0); |
||||
step xmax: BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT; |
||||
step s2brc: BEGIN ISOLATION LEVEL READ COMMITTED; |
||||
step s2s3: SELECT val FROM subxids WHERE subx = 1; |
||||
val |
||||
--- |
||||
(0 rows) |
||||
|
||||
step s3c: COMMIT; |
||||
step s2s3: SELECT val FROM subxids WHERE subx = 1; |
||||
val |
||||
--- |
||||
0 |
||||
(1 row) |
||||
|
||||
step s2c: COMMIT; |
||||
step s1c: COMMIT; |
||||
|
||||
starting permutation: ins subxov xmax s2upd s1c |
||||
step ins: TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); |
||||
step subxov: BEGIN; SELECT gen_subxids(100); |
||||
gen_subxids |
||||
----------- |
||||
|
||||
(1 row) |
||||
|
||||
step xmax: BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT; |
||||
step s2upd: UPDATE subxids SET val = 1 WHERE subx = 0; <waiting ...> |
||||
step s1c: COMMIT; |
||||
step s2upd: <... completed> |
@ -0,0 +1,79 @@ |
||||
# Subtransaction overflow |
||||
# |
||||
# This test is designed to cover some code paths which only occur when |
||||
# one transaction has overflowed the subtransaction cache. |
||||
|
||||
setup |
||||
{ |
||||
DROP TABLE IF EXISTS subxids; |
||||
CREATE TABLE subxids (subx integer, val integer); |
||||
|
||||
CREATE OR REPLACE FUNCTION gen_subxids (n integer) |
||||
RETURNS VOID |
||||
LANGUAGE plpgsql |
||||
AS $$ |
||||
BEGIN |
||||
IF n <= 0 THEN |
||||
UPDATE subxids SET val = 1 WHERE subx = 0; |
||||
RETURN; |
||||
ELSE |
||||
PERFORM gen_subxids(n - 1); |
||||
RETURN; |
||||
END IF; |
||||
EXCEPTION /* generates a subxid */ |
||||
WHEN raise_exception THEN NULL; |
||||
END; |
||||
$$; |
||||
} |
||||
|
||||
teardown |
||||
{ |
||||
DROP TABLE subxids; |
||||
DROP FUNCTION gen_subxids(integer); |
||||
} |
||||
|
||||
session s1 |
||||
# setup step for each test |
||||
step ins { TRUNCATE subxids; INSERT INTO subxids VALUES (0, 0); } |
||||
# long running transaction with overflowed subxids |
||||
step subxov { BEGIN; SELECT gen_subxids(100); } |
||||
# commit should always come last to make this long running |
||||
step s1c { COMMIT; } |
||||
|
||||
session s2 |
||||
# move xmax forwards |
||||
step xmax { BEGIN; INSERT INTO subxids VALUES (99, 0); COMMIT;} |
||||
|
||||
# step for test1 |
||||
step s2sel { SELECT val FROM subxids WHERE subx = 0; } |
||||
|
||||
# steps for test2 |
||||
step s2brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } |
||||
step s2brc { BEGIN ISOLATION LEVEL READ COMMITTED; } |
||||
# look for data written by sub3 |
||||
step s2s3 { SELECT val FROM subxids WHERE subx = 1; } |
||||
step s2c { COMMIT; } |
||||
|
||||
# step for test3 |
||||
step s2upd { UPDATE subxids SET val = 1 WHERE subx = 0; } |
||||
|
||||
session s3 |
||||
# transaction with subxids that can commit before s1c |
||||
step sub3 { BEGIN; SAVEPOINT s; INSERT INTO subxids VALUES (1, 0); } |
||||
step s3c { COMMIT; } |
||||
|
||||
# test1 |
||||
# s2sel will see subxid as still running |
||||
# designed to test XidInMVCCSnapshot() when overflows, xid is found |
||||
permutation ins subxov xmax s2sel s1c |
||||
|
||||
# test2 |
||||
# designed to test XidInMVCCSnapshot() when overflows, xid is not found |
||||
# both SELECTs invisible |
||||
permutation ins subxov sub3 xmax s2brr s2s3 s3c s2s3 s2c s1c |
||||
# 2nd SELECT visible after commit |
||||
permutation ins subxov sub3 xmax s2brc s2s3 s3c s2s3 s2c s1c |
||||
|
||||
# test3 |
||||
# designed to test XactLockTableWait() for overflows |
||||
permutation ins subxov xmax s2upd s1c |
Loading…
Reference in new issue