Set indcheckxmin true when REINDEX fixes an invalid or not-ready index.
authorTom Lane <[email protected]>
Wed, 20 Apr 2011 23:01:30 +0000 (19:01 -0400)
committerTom Lane <[email protected]>
Wed, 20 Apr 2011 23:01:30 +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 a074150b63026384a14b5f4995401b0d10e1e9a1..178f6288bbf514e69dbe9c27640feb3a546e5b54 100644 (file)
@@ -2365,7 +2365,12 @@ reindex_index(Oid indexId)
         *
         * 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
@@ -2389,10 +2394,12 @@ reindex_index(Oid indexId)
        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);
        }