50#define LZ4_MAX_BLCKSZ LZ4_COMPRESSBOUND(BLCKSZ)
52#define LZ4_MAX_BLCKSZ 0
56#define ZSTD_MAX_BLCKSZ ZSTD_COMPRESSBOUND(BLCKSZ)
58#define ZSTD_MAX_BLCKSZ 0
61#define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ)
64#define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ)
118#define SizeOfXlogOrigin (sizeof(RepOriginId) + sizeof(char))
119#define SizeOfXLogTransactionId (sizeof(TransactionId) + sizeof(char))
121#define HEADER_SCRATCH_SIZE \
122 (SizeOfXLogRecord + \
123 MaxSizeOfXLogRecordBlockHeader * (XLR_MAX_BLOCK_ID + 1) + \
124 SizeOfXLogRecordDataHeaderLong + SizeOfXlogOrigin + \
125 SizeOfXLogTransactionId)
160 elog(
ERROR,
"cannot make new WAL entries during recovery");
163 elog(
ERROR,
"XLogBeginInsert was already called");
197 elog(
ERROR,
"maximum number of WAL record block references exceeded");
198 nbuffers = max_block_id + 1;
262#ifdef USE_ASSERT_CHECKING
271 elog(
ERROR,
"too many registered buffers");
287#ifdef USE_ASSERT_CHECKING
324 elog(
ERROR,
"too many registered buffers");
340#ifdef USE_ASSERT_CHECKING
419 elog(
ERROR,
"no block with id %d registered with WAL insertion",
436 errdetail_internal(
"Registering more than maximum %u bytes allowed to block %u: current %u bytes, adding %u bytes.",
484 elog(
ERROR,
"XLogBeginInsert was not called");
493 elog(
PANIC,
"invalid xlog info mask %02X", info);
648 if (
regbuf->rdata_len == 0)
657 bkpb.data_length = 0;
693 bimg.hole_offset = 0;
694 cbimg.hole_length = 0;
700 bimg.hole_offset = 0;
701 cbimg.hole_length = 0;
758 elog(
ERROR,
"LZ4 is not supported by this build");
766 elog(
ERROR,
"zstd is not supported by this build");
783 if (
cbimg.hole_length == 0)
798 page + (
bimg.hole_offset +
cbimg.hole_length);
804 total_len +=
bimg.length;
824 total_len +=
regbuf->rdata_len;
975 if (hole_length != 0)
980 page + (hole_offset + hole_length),
981 BLCKSZ - (hole_length + hole_offset));
1006 elog(
ERROR,
"LZ4 is not supported by this build");
1017 elog(
ERROR,
"zstd is not supported by this build");
1166 Page page,
bool page_std)
1217 while (
i < num_pages)
1271 return log_newpage(&rlocator, forknum, blkno, page, page_std);
1372#ifdef USE_ASSERT_CHECKING
1390 "WAL record construction",
bool BufferIsLockedByMeInMode(Buffer buffer, BufferLockMode mode)
void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
bool BufferIsDirty(Buffer buffer)
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static Page BufferGetPage(Buffer buffer)
static Block BufferGetBlock(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
PageHeaderData * PageHeader
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static void PageSetLSN(Page page, XLogRecPtr lsn)
static XLogRecPtr PageGetLSN(const PageData *page)
#define Assert(condition)
#define MemSet(start, val, len)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
#define ereport(elevel,...)
volatile uint32 CritSectionCount
void * MemoryContextAlloc(MemoryContext context, Size size)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void * repalloc(void *pointer, Size size)
MemoryContext TopMemoryContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define AllocSizeIsValid(size)
#define IsBootstrapProcessingMode()
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define END_CRIT_SECTION()
Datum lower(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)
RepOriginId replorigin_session_origin
#define InvalidRepOriginId
#define XLOG_FPI_FOR_HINT
#define COMP_CRC32C(crc, data, len)
const PGLZ_Strategy *const PGLZ_strategy_default
int32 pglz_compress(const char *source, int32 slen, char *dest, const PGLZ_Strategy *strategy)
static rewind_source * source
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define DELAY_CHKPT_START
#define RelFileLocatorEquals(locator1, locator2)
struct XLogRecData * next
Datum batch_start(PG_FUNCTION_ARGS)
TransactionId GetTopTransactionIdIfAny(void)
TransactionId GetCurrentTransactionIdIfAny(void)
bool IsSubxactTopXidLogPending(void)
void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
XLogRecPtr XLogInsertRecord(XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, int num_fpi, uint64 fpi_bytes, bool topxid_included)
XLogRecPtr GetRedoRecPtr(void)
static XLogRecPtr RedoRecPtr
bool XLogInsertAllowed(void)
bool * wal_consistency_checking
#define XLOG_INCLUDE_ORIGIN
#define SizeOfXLogLongPHD
#define XLogRecPtrIsValid(r)
#define InvalidXLogRecPtr
static XLogRecData * mainrdata_head
static bool XLogCompressBackupBlock(const PageData *page, uint16 hole_offset, uint16 hole_length, void *dest, uint16 *dlen)
XLogRecPtr XLogSimpleInsertInt64(RmgrId rmid, uint8 info, int64 value)
static int max_registered_buffers
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
static uint8 curinsert_flags
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
bool XLogCheckBufferNeedsBackup(Buffer buffer)
void XLogRegisterData(const void *data, uint32 len)
static uint64 mainrdata_len
XLogRecPtr XLogSaveBufferForHint(Buffer buffer, bool buffer_std)
static bool begininsert_called
static int max_registered_block_id
XLogRecPtr log_newpage(RelFileLocator *rlocator, ForkNumber forknum, BlockNumber blkno, Page page, bool page_std)
void InitXLogInsert(void)
void XLogSetRecordFlags(uint8 flags)
void log_newpages(RelFileLocator *rlocator, ForkNumber forknum, int num_pages, BlockNumber *blknos, Page *pages, bool page_std)
void XLogRegisterBlock(uint8 block_id, RelFileLocator *rlocator, ForkNumber forknum, BlockNumber blknum, const PageData *page, uint8 flags)
static XLogRecData * mainrdata_last
static MemoryContext xloginsert_cxt
void log_newpage_range(Relation rel, ForkNumber forknum, BlockNumber startblk, BlockNumber endblk, bool page_std)
void XLogResetInsertion(void)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)
static XLogRecData hdr_rdt
static XLogRecData * XLogRecordAssemble(RmgrId rmid, uint8 info, XLogRecPtr RedoRecPtr, bool doPageWrites, XLogRecPtr *fpw_lsn, int *num_fpi, uint64 *fpi_bytes, bool *topxid_included)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
static char * hdr_scratch
static XLogRecData * rdatas
void XLogBeginInsert(void)
void XLogEnsureRecordSpace(int max_block_id, int ndatas)
static registered_buffer * registered_buffers
#define HEADER_SCRATCH_SIZE
#define XLR_NORMAL_MAX_BLOCK_ID
#define REGBUF_FORCE_IMAGE
#define XLR_NORMAL_RDATAS
size_t DecodeXLogRecordRequiredSpace(size_t xl_tot_len)
#define SizeOfXLogRecordBlockImageHeader
#define XLogRecordMaxSize
#define BKPIMAGE_COMPRESS_ZSTD
#define BKPBLOCK_HAS_DATA
#define BKPIMAGE_HAS_HOLE
#define XLR_BLOCK_ID_DATA_LONG
#define BKPBLOCK_WILL_INIT
#define XLR_RMGR_INFO_MASK
#define BKPIMAGE_COMPRESS_LZ4
#define XLR_BLOCK_ID_TOPLEVEL_XID
#define XLR_BLOCK_ID_DATA_SHORT
#define SizeOfXLogRecordBlockCompressHeader
#define BKPBLOCK_SAME_REL
#define XLR_SPECIAL_REL_UPDATE
#define SizeOfXLogRecordBlockHeader
#define BKPIMAGE_COMPRESS_PGLZ
#define XLR_BLOCK_ID_ORIGIN
#define BKPBLOCK_HAS_IMAGE
#define XLR_CHECK_CONSISTENCY