mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +03:00
Until now, only selected bulk operations (e.g. COPY) did this. If a given relfilenode received both a WAL-skipping COPY and a WAL-logged operation (e.g. INSERT), recovery could lose tuples from the COPY. See src/backend/access/transam/README section "Skipping WAL for New RelFileNode" for the new coding rules. Maintainers of table access methods should examine that section. To maintain data durability, just before commit, we choose between an fsync of the relfilenode and copying its contents to WAL. A new GUC, wal_skip_threshold, guides that choice. If this change slows a workload that creates small, permanent relfilenodes under wal_level=minimal, try adjusting wal_skip_threshold. Users setting a timeout on COMMIT may need to adjust that timeout, and log_min_duration_statement analysis will reflect time consumption moving to COMMIT from commands like COPY. Internally, this requires a reliable determination of whether RollbackAndReleaseCurrentSubTransaction() would unlink a relation's current relfilenode. Introduce rd_firstRelfilenodeSubid. Amend the specification of rd_createSubid such that the field is zero when a new rel has an old rd_node. Make relcache.c retain entries for certain dropped relations until end of transaction. Back-patch to 9.5 (all supported versions). This introduces a new WAL record type, XLOG_GIST_ASSIGN_LSN, without bumping XLOG_PAGE_MAGIC. As always, update standby systems before master systems. This changes sizeof(RelationData) and sizeof(IndexStmt), breaking binary compatibility for affected extensions. (The most recent commit to affect the same class of extensions was 089e4d405d0f3b94c74a2c6a54357a84a681754b.) Kyotaro Horiguchi, reviewed (in earlier, similar versions) by Robert Haas. Heikki Linnakangas and Michael Paquier implemented earlier designs that materially clarified the problem. Reviewed, in earlier designs, by Andrew Dunstan, Andres Freund, Alvaro Herrera, Tom Lane, Fujii Masao, and Simon Riggs. Reported by Martijn van Oosterhout. Discussion: https://postgr.es/m/20150702220524.GA9392@svana.org
115 lines
3.3 KiB
C
115 lines
3.3 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* gistxlog.h
|
|
* gist xlog routines
|
|
*
|
|
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/access/gistxlog.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef GIST_XLOG_H
|
|
#define GIST_XLOG_H
|
|
|
|
#include "access/gist.h"
|
|
#include "access/xlogreader.h"
|
|
#include "lib/stringinfo.h"
|
|
|
|
#define XLOG_GIST_PAGE_UPDATE 0x00
|
|
#define XLOG_GIST_DELETE 0x10 /* delete leaf index tuples for a
|
|
* page */
|
|
#define XLOG_GIST_PAGE_REUSE 0x20 /* old page is about to be reused
|
|
* from FSM */
|
|
#define XLOG_GIST_PAGE_SPLIT 0x30
|
|
/* #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.
|
|
* Backup Blk 1: If this operation completes a page split, by inserting a
|
|
* downlink for the split page, the left half of the split
|
|
*/
|
|
typedef struct gistxlogPageUpdate
|
|
{
|
|
/* number of deleted offsets */
|
|
uint16 ntodelete;
|
|
uint16 ntoinsert;
|
|
|
|
/*
|
|
* In payload of blk 0 : 1. todelete OffsetNumbers 2. tuples to insert
|
|
*/
|
|
} gistxlogPageUpdate;
|
|
|
|
/*
|
|
* Backup Blk 0: Leaf page, whose index tuples are deleted.
|
|
*/
|
|
typedef struct gistxlogDelete
|
|
{
|
|
TransactionId latestRemovedXid;
|
|
uint16 ntodelete; /* number of deleted offsets */
|
|
|
|
/*
|
|
* In payload of blk 0 : todelete OffsetNumbers
|
|
*/
|
|
} gistxlogDelete;
|
|
|
|
#define SizeOfGistxlogDelete (offsetof(gistxlogDelete, ntodelete) + sizeof(uint16))
|
|
|
|
/*
|
|
* Backup Blk 0: If this operation completes a page split, by inserting a
|
|
* downlink for the split page, the left half of the split
|
|
* Backup Blk 1 - npage: split pages (1 is the original page)
|
|
*/
|
|
typedef struct gistxlogPageSplit
|
|
{
|
|
BlockNumber origrlink; /* rightlink of the page before split */
|
|
GistNSN orignsn; /* NSN of the page before split */
|
|
bool origleaf; /* was splitted page a leaf page? */
|
|
|
|
uint16 npage; /* # of pages in the split */
|
|
bool markfollowright; /* set F_FOLLOW_RIGHT flags */
|
|
|
|
/*
|
|
* follow: 1. gistxlogPage and array of IndexTupleData per page
|
|
*/
|
|
} gistxlogPageSplit;
|
|
|
|
/*
|
|
* Backup Blk 0: page that was deleted.
|
|
* Backup Blk 1: parent page, containing the downlink to the deleted page.
|
|
*/
|
|
typedef struct gistxlogPageDelete
|
|
{
|
|
FullTransactionId deleteXid; /* last Xid which could see page in scan */
|
|
OffsetNumber downlinkOffset; /* Offset of downlink referencing this
|
|
* page */
|
|
} gistxlogPageDelete;
|
|
|
|
#define SizeOfGistxlogPageDelete (offsetof(gistxlogPageDelete, downlinkOffset) + sizeof(OffsetNumber))
|
|
|
|
|
|
/*
|
|
* This is what we need to know about page reuse, for hot standby.
|
|
*/
|
|
typedef struct gistxlogPageReuse
|
|
{
|
|
RelFileNode node;
|
|
BlockNumber block;
|
|
FullTransactionId latestRemovedFullXid;
|
|
} gistxlogPageReuse;
|
|
|
|
#define SizeOfGistxlogPageReuse (offsetof(gistxlogPageReuse, latestRemovedFullXid) + sizeof(FullTransactionId))
|
|
|
|
extern void gist_redo(XLogReaderState *record);
|
|
extern void gist_desc(StringInfo buf, XLogReaderState *record);
|
|
extern const char *gist_identify(uint8 info);
|
|
extern void gist_xlog_startup(void);
|
|
extern void gist_xlog_cleanup(void);
|
|
extern void gist_mask(char *pagedata, BlockNumber blkno);
|
|
|
|
#endif
|