|
4 | 4 | use Config;
|
5 | 5 | use PostgresNode;
|
6 | 6 | use TestLib;
|
7 |
| -use Test::Moretests=>37; |
| 7 | +use Test::Moretests=>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);
|
|