mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Fix thinko in lock mode enum
Commit 0e5680f4737a9c6aa94aa9e77543e5de60411322 contained a thinko mixing LOCKMODE with LockTupleMode. This caused misbehavior in the case where a tuple is marked with a multixact with at most a FOR SHARE lock, and another transaction tries to acquire a FOR NO KEY EXCLUSIVE lock; this case should block but doesn't. Include a new isolation tester spec file to explicitely try all the tuple lock combinations; without the fix it shows the problem: starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock3 s1_commit step s1_begin: BEGIN; step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; a 1 step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; a 1 step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; a 1 step s1_commit: COMMIT; With the fixed code, step s2_tuplock3 blocks until session 1 commits, which is the correct behavior. All other cases behave correctly. Backpatch to 9.3, like the commit that introduced the problem.
This commit is contained in:
parent
2ea95959af
commit
d5e3d1e969
@ -6102,6 +6102,7 @@ DoesMultiXactIdConflict(MultiXactId multi, uint16 infomask,
|
|||||||
int nmembers;
|
int nmembers;
|
||||||
MultiXactMember *members;
|
MultiXactMember *members;
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
LOCKMODE wanted = tupleLockExtraInfo[lockmode].hwlock;
|
||||||
|
|
||||||
allow_old = !(infomask & HEAP_LOCK_MASK) && HEAP_XMAX_IS_LOCKED_ONLY(infomask);
|
allow_old = !(infomask & HEAP_LOCK_MASK) && HEAP_XMAX_IS_LOCKED_ONLY(infomask);
|
||||||
nmembers = GetMultiXactIdMembers(multi, &members, allow_old,
|
nmembers = GetMultiXactIdMembers(multi, &members, allow_old,
|
||||||
@ -6113,11 +6114,12 @@ DoesMultiXactIdConflict(MultiXactId multi, uint16 infomask,
|
|||||||
for (i = 0; i < nmembers; i++)
|
for (i = 0; i < nmembers; i++)
|
||||||
{
|
{
|
||||||
TransactionId memxid;
|
TransactionId memxid;
|
||||||
LockTupleMode memlockmode;
|
LOCKMODE memlockmode;
|
||||||
|
|
||||||
memlockmode = LOCKMODE_from_mxstatus(members[i].status);
|
memlockmode = LOCKMODE_from_mxstatus(members[i].status);
|
||||||
|
|
||||||
/* ignore members that don't conflict with the lock we want */
|
/* ignore members that don't conflict with the lock we want */
|
||||||
if (!DoLockModesConflict(memlockmode, lockmode))
|
if (!DoLockModesConflict(memlockmode, wanted))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* ignore members from current xact */
|
/* ignore members from current xact */
|
||||||
|
469
src/test/isolation/expected/tuplelock-conflict.out
Normal file
469
src/test/isolation/expected/tuplelock-conflict.out
Normal file
@ -0,0 +1,469 @@
|
|||||||
|
Parsed test spec with 2 sessions
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock2: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock1: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock2: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock1 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock1 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock1 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock1 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock2 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock2 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock2 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock2 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock3 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock3 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock2: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock3 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock3 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock4 s2_tuplock1 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock1: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock4 s2_tuplock2 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock2: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock4 s2_tuplock3 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock3: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
|
||||||
|
starting permutation: s1_begin s1_tuplock4 s2_tuplock4 s1_commit
|
||||||
|
step s1_begin: BEGIN;
|
||||||
|
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
||||||
|
step s2_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; <waiting ...>
|
||||||
|
step s1_commit: COMMIT;
|
||||||
|
step s2_tuplock4: <... completed>
|
||||||
|
a
|
||||||
|
|
||||||
|
1
|
@ -22,6 +22,7 @@ test: aborted-keyrevoke
|
|||||||
test: multixact-no-deadlock
|
test: multixact-no-deadlock
|
||||||
test: multixact-no-forget
|
test: multixact-no-forget
|
||||||
test: propagate-lock-delete
|
test: propagate-lock-delete
|
||||||
|
test: tuplelock-conflict
|
||||||
test: nowait
|
test: nowait
|
||||||
test: nowait-2
|
test: nowait-2
|
||||||
test: nowait-3
|
test: nowait-3
|
||||||
|
63
src/test/isolation/specs/tuplelock-conflict.spec
Normal file
63
src/test/isolation/specs/tuplelock-conflict.spec
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Here we verify that tuple lock levels conform to their documented
|
||||||
|
# conflict tables.
|
||||||
|
|
||||||
|
setup {
|
||||||
|
DROP TABLE IF EXISTS multixact_conflict;
|
||||||
|
CREATE TABLE multixact_conflict (a int primary key);
|
||||||
|
INSERT INTO multixact_conflict VALUES (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown {
|
||||||
|
DROP TABLE multixact_conflict;
|
||||||
|
}
|
||||||
|
|
||||||
|
session "s1"
|
||||||
|
step "s1_begin" { BEGIN; }
|
||||||
|
step "s1_lcksvpt" { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; }
|
||||||
|
step "s1_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; }
|
||||||
|
step "s1_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; }
|
||||||
|
step "s1_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; }
|
||||||
|
step "s1_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; }
|
||||||
|
step "s1_commit" { COMMIT; }
|
||||||
|
|
||||||
|
session "s2"
|
||||||
|
step "s2_tuplock1" { SELECT * FROM multixact_conflict FOR KEY SHARE; }
|
||||||
|
step "s2_tuplock2" { SELECT * FROM multixact_conflict FOR SHARE; }
|
||||||
|
step "s2_tuplock3" { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; }
|
||||||
|
step "s2_tuplock4" { SELECT * FROM multixact_conflict FOR UPDATE; }
|
||||||
|
|
||||||
|
# The version with savepoints test the multixact cases
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock1" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock2" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock3" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_lcksvpt" "s1_tuplock4" "s2_tuplock4" "s1_commit"
|
||||||
|
|
||||||
|
# no multixacts here
|
||||||
|
permutation "s1_begin" "s1_tuplock1" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock1" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock1" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock1" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock2" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock2" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock2" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock2" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock3" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock3" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock3" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock3" "s2_tuplock4" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock4" "s2_tuplock1" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock4" "s2_tuplock2" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock4" "s2_tuplock3" "s1_commit"
|
||||||
|
permutation "s1_begin" "s1_tuplock4" "s2_tuplock4" "s1_commit"
|
Loading…
x
Reference in New Issue
Block a user