Revert "Prevent incorrect updates of pg_index while reindexing pg_index itself."

This reverts commit 8835284e0d903156632f76eea941cf5c592717ec of 2011-04-15.
There's a better way to do it, which will follow shortly.
This commit is contained in:
Tom Lane 2011-04-19 16:58:53 -04:00
parent 8835284e0d
commit 1f0ad40656

@ -1423,13 +1423,6 @@ index_build(Relation heapRelation,
HeapTuple indexTuple; HeapTuple indexTuple;
Form_pg_index indexForm; Form_pg_index indexForm;
/*
* Broken HOT chains should not get reported in system catalogs; in
* particular it would be quite dangerous to try to modify the index's
* pg_index entry if we are reindexing pg_index itself.
*/
Assert(!IsSystemRelation(heapRelation));
pg_index = heap_open(IndexRelationId, RowExclusiveLock); pg_index = heap_open(IndexRelationId, RowExclusiveLock);
indexTuple = SearchSysCacheCopy(INDEXRELID, indexTuple = SearchSysCacheCopy(INDEXRELID,
@ -1489,13 +1482,7 @@ index_build(Relation heapRelation,
* A side effect is to set indexInfo->ii_BrokenHotChain to true if we detect * A side effect is to set indexInfo->ii_BrokenHotChain to true if we detect
* any potentially broken HOT chains. Currently, we set this if there are * any potentially broken HOT chains. Currently, we set this if there are
* any RECENTLY_DEAD entries in a HOT chain, without trying very hard to * any RECENTLY_DEAD entries in a HOT chain, without trying very hard to
* detect whether they're really incompatible with the chain tip. However, * detect whether they're really incompatible with the chain tip.
* we do not ever set ii_BrokenHotChain true when the relation is a system
* catalog. This is to avoid problematic behavior when reindexing pg_index
* itself: we can't safely change the index's indcheckxmin field when we're
* partway through such an operation. It should be okay since the set of
* indexes on a system catalog ought not change during concurrent operations,
* so that no HOT chain in it could ever become broken.
*/ */
double double
IndexBuildHeapScan(Relation heapRelation, IndexBuildHeapScan(Relation heapRelation,
@ -1505,7 +1492,6 @@ IndexBuildHeapScan(Relation heapRelation,
IndexBuildCallback callback, IndexBuildCallback callback,
void *callback_state) void *callback_state)
{ {
bool is_system_catalog;
HeapScanDesc scan; HeapScanDesc scan;
HeapTuple heapTuple; HeapTuple heapTuple;
Datum values[INDEX_MAX_KEYS]; Datum values[INDEX_MAX_KEYS];
@ -1525,9 +1511,6 @@ IndexBuildHeapScan(Relation heapRelation,
*/ */
Assert(OidIsValid(indexRelation->rd_rel->relam)); Assert(OidIsValid(indexRelation->rd_rel->relam));
/* Remember if it's a system catalog */
is_system_catalog = IsSystemRelation(heapRelation);
/* /*
* Need an EState for evaluation of index expressions and partial-index * Need an EState for evaluation of index expressions and partial-index
* predicates. Also a slot to hold the current tuple. * predicates. Also a slot to hold the current tuple.
@ -1666,8 +1649,7 @@ IndexBuildHeapScan(Relation heapRelation,
{ {
indexIt = false; indexIt = false;
/* mark the index as unsafe for old snapshots */ /* mark the index as unsafe for old snapshots */
if (!is_system_catalog) indexInfo->ii_BrokenHotChain = true;
indexInfo->ii_BrokenHotChain = true;
} }
else if (indexInfo->ii_BrokenHotChain) else if (indexInfo->ii_BrokenHotChain)
indexIt = false; indexIt = false;
@ -1756,8 +1738,7 @@ IndexBuildHeapScan(Relation heapRelation,
{ {
indexIt = false; indexIt = false;
/* mark the index as unsafe for old snapshots */ /* mark the index as unsafe for old snapshots */
if (!is_system_catalog) indexInfo->ii_BrokenHotChain = true;
indexInfo->ii_BrokenHotChain = true;
} }
else if (indexInfo->ii_BrokenHotChain) else if (indexInfo->ii_BrokenHotChain)
indexIt = false; indexIt = false;
@ -2371,35 +2352,27 @@ reindex_index(Oid indexId)
* We can also reset indcheckxmin, because we have now done a * We can also reset indcheckxmin, because we have now done a
* non-concurrent index build, *except* in the case where index_build * non-concurrent index build, *except* in the case where index_build
* found some still-broken HOT chains. * found some still-broken HOT chains.
*
* When reindexing a system catalog, don't do any of this --- it would be
* particularly risky to try to modify pg_index while we are reindexing
* pg_index itself. We don't support CREATE INDEX CONCURRENTLY on system
* catalogs anyway, and they should never have indcheckxmin set either.
*/ */
if (!IsSystemRelation(heapRelation)) pg_index = heap_open(IndexRelationId, RowExclusiveLock);
indexTuple = SearchSysCacheCopy(INDEXRELID,
ObjectIdGetDatum(indexId),
0, 0, 0);
if (!HeapTupleIsValid(indexTuple))
elog(ERROR, "cache lookup failed for index %u", indexId);
indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
if (!indexForm->indisvalid || !indexForm->indisready ||
(indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain))
{ {
pg_index = heap_open(IndexRelationId, RowExclusiveLock); indexForm->indisvalid = true;
indexForm->indisready = true;
indexTuple = SearchSysCacheCopy(INDEXRELID, if (!indexInfo->ii_BrokenHotChain)
ObjectIdGetDatum(indexId), indexForm->indcheckxmin = false;
0, 0, 0); simple_heap_update(pg_index, &indexTuple->t_self, indexTuple);
if (!HeapTupleIsValid(indexTuple)) CatalogUpdateIndexes(pg_index, indexTuple);
elog(ERROR, "cache lookup failed for index %u", indexId);
indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
if (!indexForm->indisvalid || !indexForm->indisready ||
(indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain))
{
indexForm->indisvalid = true;
indexForm->indisready = true;
if (!indexInfo->ii_BrokenHotChain)
indexForm->indcheckxmin = false;
simple_heap_update(pg_index, &indexTuple->t_self, indexTuple);
CatalogUpdateIndexes(pg_index, indexTuple);
}
heap_close(pg_index, RowExclusiveLock);
} }
heap_close(pg_index, RowExclusiveLock);
/* Close rels, but keep locks */ /* Close rels, but keep locks */
index_close(iRel, NoLock); index_close(iRel, NoLock);