mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Revert "Skip WAL for new relfilenodes, under wal_level=minimal."
This reverts commit cb2fd7eac2
. 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
This commit is contained in:
@@ -66,43 +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 */
|
||||
/* see end for rd_firstRelfilenodeSubid and rd_droppedSubid */
|
||||
SubTransactionId rd_newRelfilenodeSubid; /* new relfilenode assigned in
|
||||
* current xact */
|
||||
|
||||
Form_pg_class rd_rel; /* RELATION tuple */
|
||||
TupleDesc rd_att; /* tuple descriptor */
|
||||
@@ -215,10 +197,6 @@ typedef struct RelationData
|
||||
/* placed here to avoid ABI break before v12: */
|
||||
bool rd_partcheckvalid; /* true if list has been computed */
|
||||
MemoryContext rd_partcheckcxt; /* private cxt for rd_partcheck, if any */
|
||||
|
||||
SubTransactionId rd_firstRelfilenodeSubid; /* highest subxact changing
|
||||
* rd_node to any value */
|
||||
SubTransactionId rd_droppedSubid; /* dropped with another Subid set */
|
||||
} RelationData;
|
||||
|
||||
|
||||
@@ -538,16 +516,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
|
||||
|
Reference in New Issue
Block a user