51#define LZ4_MAX_BLCKSZ LZ4_COMPRESSBOUND(BLCKSZ)
53#define LZ4_MAX_BLCKSZ 0
57#define ZSTD_MAX_BLCKSZ ZSTD_COMPRESSBOUND(BLCKSZ)
59#define ZSTD_MAX_BLCKSZ 0
62#define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ)
65#define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ)
119#define SizeOfXlogOrigin (sizeof(ReplOriginId) + sizeof(char))
120#define SizeOfXLogTransactionId (sizeof(TransactionId) + sizeof(char))
122#define HEADER_SCRATCH_SIZE \
123 (SizeOfXLogRecord + \
124 MaxSizeOfXLogRecordBlockHeader * (XLR_MAX_BLOCK_ID + 1) + \
125 SizeOfXLogRecordDataHeaderLong + SizeOfXlogOrigin + \
126 SizeOfXLogTransactionId)
161 elog(
ERROR,
"cannot make new WAL entries during recovery");
164 elog(
ERROR,
"XLogBeginInsert was already called");
198 elog(
ERROR,
"maximum number of WAL record block references exceeded");
199 nbuffers = max_block_id + 1;
263#ifdef USE_ASSERT_CHECKING
275 elog(
ERROR,
"too many registered buffers");
291#ifdef USE_ASSERT_CHECKING
328 elog(
ERROR,
"too many registered buffers");
344#ifdef USE_ASSERT_CHECKING
423 elog(
ERROR,
"no block with id %d registered with WAL insertion",
440 errdetail_internal(
"Registering more than maximum %u bytes allowed to block %u: current %u bytes, adding %u bytes.",
488 elog(
ERROR,
"XLogBeginInsert was not called");
497 elog(
PANIC,
"invalid xlog info mask %02X", info);
703 if (
regbuf->rdata_len == 0)
712 bkpb.data_length = 0;
748 bimg.hole_offset = 0;
749 cbimg.hole_length = 0;
755 bimg.hole_offset = 0;
756 cbimg.hole_length = 0;
813 elog(
ERROR,
"LZ4 is not supported by this build");
821 elog(
ERROR,
"zstd is not supported by this build");
838 if (
cbimg.hole_length == 0)
853 page + (
bimg.hole_offset +
cbimg.hole_length);
859 total_len +=
bimg.length;
879 total_len +=
regbuf->rdata_len;
1030 if (hole_length != 0)
1035 page + (hole_offset + hole_length),
1036 BLCKSZ - (hole_length + hole_offset));
1061 elog(
ERROR,
"LZ4 is not supported by this build");
1072 elog(
ERROR,
"zstd is not supported by this build");
1192 Page page,
bool page_std)
1243 while (
i < num_pages)
1297 return log_newpage(&rlocator, forknum, blkno, page, page_std);
1399#ifdef USE_ASSERT_CHECKING
1417 "WAL record construction",
bool BufferIsLockedByMeInMode(Buffer buffer, BufferLockMode mode)
void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
bool BufferIsDirty(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)
@ BUFFER_LOCK_SHARE_EXCLUSIVE
static void LockBuffer(Buffer buffer, BufferLockMode mode)
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)
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
int int errdetail_internal(const char *fmt,...) pg_attribute_printf(1
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
#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)
ReplOriginXactState replorigin_xact_state
#define InvalidReplOriginId
#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 RelationNeedsWAL(relation)
#define RelationIsPermanent(relation)
#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)
XLogRecPtr GetFakeLSNForUnloggedRel(void)
XLogRecPtr GetXLogInsertEndRecPtr(void)
XLogRecPtr XLogAssignLSN(void)
bool * wal_consistency_checking
#define XLOG_INCLUDE_ORIGIN
#define SizeOfXLogLongPHD
#define XLogRecPtrIsValid(r)
#define FirstNormalUnloggedLSN
#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)
XLogRecPtr XLogGetFakeLSN(Relation rel)
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