From 3459561dfa1ea3ed14273eda1a03372f0e7a065b Mon Sep 17 00:00:00 2001 From: Lee Dong Wook Date: Tue, 2 Aug 2022 20:49:52 +0900 Subject: [PATCH] pgrowlocks: add test for coverage --- contrib/pgrowlocks/.gitignore | 6 + contrib/pgrowlocks/Makefile | 2 + contrib/pgrowlocks/expected/pgrowlocks.out | 613 +++++++++++++++++++++ contrib/pgrowlocks/specs/pgrowlocks.spec | 62 +++ 4 files changed, 683 insertions(+) create mode 100644 contrib/pgrowlocks/.gitignore create mode 100644 contrib/pgrowlocks/expected/pgrowlocks.out create mode 100644 contrib/pgrowlocks/specs/pgrowlocks.spec diff --git a/contrib/pgrowlocks/.gitignore b/contrib/pgrowlocks/.gitignore new file mode 100644 index 000000000000..b4903eba657f --- /dev/null +++ b/contrib/pgrowlocks/.gitignore @@ -0,0 +1,6 @@ +# Generated subdirectories +/log/ +/results/ +/output_iso/ +/tmp_check/ +/tmp_check_iso/ diff --git a/contrib/pgrowlocks/Makefile b/contrib/pgrowlocks/Makefile index 294c05dd0f91..2094a25c70d9 100644 --- a/contrib/pgrowlocks/Makefile +++ b/contrib/pgrowlocks/Makefile @@ -9,6 +9,8 @@ EXTENSION = pgrowlocks DATA = pgrowlocks--1.2.sql pgrowlocks--1.1--1.2.sql pgrowlocks--1.0--1.1.sql PGFILEDESC = "pgrowlocks - display row locking information" +ISOLATION = pgrowlocks + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/pgrowlocks/expected/pgrowlocks.out b/contrib/pgrowlocks/expected/pgrowlocks.out new file mode 100644 index 000000000000..4ae42c5b014d --- /dev/null +++ b/contrib/pgrowlocks/expected/pgrowlocks.out @@ -0,0 +1,613 @@ +unused step name: s2_tuplock1 +unused step name: s2_tuplock2 +unused step name: s2_tuplock3 +unused step name: s2_tuplock4 +Parsed test spec with 2 sessions + +starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------------- +(0,1) |t |{"Key Share",Share} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------------- +(0,1) |t |{"Key Share",Share} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------------- +(0,1) |t |{"Key Share",Share} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------------- +(0,1) |t |{"Key Share",Share} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------------------- +(0,1) |t |{"Key Share","For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------------------- +(0,1) |t |{"Key Share","For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------------------- +(0,1) |t |{"Key Share","For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------------------- +(0,1) |t |{"Key Share","For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------------------- +(0,1) |t |{"Key Share","For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------------------- +(0,1) |t |{"Key Share","For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------------------- +(0,1) |t |{"Key Share","For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT foo; +a +- +1 +(1 row) + +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------------------- +(0,1) |t |{"Key Share","For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+----------------- +(0,1) |f |{"For Key Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------- +(0,1) |f |{"For Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------- +(0,1) |f |{"For Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------- +(0,1) |f |{"For Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+------------- +(0,1) |f |{"For Share"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------- +(0,1) |f |{"For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------- +(0,1) |f |{"For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------- +(0,1) |f |{"For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+--------------------- +(0,1) |f |{"For No Key Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------- +(0,1) |f |{"For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------- +(0,1) |f |{"For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------- +(0,1) |f |{"For Update"} +(1 row) + +step s1_commit: COMMIT; + +starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit +step s1_begin: BEGIN; +step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE; +a +- +1 +(1 row) + +step s2_rowlocks: select locked_row, multi, modes from pgrowlocks('multixact_conflict'); +locked_row|multi|modes +----------+-----+-------------- +(0,1) |f |{"For Update"} +(1 row) + +step s1_commit: COMMIT; diff --git a/contrib/pgrowlocks/specs/pgrowlocks.spec b/contrib/pgrowlocks/specs/pgrowlocks.spec new file mode 100644 index 000000000000..fd068a546e48 --- /dev/null +++ b/contrib/pgrowlocks/specs/pgrowlocks.spec @@ -0,0 +1,62 @@ +setup { + CREATE EXTENSION pgrowlocks; + CREATE TABLE multixact_conflict (a int primary key); + INSERT INTO multixact_conflict VALUES (1); +} + +teardown { + DROP EXTENSION pgrowlocks; + 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; } +step s2_rowlocks { select locked_row, multi, modes from pgrowlocks('multixact_conflict'); } + +# with savepoints test the multixact cases +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit + +# no multixacts here +permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit +permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit