Files
postgresql/src/test/regress/sql/reindex_catalog.sql
Noah Misch fe4d022c8e Fix rd_firstRelfilenodeSubid for nailed relations, in parallel workers.
Move applicable code out of RelationBuildDesc(), which nailed relations
bypass.  Non-assert builds experienced no known problems.  Back-patch to
v13, where commit c6b92041d38512a4176ed76ad06f713d2e6c01a8 introduced
rd_firstRelfilenodeSubid.

Kyotaro Horiguchi.  Reported by Justin Pryzby.

Discussion: https://postgr.es/m/20200907023737.GA7158@telsasoft.com
2020-09-09 18:50:24 -07:00

53 lines
2.5 KiB
PL/PgSQL

--
-- Check that system tables can be reindexed.
--
-- Note that this test currently is not included in the default
-- schedules, as currently reindexing catalog tables can cause
-- deadlocks:
--
-- * The lock upgrade between the ShareLock acquired for the reindex
-- and RowExclusiveLock needed for pg_class/pg_index locks can
-- trigger deadlocks.
--
-- * The uniqueness checks performed when reindexing a unique/primary
-- key index possibly need to wait for the transaction of a
-- about-to-deleted row in pg_class to commit. That can cause
-- deadlocks because, in contrast to user tables, locks on catalog
-- tables are routinely released before commit - therefore the lock
-- held for reindexing doesn't guarantee that no running transaction
-- performed modifications in the table underlying the index.
--
-- This is particularly problematic as such conflicts can be
-- triggered even when run in isolation, as a previous session's
-- temporary table cleanup might still be running (even when the
-- session ended from a client perspective).
-- Check reindexing of whole tables
REINDEX TABLE pg_class; -- mapped, non-shared, critical
REINDEX TABLE pg_index; -- non-mapped, non-shared, critical
REINDEX TABLE pg_operator; -- non-mapped, non-shared, critical
REINDEX TABLE pg_database; -- mapped, shared, critical
REINDEX TABLE pg_shdescription; -- mapped, shared non-critical
-- Check that individual system indexes can be reindexed. That's a bit
-- different from the entire-table case because reindex_relation
-- treats e.g. pg_class special.
REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical
REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical
REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
-- Check the same REINDEX INDEX statements under parallelism.
BEGIN;
SET min_parallel_table_scan_size = 0;
REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical
REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical
REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
ROLLBACK;