diff options
Diffstat (limited to 'contrib/amcheck')
| -rw-r--r-- | contrib/amcheck/t/002_cic.pl | 48 | ||||
| -rw-r--r-- | contrib/amcheck/t/003_cic_2pc.pl | 53 |
2 files changed, 41 insertions, 60 deletions
diff --git a/contrib/amcheck/t/002_cic.pl b/contrib/amcheck/t/002_cic.pl index 0b14e66270c..ac38dd91dc4 100644 --- a/contrib/amcheck/t/002_cic.pl +++ b/contrib/amcheck/t/002_cic.pl @@ -9,7 +9,7 @@ use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Test::More tests => 4; +use Test::More tests => 3; my ($node, $result); @@ -25,32 +25,18 @@ $node->safe_psql('postgres', q(CREATE TABLE tbl(i int))); $node->safe_psql('postgres', q(CREATE INDEX idx ON tbl(i))); # -# Stress CIC with pgbench +# Stress CIC with pgbench. +# +# pgbench might try to launch more than one instance of the CIC +# transaction concurrently. That would deadlock, so use an advisory +# lock to ensure only one CIC runs at a time. # - -# Run background pgbench with CIC. We cannot mix-in this script into single -# pgbench: CIC will deadlock with itself occasionally. -my $pgbench_out = ''; -my $pgbench_timer = IPC::Run::timeout(180); -my $pgbench_h = $node->background_pgbench( - '--no-vacuum --client=1 --transactions=200', - { - '002_pgbench_concurrent_cic' => q( - DROP INDEX CONCURRENTLY idx; - CREATE INDEX CONCURRENTLY idx ON tbl(i); - SELECT bt_index_check('idx',true); - ) - }, - \$pgbench_out, - $pgbench_timer); - -# Run pgbench. $node->pgbench( - '--no-vacuum --client=5 --transactions=200', + '--no-vacuum --client=5 --transactions=100', 0, [qr{actually processed}], [qr{^$}], - 'concurrent INSERTs', + 'concurrent INSERTs and CIC', { '002_pgbench_concurrent_transaction' => q( BEGIN; @@ -62,17 +48,17 @@ $node->pgbench( SAVEPOINT s1; INSERT INTO tbl VALUES(0); COMMIT; + ), + '002_pgbench_concurrent_cic' => q( + SELECT pg_try_advisory_lock(42)::integer AS gotlock \gset + \if :gotlock + DROP INDEX CONCURRENTLY idx; + CREATE INDEX CONCURRENTLY idx ON tbl(i); + SELECT bt_index_check('idx',true); + SELECT pg_advisory_unlock(42); + \endif ) }); -$pgbench_h->pump_nb; -$pgbench_h->finish(); -$result = - ($Config{osname} eq "MSWin32") - ? ($pgbench_h->full_results)[0] - : $pgbench_h->result(0); -is($result, 0, "pgbench with CIC works"); - -# done $node->stop; done_testing(); diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl index f4255c1fb84..f4924745a31 100644 --- a/contrib/amcheck/t/003_cic_2pc.pl +++ b/contrib/amcheck/t/003_cic_2pc.pl @@ -9,7 +9,7 @@ use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; -use Test::More tests => 6; +use Test::More tests => 5; my ($node, $result); @@ -132,57 +132,52 @@ is($result, '0', 'bt_index_check after 2PC and restart'); # # Stress CIC+2PC with pgbench # +# pgbench might try to launch more than one instance of the CIC +# transaction concurrently. That would deadlock, so use an advisory +# lock to ensure only one CIC runs at a time. # Fix broken index first $node->safe_psql('postgres', q(REINDEX TABLE tbl;)); -# Run background pgbench with CIC. We cannot mix-in this script into single -# pgbench: CIC will deadlock with itself occasionally. -my $pgbench_out = ''; -my $pgbench_timer = IPC::Run::timeout(180); -my $pgbench_h = $node->background_pgbench( - '--no-vacuum --client=1 --transactions=100', - { - '002_pgbench_concurrent_cic' => q( - DROP INDEX CONCURRENTLY idx; - CREATE INDEX CONCURRENTLY idx ON tbl(i); - SELECT bt_index_check('idx',true); - ) - }, - \$pgbench_out, - $pgbench_timer); - # Run pgbench. $node->pgbench( '--no-vacuum --client=5 --transactions=100', 0, [qr{actually processed}], [qr{^$}], - 'concurrent INSERTs w/ 2PC', + 'concurrent INSERTs w/ 2PC and CIC', { - '002_pgbench_concurrent_2pc' => q( + '003_pgbench_concurrent_2pc' => q( BEGIN; INSERT INTO tbl VALUES(0); PREPARE TRANSACTION 'c:client_id'; COMMIT PREPARED 'c:client_id'; ), - '002_pgbench_concurrent_2pc_savepoint' => q( + '003_pgbench_concurrent_2pc_savepoint' => q( BEGIN; SAVEPOINT s1; INSERT INTO tbl VALUES(0); PREPARE TRANSACTION 'c:client_id'; COMMIT PREPARED 'c:client_id'; + ), + '003_pgbench_concurrent_cic' => q( + SELECT pg_try_advisory_lock(42)::integer AS gotlock \gset + \if :gotlock + DROP INDEX CONCURRENTLY idx; + CREATE INDEX CONCURRENTLY idx ON tbl(i); + SELECT bt_index_check('idx',true); + SELECT pg_advisory_unlock(42); + \endif + ), + '004_pgbench_concurrent_ric' => q( + SELECT pg_try_advisory_lock(42)::integer AS gotlock \gset + \if :gotlock + REINDEX INDEX CONCURRENTLY idx; + SELECT bt_index_check('idx',true); + SELECT pg_advisory_unlock(42); + \endif ) }); -$pgbench_h->pump_nb; -$pgbench_h->finish(); -$result = - ($Config{osname} eq "MSWin32") - ? ($pgbench_h->full_results)[0] - : $pgbench_h->result(0); -is($result, 0, "pgbench with CIC works"); - -# done $node->stop; done_testing(); |
