mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
Add support for partitioned tables and indexes in REINDEX
Until now, REINDEX was not able to work with partitioned tables and indexes, forcing users to reindex partitions one by one. This extends REINDEX INDEX and REINDEX TABLE so as they can accept a partitioned index and table in input, respectively, to reindex all the partitions assigned to them with physical storage (foreign tables, partitioned tables and indexes are then discarded). This shares some logic with schema and database REINDEX as each partition gets processed in its own transaction after building a list of relations to work on. This choice has the advantage to minimize the number of invalid indexes to one partition with REINDEX CONCURRENTLY in the event a cancellation or failure in-flight, as the only indexes handled at once in a single REINDEX CONCURRENTLY loop are the ones from the partition being working on. Isolation tests are added to emulate some cases I bumped into while developing this feature, particularly with the concurrent drop of a leaf partition reindexed. However, this is rather limited as LOCK would cause REINDEX to block in the first transaction building the list of partitions. Per its multi-transaction nature, this new flavor cannot run in a transaction block, similarly to REINDEX SCHEMA, SYSTEM and DATABASE. Author: Justin Pryzby, Michael Paquier Reviewed-by: Anastasia Lubennikova Discussion: https://postgr.es/m/db12e897-73ff-467e-94cb-4af03705435f.adger.lj@alibaba-inc.com
This commit is contained in:
@@ -77,6 +77,7 @@
|
||||
#include "utils/lsyscache.h"
|
||||
#include "utils/memutils.h"
|
||||
#include "utils/pg_rusage.h"
|
||||
#include "utils/rel.h"
|
||||
#include "utils/snapmgr.h"
|
||||
#include "utils/syscache.h"
|
||||
#include "utils/tuplesort.h"
|
||||
@@ -3486,11 +3487,12 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
|
||||
iRel->rd_rel->relam);
|
||||
|
||||
/*
|
||||
* The case of reindexing partitioned tables and indexes is handled
|
||||
* differently by upper layers, so this case shouldn't arise.
|
||||
* Partitioned indexes should never get processed here, as they have no
|
||||
* physical storage.
|
||||
*/
|
||||
if (iRel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
|
||||
elog(ERROR, "unsupported relation kind for index \"%s\"",
|
||||
elog(ERROR, "cannot reindex partitioned index \"%s.%s\"",
|
||||
get_namespace_name(RelationGetNamespace(iRel)),
|
||||
RelationGetRelationName(iRel));
|
||||
|
||||
/*
|
||||
@@ -3707,20 +3709,13 @@ reindex_relation(Oid relid, int flags, int options)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* This may be useful when implemented someday; but that day is not today.
|
||||
* For now, avoid erroring out when called in a multi-table context
|
||||
* (REINDEX SCHEMA) and happen to come across a partitioned table. The
|
||||
* partitions may be reindexed on their own anyway.
|
||||
* Partitioned tables should never get processed here, as they have no
|
||||
* physical storage.
|
||||
*/
|
||||
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||
{
|
||||
ereport(WARNING,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("REINDEX of partitioned tables is not yet implemented, skipping \"%s\"",
|
||||
RelationGetRelationName(rel))));
|
||||
table_close(rel, ShareLock);
|
||||
return false;
|
||||
}
|
||||
elog(ERROR, "cannot reindex partitioned table \"%s.%s\"",
|
||||
get_namespace_name(RelationGetNamespace(rel)),
|
||||
RelationGetRelationName(rel));
|
||||
|
||||
toast_relid = rel->rd_rel->reltoastrelid;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user