Commit a95307b6 authored by Tom Lane's avatar Tom Lane

Teach reindex_index() to clear pg_index.indcheckxmin when possible.

Greg Stark, slightly modified by me.
parent c1dcaa86
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.313 2009/03/24 20:17:12 tgl Exp $ * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.314 2009/03/27 15:57:11 tgl Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -2243,6 +2243,7 @@ reindex_index(Oid indexId) ...@@ -2243,6 +2243,7 @@ reindex_index(Oid indexId)
pg_index; pg_index;
Oid heapId; Oid heapId;
bool inplace; bool inplace;
IndexInfo *indexInfo;
HeapTuple indexTuple; HeapTuple indexTuple;
Form_pg_index indexForm; Form_pg_index indexForm;
...@@ -2293,8 +2294,6 @@ reindex_index(Oid indexId) ...@@ -2293,8 +2294,6 @@ reindex_index(Oid indexId)
PG_TRY(); PG_TRY();
{ {
IndexInfo *indexInfo;
/* Suppress use of the target index while rebuilding it */ /* Suppress use of the target index while rebuilding it */
SetReindexProcessing(heapId, indexId); SetReindexProcessing(heapId, indexId);
...@@ -2333,6 +2332,10 @@ reindex_index(Oid indexId) ...@@ -2333,6 +2332,10 @@ reindex_index(Oid indexId)
* If the index is marked invalid or not ready (ie, it's from a failed * If the index is marked invalid or not ready (ie, it's from a failed
* CREATE INDEX CONCURRENTLY), we can now mark it valid. This allows * CREATE INDEX CONCURRENTLY), we can now mark it valid. This allows
* REINDEX to be used to clean up in such cases. * REINDEX to be used to clean up in such cases.
*
* We can also reset indcheckxmin, because we have now done a
* non-concurrent index build, *except* in the case where index_build
* found some still-broken HOT chains.
*/ */
pg_index = heap_open(IndexRelationId, RowExclusiveLock); pg_index = heap_open(IndexRelationId, RowExclusiveLock);
...@@ -2343,10 +2346,13 @@ reindex_index(Oid indexId) ...@@ -2343,10 +2346,13 @@ reindex_index(Oid indexId)
elog(ERROR, "cache lookup failed for index %u", indexId); elog(ERROR, "cache lookup failed for index %u", indexId);
indexForm = (Form_pg_index) GETSTRUCT(indexTuple); indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
if (!indexForm->indisvalid || !indexForm->indisready) if (!indexForm->indisvalid || !indexForm->indisready ||
(indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain))
{ {
indexForm->indisvalid = true; indexForm->indisvalid = true;
indexForm->indisready = true; indexForm->indisready = true;
if (!indexInfo->ii_BrokenHotChain)
indexForm->indcheckxmin = false;
simple_heap_update(pg_index, &indexTuple->t_self, indexTuple); simple_heap_update(pg_index, &indexTuple->t_self, indexTuple);
CatalogUpdateIndexes(pg_index, indexTuple); CatalogUpdateIndexes(pg_index, indexTuple);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment