mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +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:
@@ -448,8 +448,6 @@ extern XLogRecPtr gistXLogSplit(bool page_is_leaf,
|
||||
BlockNumber origrlink, GistNSN oldnsn,
|
||||
Buffer leftchild, bool markfollowright);
|
||||
|
||||
extern XLogRecPtr gistXLogAssignLSN(void);
|
||||
|
||||
/* gistget.c */
|
||||
extern bool gistgettuple(IndexScanDesc scan, ScanDirection dir);
|
||||
extern int64 gistgetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
|
||||
|
@@ -26,7 +26,6 @@
|
||||
/* #define XLOG_GIST_INSERT_COMPLETE 0x40 */ /* not used anymore */
|
||||
/* #define XLOG_GIST_CREATE_INDEX 0x50 */ /* not used anymore */
|
||||
#define XLOG_GIST_PAGE_DELETE 0x60
|
||||
#define XLOG_GIST_ASSIGN_LSN 0x70 /* nop, assign new LSN */
|
||||
|
||||
/*
|
||||
* Backup Blk 0: updated page.
|
||||
|
@@ -29,6 +29,7 @@
|
||||
|
||||
|
||||
/* "options" flag bits for heap_insert */
|
||||
#define HEAP_INSERT_SKIP_WAL TABLE_INSERT_SKIP_WAL
|
||||
#define HEAP_INSERT_SKIP_FSM TABLE_INSERT_SKIP_FSM
|
||||
#define HEAP_INSERT_FROZEN TABLE_INSERT_FROZEN
|
||||
#define HEAP_INSERT_NO_LOGICAL TABLE_INSERT_NO_LOGICAL
|
||||
|
@@ -23,7 +23,7 @@ typedef struct RewriteStateData *RewriteState;
|
||||
|
||||
extern RewriteState begin_heap_rewrite(Relation OldHeap, Relation NewHeap,
|
||||
TransactionId OldestXmin, TransactionId FreezeXid,
|
||||
MultiXactId MultiXactCutoff);
|
||||
MultiXactId MultiXactCutoff, bool use_wal);
|
||||
extern void end_heap_rewrite(RewriteState state);
|
||||
extern void rewrite_heap_tuple(RewriteState state, HeapTuple oldTuple,
|
||||
HeapTuple newTuple);
|
||||
|
@@ -128,7 +128,7 @@ typedef struct TM_FailureData
|
||||
} TM_FailureData;
|
||||
|
||||
/* "options" flag bits for table_tuple_insert */
|
||||
/* TABLE_INSERT_SKIP_WAL was 0x0001; RelationNeedsWAL() now governs */
|
||||
#define TABLE_INSERT_SKIP_WAL 0x0001
|
||||
#define TABLE_INSERT_SKIP_FSM 0x0002
|
||||
#define TABLE_INSERT_FROZEN 0x0004
|
||||
#define TABLE_INSERT_NO_LOGICAL 0x0008
|
||||
@@ -410,8 +410,9 @@ typedef struct TableAmRoutine
|
||||
|
||||
/*
|
||||
* Perform operations necessary to complete insertions made via
|
||||
* tuple_insert and multi_insert with a BulkInsertState specified. In-tree
|
||||
* access methods ceased to use this.
|
||||
* tuple_insert and multi_insert with a BulkInsertState specified. This
|
||||
* may for example be used to flush the relation, when the
|
||||
* TABLE_INSERT_SKIP_WAL option was used.
|
||||
*
|
||||
* Typically callers of tuple_insert and multi_insert will just pass all
|
||||
* the flags that apply to them, and each AM has to decide which of them
|
||||
@@ -1100,6 +1101,10 @@ table_compute_xid_horizon_for_tuples(Relation rel,
|
||||
* The options bitmask allows the caller to specify options that may change the
|
||||
* behaviour of the AM. The AM will ignore options that it does not support.
|
||||
*
|
||||
* If the TABLE_INSERT_SKIP_WAL option is specified, the new tuple doesn't
|
||||
* need to be logged to WAL, even for a non-temp relation. It is the AMs
|
||||
* choice whether this optimization is supported.
|
||||
*
|
||||
* If the TABLE_INSERT_SKIP_FSM option is specified, AMs are free to not reuse
|
||||
* free space in the relation. This can save some cycles when we know the
|
||||
* relation is new and doesn't contain useful amounts of free space.
|
||||
@@ -1319,7 +1324,9 @@ table_tuple_lock(Relation rel, ItemPointer tid, Snapshot snapshot,
|
||||
|
||||
/*
|
||||
* Perform operations necessary to complete insertions made via
|
||||
* tuple_insert and multi_insert with a BulkInsertState specified.
|
||||
* tuple_insert and multi_insert with a BulkInsertState specified. This
|
||||
* e.g. may e.g. used to flush the relation when inserting with
|
||||
* TABLE_INSERT_SKIP_WAL specified.
|
||||
*/
|
||||
static inline void
|
||||
table_finish_bulk_insert(Relation rel, int options)
|
||||
|
@@ -19,24 +19,18 @@
|
||||
#include "storage/smgr.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
/* GUC variables */
|
||||
extern int wal_skip_threshold;
|
||||
|
||||
extern SMgrRelation RelationCreateStorage(RelFileNode rnode, char relpersistence);
|
||||
extern void RelationDropStorage(Relation rel);
|
||||
extern void RelationPreserveStorage(RelFileNode rnode, bool atCommit);
|
||||
extern void RelationPreTruncate(Relation rel);
|
||||
extern void RelationTruncate(Relation rel, BlockNumber nblocks);
|
||||
extern void RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
|
||||
ForkNumber forkNum, char relpersistence);
|
||||
extern bool RelFileNodeSkippingWAL(RelFileNode rnode);
|
||||
|
||||
/*
|
||||
* These functions used to be in storage/smgr/smgr.c, which explains the
|
||||
* naming
|
||||
*/
|
||||
extern void smgrDoPendingDeletes(bool isCommit);
|
||||
extern void smgrDoPendingSyncs(bool isCommit);
|
||||
extern int smgrGetPendingDeletes(bool forCommit, RelFileNode **ptr);
|
||||
extern void AtSubCommit_smgr(void);
|
||||
extern void AtSubAbort_smgr(void);
|
||||
|
@@ -2772,9 +2772,6 @@ typedef struct IndexStmt
|
||||
bool if_not_exists; /* just do nothing if index already exists? */
|
||||
bool reset_default_tblspc; /* reset default_tablespace prior to
|
||||
* executing */
|
||||
SubTransactionId oldCreateSubid; /* rd_createSubid of oldNode */
|
||||
SubTransactionId oldFirstRelfilenodeSubid; /* rd_firstRelfilenodeSubid of
|
||||
* oldNode */
|
||||
} IndexStmt;
|
||||
|
||||
/* ----------------------
|
||||
|
@@ -49,9 +49,6 @@ typedef enum
|
||||
/* forward declared, to avoid having to expose buf_internals.h here */
|
||||
struct WritebackContext;
|
||||
|
||||
/* forward declared, to avoid including smgr.h here */
|
||||
struct SMgrRelationData;
|
||||
|
||||
/* in globals.c ... this duplicates miscadmin.h */
|
||||
extern PGDLLIMPORT int NBuffers;
|
||||
|
||||
@@ -192,7 +189,6 @@ extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation,
|
||||
ForkNumber forkNum);
|
||||
extern void FlushOneBuffer(Buffer buffer);
|
||||
extern void FlushRelationBuffers(Relation rel);
|
||||
extern void FlushRelationsAllBuffers(struct SMgrRelationData **smgrs, int nrels);
|
||||
extern void FlushDatabaseBuffers(Oid dbid);
|
||||
extern void DropRelFileNodeBuffers(RelFileNodeBackend rnode,
|
||||
ForkNumber forkNum, BlockNumber firstDelBlock);
|
||||
|
@@ -545,9 +545,6 @@ extern void LockReleaseSession(LOCKMETHODID lockmethodid);
|
||||
extern void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks);
|
||||
extern void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks);
|
||||
extern bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode);
|
||||
#ifdef USE_ASSERT_CHECKING
|
||||
extern HTAB *GetLockMethodLocalHash(void);
|
||||
#endif
|
||||
extern bool LockHasWaiters(const LOCKTAG *locktag,
|
||||
LOCKMODE lockmode, bool sessionLock);
|
||||
extern VirtualTransactionId *GetLockConflicts(const LOCKTAG *locktag,
|
||||
|
@@ -89,7 +89,6 @@ extern void smgrcloseall(void);
|
||||
extern void smgrclosenode(RelFileNodeBackend rnode);
|
||||
extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo);
|
||||
extern void smgrdounlink(SMgrRelation reln, bool isRedo);
|
||||
extern void smgrdosyncall(SMgrRelation *rels, int nrels);
|
||||
extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo);
|
||||
extern void smgrdounlinkfork(SMgrRelation reln, ForkNumber forknum, bool isRedo);
|
||||
extern void smgrextend(SMgrRelation reln, ForkNumber forknum,
|
||||
|
@@ -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 */
|
||||
@@ -226,10 +208,6 @@ typedef struct RelationData
|
||||
|
||||
/* use "struct" here to avoid needing to include pgstat.h: */
|
||||
struct PgStat_TableStatus *pgstat_info; /* statistics collection area */
|
||||
|
||||
SubTransactionId rd_firstRelfilenodeSubid; /* highest subxact changing
|
||||
* rd_node to any value */
|
||||
SubTransactionId rd_droppedSubid; /* dropped with another Subid set */
|
||||
} RelationData;
|
||||
|
||||
|
||||
@@ -542,16 +520,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
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user