mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
Set indcheckxmin true when REINDEX fixes an invalid or not-ready index.
Per comment from Greg Stark, it's less clear that HOT chains don't conflict with the index than it would be for a valid index. So, let's preserve the former behavior that indcheckxmin does get set when there are potentially-broken HOT chains in this case. This change does not cause any pg_index update that wouldn't have happened anyway, so we're not re-introducing the previous bug with pg_index updates, and surely the case is not significant from a performance standpoint; so let's be as conservative as possible.
This commit is contained in:
parent
8a6d60fd0c
commit
1d6249d64d
@ -2494,7 +2494,12 @@ reindex_index(Oid indexId, bool skip_constraint_checks)
|
||||
*
|
||||
* 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.
|
||||
* found some still-broken HOT chains. If it did, we normally leave
|
||||
* indcheckxmin alone (note that index_build won't have changed it,
|
||||
* because this is a reindex). But if the index was invalid or not ready
|
||||
* and there were broken HOT chains, it seems best to force indcheckxmin
|
||||
* true, because the normal argument that the HOT chains couldn't conflict
|
||||
* with the index is suspect for an invalid index.
|
||||
*
|
||||
* Note that it is important to not update the pg_index entry if we don't
|
||||
* have to, because updating it will move the index's usability horizon
|
||||
@ -2519,10 +2524,12 @@ reindex_index(Oid indexId, bool skip_constraint_checks)
|
||||
if (!indexForm->indisvalid || !indexForm->indisready ||
|
||||
(indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain))
|
||||
{
|
||||
indexForm->indisvalid = true;
|
||||
indexForm->indisready = true;
|
||||
if (!indexInfo->ii_BrokenHotChain)
|
||||
indexForm->indcheckxmin = false;
|
||||
else if (!indexForm->indisvalid || !indexForm->indisready)
|
||||
indexForm->indcheckxmin = true;
|
||||
indexForm->indisvalid = true;
|
||||
indexForm->indisready = true;
|
||||
simple_heap_update(pg_index, &indexTuple->t_self, indexTuple);
|
||||
CatalogUpdateIndexes(pg_index, indexTuple);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user