49 #define LZ4_MAX_BLCKSZ LZ4_COMPRESSBOUND(BLCKSZ)
51 #define LZ4_MAX_BLCKSZ 0
55 #define ZSTD_MAX_BLCKSZ ZSTD_COMPRESSBOUND(BLCKSZ)
57 #define ZSTD_MAX_BLCKSZ 0
60 #define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ)
63 #define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ)
117 #define SizeOfXlogOrigin (sizeof(RepOriginId) + sizeof(char))
118 #define SizeOfXLogTransactionId (sizeof(TransactionId) + sizeof(char))
120 #define HEADER_SCRATCH_SIZE \
121 (SizeOfXLogRecord + \
122 MaxSizeOfXLogRecordBlockHeader * (XLR_MAX_BLOCK_ID + 1) + \
123 SizeOfXLogRecordDataHeaderLong + SizeOfXlogOrigin + \
124 SizeOfXLogTransactionId)
141 bool *topxid_included);
158 elog(
ERROR,
"cannot make new WAL entries during recovery");
161 elog(
ERROR,
"XLogBeginInsert was already called");
195 elog(
ERROR,
"maximum number of WAL record block references exceeded");
196 nbuffers = max_block_id + 1;
254 elog(
ERROR,
"too many registered buffers");
262 regbuf->
flags = flags;
270 #ifdef USE_ASSERT_CHECKING
278 if (
i == block_id || !regbuf_old->
in_use)
288 regbuf->in_use =
true;
307 elog(
ERROR,
"too many registered buffers");
313 regbuf->
block = blknum;
315 regbuf->
flags = flags;
323 #ifdef USE_ASSERT_CHECKING
331 if (
i == block_id || !regbuf_old->
in_use)
341 regbuf->in_use =
true;
402 elog(
ERROR,
"no block with id %d registered with WAL insertion",
419 errdetail_internal(
"Registering more than maximum %u bytes allowed to block %u: current %u bytes, adding %u bytes.",
467 elog(
ERROR,
"XLogBeginInsert was not called");
476 elog(
PANIC,
"invalid xlog info mask %02X", info);
478 TRACE_POSTGRESQL_WAL_INSERT(rmid, info);
495 bool topxid_included =
false;
508 &fpw_lsn, &num_fpi, &topxid_included);
537 XLogRecPtr *fpw_lsn,
int *num_fpi,
bool *topxid_included)
540 uint64 total_len = 0;
585 bool is_compressed =
false;
595 needs_backup =
false;
597 needs_backup =
false;
621 needs_data = !needs_backup;
639 uint16 compressed_len = 0;
697 rdt_datas_last = rdt_datas_last->
next;
713 bimg.
length = compressed_len;
726 elog(
ERROR,
"LZ4 is not supported by this build");
734 elog(
ERROR,
"zstd is not supported by this build");
745 rdt_datas_last->
len = compressed_len;
753 rdt_datas_last->
data = page;
754 rdt_datas_last->
len = BLCKSZ;
759 rdt_datas_last->
data = page;
763 rdt_datas_last = rdt_datas_last->
next;
765 rdt_datas_last->
data =
767 rdt_datas_last->
len =
802 prev_regbuf = regbuf;
813 memcpy(scratch, &cbimg,
842 *topxid_included =
true;
865 memcpy(scratch, &mainrdata_len_4b,
sizeof(
uint32));
866 scratch +=
sizeof(
uint32);
877 rdt_datas_last->
next = NULL;
906 errdetail_internal(
"WAL record would be %llu bytes (of maximum %u bytes); rmid %u flags %u.",
919 rechdr->
xl_crc = rdata_crc;
935 int32 orig_len = BLCKSZ - hole_length;
937 int32 extra_bytes = 0;
941 if (hole_length != 0)
945 memcpy(
source, page, hole_offset);
946 memcpy(
source + hole_offset,
947 page + (hole_offset + hole_length),
948 BLCKSZ - (hole_length + hole_offset));
972 elog(
ERROR,
"LZ4 is not supported by this build");
979 ZSTD_CLEVEL_DEFAULT);
980 if (ZSTD_isError(
len))
983 elog(
ERROR,
"zstd is not supported by this build");
999 len + extra_bytes < orig_len)
1098 memcpy(copied_buffer.
data, origdata,
lower);
1102 memcpy(copied_buffer.
data, origdata, BLCKSZ);
1132 Page page,
bool page_std)
1183 while (
i < num_pages)
1185 int batch_start =
i;
1200 for (
j = batch_start;
j <
i;
j++)
1237 return log_newpage(&rlocator, forknum, blkno, page, page_std);
1277 while (blkno < endblk)
1301 bufpack[nbufs++] =
buf;
1315 for (
i = 0;
i < nbufs;
i++)
1323 for (
i = 0;
i < nbufs;
i++)
1338 #ifdef USE_ASSERT_CHECKING
1354 "WAL record construction",
void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
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
#define SizeOfPageHeaderData
static bool PageIsNew(Page page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static XLogRecPtr PageGetLSN(Page page)
#define MemSet(start, val, len)
elog(ERROR, "%s: %s", p2, msg)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
#define ereport(elevel,...)
volatile uint32 CritSectionCount
Assert(fmt[strlen(fmt) - 1] !='\n')
MemoryContext TopMemoryContext
void * MemoryContextAllocZero(MemoryContext context, Size size)
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
#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]
TransactionId GetTopTransactionIdIfAny(void)
TransactionId GetCurrentTransactionIdIfAny(void)
bool IsSubxactTopXidLogPending(void)
void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
XLogRecPtr GetRedoRecPtr(void)
static XLogRecPtr RedoRecPtr
XLogRecPtr XLogInsertRecord(XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, int num_fpi, bool topxid_included)
bool XLogInsertAllowed(void)
bool * wal_consistency_checking
#define XLOG_INCLUDE_ORIGIN
#define SizeOfXLogLongPHD
#define InvalidXLogRecPtr
void XLogRegisterData(char *data, uint32 len)
static XLogRecData * mainrdata_head
void XLogRegisterBlock(uint8 block_id, RelFileLocator *rlocator, ForkNumber forknum, BlockNumber blknum, Page page, uint8 flags)
static int max_registered_buffers
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
static uint8 curinsert_flags
bool XLogCheckBufferNeedsBackup(Buffer buffer)
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 XLogRegisterBufData(uint8 block_id, char *data, uint32 len)
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
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
static XLogRecData * XLogRecordAssemble(RmgrId rmid, uint8 info, XLogRecPtr RedoRecPtr, bool doPageWrites, XLogRecPtr *fpw_lsn, int *num_fpi, bool *topxid_included)
static char * hdr_scratch
static XLogRecData * rdatas
void XLogBeginInsert(void)
void XLogEnsureRecordSpace(int max_block_id, int ndatas)
static registered_buffer * registered_buffers
static bool XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length, char *dest, uint16 *dlen)
#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