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)
143 bool *topxid_included);
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");
279 regbuf->
flags = flags;
287#ifdef USE_ASSERT_CHECKING
295 if (
i == block_id || !regbuf_old->
in_use)
305 regbuf->in_use =
true;
324 elog(
ERROR,
"too many registered buffers");
330 regbuf->
block = blknum;
332 regbuf->
flags = flags;
340#ifdef USE_ASSERT_CHECKING
348 if (
i == block_id || !regbuf_old->
in_use)
358 regbuf->in_use =
true;
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);
495 TRACE_POSTGRESQL_WAL_INSERT(rmid, info);
512 bool topxid_included =
false;
526 &fpw_lsn, &num_fpi, &fpi_bytes,
530 fpi_bytes, topxid_included);
569 bool *topxid_included)
617 bool is_compressed =
false;
627 needs_backup =
false;
629 needs_backup =
false;
653 needs_data = !needs_backup;
671 uint16 compressed_len = 0;
729 rdt_datas_last = rdt_datas_last->
next;
745 bimg.
length = compressed_len;
758 elog(
ERROR,
"LZ4 is not supported by this build");
766 elog(
ERROR,
"zstd is not supported by this build");
777 rdt_datas_last->
len = compressed_len;
785 rdt_datas_last->
data = page;
786 rdt_datas_last->
len = BLCKSZ;
791 rdt_datas_last->
data = page;
795 rdt_datas_last = rdt_datas_last->
next;
797 rdt_datas_last->
data =
799 rdt_datas_last->
len =
807 *fpi_bytes += bimg.
length;
837 prev_regbuf = regbuf;
848 memcpy(scratch, &cbimg,
877 *topxid_included =
true;
894 errdetail_internal(
"Main data length is %" PRIu64
" bytes for a maximum of %u bytes.",
900 memcpy(scratch, &mainrdata_len_4b,
sizeof(
uint32));
901 scratch +=
sizeof(
uint32);
912 rdt_datas_last->
next = NULL;
940 errdetail_internal(
"WAL record would be %" PRIu64
" bytes (of maximum %u bytes); rmid %u flags %u.",
953 rechdr->
xl_crc = rdata_crc;
969 int32 orig_len = BLCKSZ - hole_length;
971 int32 extra_bytes = 0;
975 if (hole_length != 0)
978 memcpy(tmp.
data, page, hole_offset);
979 memcpy(tmp.
data + hole_offset,
980 page + (hole_offset + hole_length),
981 BLCKSZ - (hole_length + hole_offset));
1006 elog(
ERROR,
"LZ4 is not supported by this build");
1013 ZSTD_CLEVEL_DEFAULT);
1014 if (ZSTD_isError(
len))
1017 elog(
ERROR,
"zstd is not supported by this build");
1033 len + extra_bytes < orig_len)
1132 memcpy(copied_buffer.
data, origdata,
lower);
1136 memcpy(copied_buffer.
data, origdata, BLCKSZ);
1166 Page page,
bool page_std)
1217 while (
i < num_pages)
1271 return log_newpage(&rlocator, forknum, blkno, page, page_std);
1311 while (blkno < endblk)
1335 bufpack[nbufs++] =
buf;
1349 for (
i = 0;
i < nbufs;
i++)
1357 for (
i = 0;
i < nbufs;
i++)
1372#ifdef USE_ASSERT_CHECKING
1380 size_t max_required =
1390 "WAL record construction",
bool BufferIsLockedByMeInMode(Buffer buffer, int 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)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static Page BufferGetPage(Buffer buffer)
static Block BufferGetBlock(Buffer buffer)
#define BUFFER_LOCK_EXCLUSIVE
PageHeaderData * PageHeader
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static void PageSetLSN(Page page, XLogRecPtr lsn)
static XLogRecPtr PageGetLSN(const PageData *page)
#define MemSet(start, val, len)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
#define ereport(elevel,...)
volatile uint32 CritSectionCount
Assert(PointerIsAligned(start, uint64))
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
#define DELAY_CHKPT_START
struct RelFileLocator RelFileLocator
#define RelFileLocatorEquals(locator1, locator2)
struct XLogRecData * next
XLogRecData bkp_rdatas[2]
char compressed_page[COMPRESS_BUFSIZE]
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