Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix rd_firstRelfilenodeSubid for nailed relations, in parallel workers.
authorNoah Misch <noah@leadboat.com>
Thu, 10 Sep 2020 01:50:24 +0000 (18:50 -0700)
committerNoah Misch <noah@leadboat.com>
Thu, 10 Sep 2020 01:50:32 +0000 (18:50 -0700)
Move applicable code out of RelationBuildDesc(), which nailed relations
bypass.  Non-assert builds experienced no known problems.  Back-patch to
v13, where commit c6b92041d38512a4176ed76ad06f713d2e6c01a8 introduced
rd_firstRelfilenodeSubid.

Kyotaro Horiguchi.  Reported by Justin Pryzby.

Discussion: https://postgr.es/m/20200907023737.GA7158@telsasoft.com

src/backend/utils/cache/relcache.c
src/test/regress/expected/reindex_catalog.out
src/test/regress/sql/reindex_catalog.sql

index 0b9eb00d2de4370b41120f209673b4ff4522e6f5..9c9cb6377a5ef8b41f4b2f3815592a72348d8bdb 100644 (file)
@@ -1242,14 +1242,6 @@ RelationBuildDesc(Oid targetRelId, bool insertIt)
    if (insertIt)
        RelationCacheInsert(relation, true);
 
-   /*
-    * For RelationNeedsWAL() to answer correctly on parallel workers, restore
-    * rd_firstRelfilenodeSubid.  No subtransactions start or end while in
-    * parallel mode, so the specific SubTransactionId does not matter.
-    */
-   if (IsParallelWorker() && RelFileNodeSkippingWAL(relation->rd_node))
-       relation->rd_firstRelfilenodeSubid = TopSubTransactionId;
-
    /* It's fully valid */
    relation->rd_isvalid = true;
 
@@ -1272,6 +1264,8 @@ RelationBuildDesc(Oid targetRelId, bool insertIt)
 static void
 RelationInitPhysicalAddr(Relation relation)
 {
+   Oid         oldnode = relation->rd_node.relNode;
+
    /* these relations kinds never have storage */
    if (!RELKIND_HAS_STORAGE(relation->rd_rel->relkind))
        return;
@@ -1329,6 +1323,19 @@ RelationInitPhysicalAddr(Relation relation)
            elog(ERROR, "could not find relation mapping for relation \"%s\", OID %u",
                 RelationGetRelationName(relation), relation->rd_id);
    }
+
+   /*
+    * For RelationNeedsWAL() to answer correctly on parallel workers, restore
+    * rd_firstRelfilenodeSubid.  No subtransactions start or end while in
+    * parallel mode, so the specific SubTransactionId does not matter.
+    */
+   if (IsParallelWorker() && oldnode != relation->rd_node.relNode)
+   {
+       if (RelFileNodeSkippingWAL(relation->rd_node))
+           relation->rd_firstRelfilenodeSubid = TopSubTransactionId;
+       else
+           relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
+   }
 }
 
 /*
index 4b5fba4949391053276fabcebc4c28cb9a847238..204f056c9a56c7bbd327bfe70005863828cc7e1d 100644 (file)
@@ -36,3 +36,13 @@ REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
 REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
 REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
 REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
+-- Check the same REINDEX INDEX statements under parallelism.
+BEGIN;
+SET min_parallel_table_scan_size = 0;
+REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical
+REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical
+REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
+REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
+REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
+REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
+ROLLBACK;
index 87ecf52244f1ee06e2fc4e59c00b4131fb1a109f..8203641cf9d2d5da8265f63597d9181aecae82c8 100644 (file)
@@ -39,3 +39,14 @@ REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
 REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
 REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
 REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
+
+-- Check the same REINDEX INDEX statements under parallelism.
+BEGIN;
+SET min_parallel_table_scan_size = 0;
+REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical
+REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical
+REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical
+REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical
+REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical
+REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical
+ROLLBACK;