mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
 | |
| # Copyright (c) 2021-2023, 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();
 |