summaryrefslogtreecommitdiff
path: root/contrib/amcheck
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/amcheck')
-rw-r--r--contrib/amcheck/t/002_cic.pl48
-rw-r--r--contrib/amcheck/t/003_cic_2pc.pl53
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();