summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/amcheck/t/002_cic.pl48
-rw-r--r--contrib/amcheck/t/003_cic_2pc.pl53
-rw-r--r--src/test/perl/PostgreSQL/Test/Cluster.pm48
3 files changed, 41 insertions, 108 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();
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 86eb920ea10..9467a199c8f 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -2070,54 +2070,6 @@ sub pgbench
=pod
-=item $node->background_pgbench($opts, $files, \$stdout, $timer) => harness
-
-Invoke B<pgbench> and return an IPC::Run harness object. The process's stdin
-is empty, and its stdout and stderr go to the $stdout scalar reference. This
-allows the caller to act on other parts of the system while B<pgbench> is
-running. Errors from B<pgbench> are the caller's problem.
-
-The specified timer object is attached to the harness, as well. It's caller's
-responsibility to select the timeout length, and to restart the timer after
-each command if the timeout is per-command.
-
-Be sure to "finish" the harness when done with it.
-
-=over
-
-=item $opts
-
-Options as a string to be split on spaces.
-
-=item $files
-
-Reference to filename/contents dictionary.
-
-=back
-
-=cut
-
-sub background_pgbench
-{
- my ($self, $opts, $files, $stdout, $timer) = @_;
-
- my @cmd =
- ('pgbench', split(/\s+/, $opts), $self->_pgbench_make_files($files));
-
- local %ENV = $self->_get_env();
-
- my $stdin = "";
- # IPC::Run would otherwise append to existing contents:
- $$stdout = "" if ref($stdout);
-
- my $harness = IPC::Run::start \@cmd, '<', \$stdin, '>', $stdout, '2>&1',
- $timer;
-
- return $harness;
-}
-
-=pod
-
=item $node->connect_ok($connstr, $test_name, %params)
Attempt a connection with a custom connection string. This is expected