|
4 | 4 | use Config;
|
5 | 5 | use PostgresNode;
|
6 | 6 | use TestLib;
|
7 |
| -use Test::More tests => 37; |
| 7 | +use Test::More tests => 38; |
8 | 8 |
|
9 | 9 | use constant
|
10 | 10 | {
|
|
35 | 35 | my $script1 = $node->basedir . '/pgbench_script1';
|
36 | 36 | append_to_file($script1,
|
37 | 37 | "BEGIN;\n"
|
38 |
| - . "SELECT pg_sleep(10);\n" |
39 | 38 | . "\\set delta1 random(-5000, 5000)\n"
|
40 | 39 | . "\\set delta2 random(-5000, 5000)\n"
|
41 | 40 | . "UPDATE xy SET y = y + :delta1 WHERE x = 1;\n"
|
42 |
| - . "SELECT pg_sleep(40);\n" |
| 41 | + . "SELECT pg_sleep(20);\n" |
43 | 42 | . "UPDATE xy SET y = y + :delta2 WHERE x = 2;\n"
|
44 | 43 | . "END;");
|
45 | 44 |
|
46 | 45 | my $script2 = $node->basedir . '/pgbench_script2';
|
47 | 46 | append_to_file($script2,
|
48 | 47 | "BEGIN;\n"
|
49 |
| - . "SELECT pg_sleep(10);\n" |
50 | 48 | . "\\set delta1 random(-5000, 5000)\n"
|
51 | 49 | . "\\set delta2 random(-5000, 5000)\n"
|
52 | 50 | . "UPDATE xy SET y = y + :delta2 WHERE x = 2;\n"
|
@@ -182,9 +180,8 @@ sub test_pgbench_deadlock_failures
|
182 | 180 | print "# Running: " . join(" ", @command1) . "\n";
|
183 | 181 | $h1 = IPC::Run::start \@command1, \$in1, \$out1, \$err1;
|
184 | 182 |
|
185 |
| - # Let pgbench sleep 10 seconds and run first update command in the |
186 |
| - # transaction: |
187 |
| - sleep 20; |
| 183 | + # Let pgbench run first update command in the transaction: |
| 184 | + sleep 10; |
188 | 185 |
|
189 | 186 | # Run second pgbench
|
190 | 187 | my @command2 = (
|
@@ -258,34 +255,40 @@ sub test_pgbench_deadlock_failures
|
258 | 255 | . ": pgbench 2: check deadlock failures");
|
259 | 256 |
|
260 | 257 | # First or second pgbench should get a deadlock error
|
261 |
| - my $pattern = |
262 |
| - "client 0 sending UPDATE xy SET y = y \\+ (-?\\d+) WHERE x = (\\d);\n" |
263 |
| - . "client 0 receiving\n" |
264 |
| - . "(|client 0 sending SELECT pg_sleep\\(40\\);\n" |
265 |
| - . "client 0 receiving\n)" |
266 |
| - . "client 0 sending UPDATE xy SET y = y \\+ (-?\\d+) WHERE x = (\\d);\n" |
267 |
| - . "client 0 receiving\n" |
268 |
| - . "client 0 got a deadlock failure \\(attempt 1/2\\)\n" |
269 |
| - . "client 0 sending END;\n" |
270 |
| - . "client 0 receiving\n" |
271 |
| - . "client 0 repeats the failed transaction \\(attempt 2/2\\)\n" |
272 |
| - . "client 0 sending BEGIN;\n" |
273 |
| - . "client 0 receiving\n" |
274 |
| - . "client 0 sending SELECT pg_sleep\\(10\\);\n" |
275 |
| - . "client 0 receiving\n" |
276 |
| - . "client 0 executing \\\\set delta1\n" |
277 |
| - . "client 0 executing \\\\set delta2\n" |
278 |
| - . "client 0 sending UPDATE xy SET y = y \\+ \\g1 WHERE x = \\g2;\n" |
279 |
| - . "client 0 receiving\n" |
280 |
| - . "\\g3" |
281 |
| - . "client 0 sending UPDATE xy SET y = y \\+ \\g4 WHERE x = \\g5;\n"; |
282 |
| - |
283 | 258 | like($err1 . $err2,
|
284 |
| - qr{$pattern}, |
| 259 | + qr{client 0 got a deadlock failure}, |
285 | 260 | "concurrent deadlock update with retrying: "
|
286 | 261 | . $isolation_level_sql
|
287 |
| - . ": check the retried transaction"); |
288 |
| - |
| 262 | + . ": check deadlock failure in debug logs"); |
| 263 | + |
| 264 | + if ($isolation_level == READ_COMMITTED) |
| 265 | + { |
| 266 | + my $pattern = |
| 267 | + "client 0 sending UPDATE xy SET y = y \\+ (-?\\d+) WHERE x = (\\d);\n" |
| 268 | + . "client 0 receiving\n" |
| 269 | + . "(|client 0 sending SELECT pg_sleep\\(20\\);\n" |
| 270 | + . "client 0 receiving\n)" |
| 271 | + . "client 0 sending UPDATE xy SET y = y \\+ (-?\\d+) WHERE x = (\\d);\n" |
| 272 | + . "client 0 receiving\n" |
| 273 | + . "client 0 got a deadlock failure \\(attempt 1/2\\)\n" |
| 274 | + . "client 0 sending END;\n" |
| 275 | + . "client 0 receiving\n" |
| 276 | + . "client 0 repeats the failed transaction \\(attempt 2/2\\)\n" |
| 277 | + . "client 0 sending BEGIN;\n" |
| 278 | + . "client 0 receiving\n" |
| 279 | + . "client 0 executing \\\\set delta1\n" |
| 280 | + . "client 0 executing \\\\set delta2\n" |
| 281 | + . "client 0 sending UPDATE xy SET y = y \\+ \\g1 WHERE x = \\g2;\n" |
| 282 | + . "client 0 receiving\n" |
| 283 | + . "\\g3" |
| 284 | + . "client 0 sending UPDATE xy SET y = y \\+ \\g4 WHERE x = \\g5;\n"; |
| 285 | + |
| 286 | + like($err1 . $err2, |
| 287 | + qr{$pattern}, |
| 288 | + "concurrent deadlock update with retrying: " |
| 289 | + . $isolation_level_sql |
| 290 | + . ": check the retried transaction"); |
| 291 | + } |
289 | 292 | }
|
290 | 293 |
|
291 | 294 | test_pgbench_serialization_failures(REPEATABLE_READ);
|
|
0 commit comments