]> granicus.if.org Git - postgresql/commitdiff
Set indcheckxmin true when REINDEX fixes an invalid or not-ready index.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Apr 2011 23:01:20 +0000 (19:01 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Apr 2011 23:01:20 +0000 (19:01 -0400)
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.

src/backend/catalog/index.c

index 2ccb9961122b929e88321b95151c4a97964ecf7c..6c81d57c85f8d6e73b6720531b9a78311d0a5d43 100644 (file)
@@ -2800,7 +2800,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
@@ -2825,10 +2830,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);
                }