65 lines
1.5 KiB
Perl
65 lines
1.5 KiB
Perl
|
|
||
|
# Copyright (c) 2021-2022, PostgreSQL Global Development Group
|
||
|
|
||
|
# Test CREATE INDEX CONCURRENTLY with concurrent modifications
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
|
||
|
use PostgreSQL::Test::Cluster;
|
||
|
use PostgreSQL::Test::Utils;
|
||
|
|
||
|
use Test::More;
|
||
|
|
||
|
my ($node, $result);
|
||
|
|
||
|
#
|
||
|
# Test set-up
|
||
|
#
|
||
|
$node = PostgreSQL::Test::Cluster->new('CIC_test');
|
||
|
$node->init;
|
||
|
$node->append_conf('postgresql.conf',
|
||
|
'lock_timeout = ' . (1000 * $PostgreSQL::Test::Utils::timeout_default));
|
||
|
$node->start;
|
||
|
$node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
|
||
|
$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.
|
||
|
#
|
||
|
# 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.
|
||
|
#
|
||
|
$node->pgbench(
|
||
|
'--no-vacuum --client=5 --transactions=100',
|
||
|
0,
|
||
|
[qr{actually processed}],
|
||
|
[qr{^$}],
|
||
|
'concurrent INSERTs and CIC',
|
||
|
{
|
||
|
'002_pgbench_concurrent_transaction' => q(
|
||
|
BEGIN;
|
||
|
INSERT INTO tbl VALUES(0);
|
||
|
COMMIT;
|
||
|
),
|
||
|
'002_pgbench_concurrent_transaction_savepoints' => q(
|
||
|
BEGIN;
|
||
|
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
|
||
|
)
|
||
|
});
|
||
|
|
||
|
$node->stop;
|
||
|
done_testing();
|