Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 7e61e4c

Browse files
committed
Make two-phase tests of ECPG and main suite more concurrent-proof
The ECPG and main 2PC tests have been using rather-generic names for the prepared transactions they generate. This commit switches the 2PC transactions to use more complex GIDs, reducing the risk of naming conflicts. The main 2PC tests also include scans of pg_prepared_xacts that do not apply filters on the GID of the prepared transactions, making it possible to fail the test when any 2PC transaction runs concurrently. The CI has been able to see such failures with an installcheck running the ECPG and the main regression test suites in parallel. The queries on pg_prepared_xacts gain quals to only look after the GIDs generated locally. The race is very hard to reproduce, so no backbatch is done for now. Reported-by: Richard Guo Discussion: https://postgr.es/m/CAMbWs4-mWCGbbE_bne5=AfqjYGDaUZmjCw2+soLjrdNA0xUDFw@mail.gmail.com
1 parent 3c18409 commit 7e61e4c

File tree

6 files changed

+111
-111
lines changed

6 files changed

+111
-111
lines changed

src/interfaces/ecpg/test/expected/sql-twophase.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ if (sqlca.sqlcode < 0) sqlprint();}
7979

8080

8181
strcpy(msg, "prepare transaction");
82-
{ ECPGtrans(__LINE__, NULL, "prepare transaction 'gxid'");
82+
{ ECPGtrans(__LINE__, NULL, "prepare transaction 'ecpg_twophase'");
8383
#line 32 "twophase.pgc"
8484

8585
if (sqlca.sqlcode < 0) sqlprint();}
8686
#line 32 "twophase.pgc"
8787

8888

8989
strcpy(msg, "commit prepared");
90-
{ ECPGtrans(__LINE__, NULL, "commit prepared 'gxid'");
90+
{ ECPGtrans(__LINE__, NULL, "commit prepared 'ecpg_twophase'");
9191
#line 35 "twophase.pgc"
9292

9393
if (sqlca.sqlcode < 0) sqlprint();}

src/interfaces/ecpg/test/expected/sql-twophase.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
[NO_PID]: sqlca: code: 0, state: 00000
2121
[NO_PID]: ecpg_process_output on line 29: OK: INSERT 0 1
2222
[NO_PID]: sqlca: code: 0, state: 00000
23-
[NO_PID]: ECPGtrans on line 32: action "prepare transaction 'gxid'"; connection "ecpg1_regression"
23+
[NO_PID]: ECPGtrans on line 32: action "prepare transaction 'ecpg_twophase'"; connection "ecpg1_regression"
2424
[NO_PID]: sqlca: code: 0, state: 00000
25-
[NO_PID]: ECPGtrans on line 35: action "commit prepared 'gxid'"; connection "ecpg1_regression"
25+
[NO_PID]: ECPGtrans on line 35: action "commit prepared 'ecpg_twophase'"; connection "ecpg1_regression"
2626
[NO_PID]: sqlca: code: 0, state: 00000
2727
[NO_PID]: ecpg_execute on line 38: query: drop table t1; with 0 parameter(s) on connection ecpg1_regression
2828
[NO_PID]: sqlca: code: 0, state: 00000

src/interfaces/ecpg/test/sql/twophase.pgc

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ int main(void)
2929
exec sql insert into t1 values(1);
3030

3131
strcpy(msg, "prepare transaction");
32-
exec sql prepare transaction 'gxid';
32+
exec sql prepare transaction 'ecpg_twophase';
3333

3434
strcpy(msg, "commit prepared");
35-
exec sql commit prepared 'gxid';
35+
exec sql commit prepared 'ecpg_twophase';
3636

3737
strcpy(msg, "drop");
3838
exec sql drop table t1;

src/test/regress/expected/prepared_xacts.out

+49-49
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,29 @@ SELECT * FROM pxtest1;
1717
bbb
1818
(1 row)
1919

20-
PREPARE TRANSACTION 'foo1';
20+
PREPARE TRANSACTION 'regress_foo1';
2121
SELECT * FROM pxtest1;
2222
foobar
2323
--------
2424
aaa
2525
(1 row)
2626

2727
-- Test pg_prepared_xacts system view
28-
SELECT gid FROM pg_prepared_xacts;
29-
gid
30-
------
31-
foo1
28+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
29+
gid
30+
--------------
31+
regress_foo1
3232
(1 row)
3333

3434
-- Test ROLLBACK PREPARED
35-
ROLLBACK PREPARED 'foo1';
35+
ROLLBACK PREPARED 'regress_foo1';
3636
SELECT * FROM pxtest1;
3737
foobar
3838
--------
3939
aaa
4040
(1 row)
4141

42-
SELECT gid FROM pg_prepared_xacts;
42+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
4343
gid
4444
-----
4545
(0 rows)
@@ -54,14 +54,14 @@ SELECT * FROM pxtest1;
5454
ddd
5555
(2 rows)
5656

57-
PREPARE TRANSACTION 'foo2';
57+
PREPARE TRANSACTION 'regress_foo2';
5858
SELECT * FROM pxtest1;
5959
foobar
6060
--------
6161
aaa
6262
(1 row)
6363

64-
COMMIT PREPARED 'foo2';
64+
COMMIT PREPARED 'regress_foo2';
6565
SELECT * FROM pxtest1;
6666
foobar
6767
--------
@@ -79,26 +79,26 @@ SELECT * FROM pxtest1;
7979
eee
8080
(2 rows)
8181

82-
PREPARE TRANSACTION 'foo3';
83-
SELECT gid FROM pg_prepared_xacts;
84-
gid
85-
------
86-
foo3
82+
PREPARE TRANSACTION 'regress_foo3';
83+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
84+
gid
85+
--------------
86+
regress_foo3
8787
(1 row)
8888

8989
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
9090
INSERT INTO pxtest1 VALUES ('fff');
9191
-- This should fail, because the gid foo3 is already in use
92-
PREPARE TRANSACTION 'foo3';
93-
ERROR: transaction identifier "foo3" is already in use
92+
PREPARE TRANSACTION 'regress_foo3';
93+
ERROR: transaction identifier "regress_foo3" is already in use
9494
SELECT * FROM pxtest1;
9595
foobar
9696
--------
9797
aaa
9898
ddd
9999
(2 rows)
100100

101-
ROLLBACK PREPARED 'foo3';
101+
ROLLBACK PREPARED 'regress_foo3';
102102
SELECT * FROM pxtest1;
103103
foobar
104104
--------
@@ -116,11 +116,11 @@ SELECT * FROM pxtest1;
116116
eee
117117
(2 rows)
118118

119-
PREPARE TRANSACTION 'foo4';
120-
SELECT gid FROM pg_prepared_xacts;
121-
gid
122-
------
123-
foo4
119+
PREPARE TRANSACTION 'regress_foo4';
120+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
121+
gid
122+
--------------
123+
regress_foo4
124124
(1 row)
125125

126126
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
@@ -136,15 +136,15 @@ INSERT INTO pxtest1 VALUES ('fff');
136136
ERROR: could not serialize access due to read/write dependencies among transactions
137137
DETAIL: Reason code: Canceled on identification as a pivot, during write.
138138
HINT: The transaction might succeed if retried.
139-
PREPARE TRANSACTION 'foo5';
140-
SELECT gid FROM pg_prepared_xacts;
141-
gid
142-
------
143-
foo4
139+
PREPARE TRANSACTION 'regress_foo5';
140+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
141+
gid
142+
--------------
143+
regress_foo4
144144
(1 row)
145145

146-
ROLLBACK PREPARED 'foo4';
147-
SELECT gid FROM pg_prepared_xacts;
146+
ROLLBACK PREPARED 'regress_foo4';
147+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
148148
gid
149149
-----
150150
(0 rows)
@@ -165,7 +165,7 @@ SELECT pg_advisory_xact_lock_shared(1);
165165

166166
(1 row)
167167

168-
PREPARE TRANSACTION 'foo6'; -- fails
168+
PREPARE TRANSACTION 'regress_foo6'; -- fails
169169
ERROR: cannot PREPARE while holding both session-level and transaction-level locks on the same object
170170
-- Test subtransactions
171171
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
@@ -176,7 +176,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
176176
ROLLBACK TO a;
177177
SAVEPOINT b;
178178
INSERT INTO pxtest2 VALUES (3);
179-
PREPARE TRANSACTION 'regress-one';
179+
PREPARE TRANSACTION 'regress_sub1';
180180
CREATE TABLE pxtest3(fff int);
181181
-- Test shared invalidation
182182
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
@@ -192,7 +192,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
192192
1
193193
(1 row)
194194

195-
PREPARE TRANSACTION 'regress-two';
195+
PREPARE TRANSACTION 'regress_sub2';
196196
-- No such cursor
197197
FETCH 1 FROM foo;
198198
ERROR: cursor "foo" does not exist
@@ -202,11 +202,11 @@ ERROR: relation "pxtest2" does not exist
202202
LINE 1: SELECT * FROM pxtest2;
203203
^
204204
-- There should be two prepared transactions
205-
SELECT gid FROM pg_prepared_xacts;
206-
gid
207-
-------------
208-
regress-one
209-
regress-two
205+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
206+
gid
207+
--------------
208+
regress_sub1
209+
regress_sub2
210210
(2 rows)
211211

212212
-- pxtest3 should be locked because of the pending DROP
@@ -217,11 +217,11 @@ rollback;
217217
-- Disconnect, we will continue testing in a different backend
218218
\c -
219219
-- There should still be two prepared transactions
220-
SELECT gid FROM pg_prepared_xacts;
221-
gid
222-
-------------
223-
regress-one
224-
regress-two
220+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
221+
gid
222+
--------------
223+
regress_sub1
224+
regress_sub2
225225
(2 rows)
226226

227227
-- pxtest3 should still be locked because of the pending DROP
@@ -230,7 +230,7 @@ lock table pxtest3 in access share mode nowait;
230230
ERROR: could not obtain lock on relation "pxtest3"
231231
rollback;
232232
-- Commit table creation
233-
COMMIT PREPARED 'regress-one';
233+
COMMIT PREPARED 'regress_sub1';
234234
\d pxtest2
235235
Table "public.pxtest2"
236236
Column | Type | Collation | Nullable | Default
@@ -245,20 +245,20 @@ SELECT * FROM pxtest2;
245245
(2 rows)
246246

247247
-- There should be one prepared transaction
248-
SELECT gid FROM pg_prepared_xacts;
249-
gid
250-
-------------
251-
regress-two
248+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
249+
gid
250+
--------------
251+
regress_sub2
252252
(1 row)
253253

254254
-- Commit table drop
255-
COMMIT PREPARED 'regress-two';
255+
COMMIT PREPARED 'regress_sub2';
256256
SELECT * FROM pxtest3;
257257
ERROR: relation "pxtest3" does not exist
258258
LINE 1: SELECT * FROM pxtest3;
259259
^
260260
-- There should be no prepared transactions
261-
SELECT gid FROM pg_prepared_xacts;
261+
SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid;
262262
gid
263263
-----
264264
(0 rows)

0 commit comments

Comments
 (0)