summaryrefslogtreecommitdiff
path: root/src/include/utils
diff options
context:
space:
mode:
authorNoah Misch2020-03-22 16:24:09 +0000
committerNoah Misch2020-03-22 16:24:09 +0000
commitde9396326edcbe5cafc06a72016f9d715c350e0e (patch)
tree39975a93da0cc43535fa87ad066d54a3f8867678 /src/include/utils
parentd0587f52b3bb898db3c0011954de6ae9adc076c8 (diff)
Revert "Skip WAL for new relfilenodes, under wal_level=minimal."
This reverts commit cb2fd7eac285b1b0a24eeb2b8ed4456b66c5a09f. Per numerous buildfarm members, it was incompatible with parallel query, and a test case assumed LP64. Back-patch to 9.5 (all supported versions). Discussion: https://postgr.es/m/20200321224920.GB1763544@rfd.leadboat.com
Diffstat (limited to 'src/include/utils')
-rw-r--r--src/include/utils/rel.h55
-rw-r--r--src/include/utils/relcache.h8
2 files changed, 15 insertions, 48 deletions
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 461f64e611a..39cdcddc2b1 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -66,45 +66,25 @@ typedef struct RelationData
/*----------
* rd_createSubid is the ID of the highest subtransaction the rel has
- * survived into or zero if the rel or its rd_node was created before the
- * current top transaction. (IndexStmt.oldNode leads to the case of a new
- * rel with an old rd_node.) rd_firstRelfilenodeSubid is the ID of the
- * highest subtransaction an rd_node change has survived into or zero if
- * rd_node matches the value it had at the start of the current top
- * transaction. (Rolling back the subtransaction that
- * rd_firstRelfilenodeSubid denotes would restore rd_node to the value it
- * had at the start of the current top transaction. Rolling back any
- * lower subtransaction would not.) Their accuracy is critical to
- * RelationNeedsWAL().
- *
- * rd_newRelfilenodeSubid is the ID of the highest subtransaction the
- * most-recent relfilenode change has survived into or zero if not changed
- * in the current transaction (or we have forgotten changing it). This
- * field is accurate when non-zero, but it can be zero when a relation has
- * multiple new relfilenodes within a single transaction, with one of them
- * occurring in a subsequently aborted subtransaction, e.g.
+ * survived into; or zero if the rel was not created in the current top
+ * transaction. This can be now be relied on, whereas previously it could
+ * be "forgotten" in earlier releases. Likewise, rd_newRelfilenodeSubid is
+ * the ID of the highest subtransaction the relfilenode change has
+ * survived into, or zero if not changed in the current transaction (or we
+ * have forgotten changing it). rd_newRelfilenodeSubid can be forgotten
+ * when a relation has multiple new relfilenodes within a single
+ * transaction, with one of them occurring in a subsequently aborted
+ * subtransaction, e.g.
* BEGIN;
* TRUNCATE t;
* SAVEPOINT save;
* TRUNCATE t;
* ROLLBACK TO save;
* -- rd_newRelfilenodeSubid is now forgotten
- *
- * If every rd_*Subid field is zero, they are read-only outside
- * relcache.c. Files that trigger rd_node changes by updating
- * pg_class.reltablespace and/or pg_class.relfilenode call
- * RelationAssumeNewRelfilenode() to update rd_*Subid.
- *
- * rd_droppedSubid is the ID of the highest subtransaction that a drop of
- * the rel has survived into. In entries visible outside relcache.c, this
- * is always zero.
*/
SubTransactionId rd_createSubid; /* rel was created in current xact */
- SubTransactionId rd_newRelfilenodeSubid; /* highest subxact changing
- * rd_node to current value */
- SubTransactionId rd_firstRelfilenodeSubid; /* highest subxact changing
- * rd_node to any value */
- SubTransactionId rd_droppedSubid; /* dropped with another Subid set */
+ SubTransactionId rd_newRelfilenodeSubid; /* new relfilenode assigned in
+ * current xact */
Form_pg_class rd_rel; /* RELATION tuple */
TupleDesc rd_att; /* tuple descriptor */
@@ -551,16 +531,9 @@ typedef struct ViewOptions
/*
* RelationNeedsWAL
* True if relation needs WAL.
- *
- * Returns false if wal_level = minimal and this relation is created or
- * truncated in the current transaction. See "Skipping WAL for New
- * RelFileNode" in src/backend/access/transam/README.
- */
-#define RelationNeedsWAL(relation) \
- ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
- (XLogIsNeeded() || \
- (relation->rd_createSubid == InvalidSubTransactionId && \
- relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId)))
+ */
+#define RelationNeedsWAL(relation) \
+ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
/*
* RelationUsesLocalBuffers
diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h
index 62239a09e81..d77f5beec68 100644
--- a/src/include/utils/relcache.h
+++ b/src/include/utils/relcache.h
@@ -106,10 +106,9 @@ extern Relation RelationBuildLocalRelation(const char *relname,
char relkind);
/*
- * Routines to manage assignment of new relfilenode to a relation
+ * Routine to manage assignment of new relfilenode to a relation
*/
extern void RelationSetNewRelfilenode(Relation relation, char persistence);
-extern void RelationAssumeNewRelfilenode(Relation relation);
/*
* Routines for flushing/rebuilding relcache entries in various scenarios
@@ -122,11 +121,6 @@ extern void RelationCacheInvalidate(void);
extern void RelationCloseSmgrByOid(Oid relationId);
-#ifdef USE_ASSERT_CHECKING
-extern void AssertPendingSyncs_RelationCache(void);
-#else
-#define AssertPendingSyncs_RelationCache() do {} while (0)
-#endif
extern void AtEOXact_RelationCache(bool isCommit);
extern void AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid,
SubTransactionId parentSubid);