46 #define FRAGMENT_HEADER_SIZE (2 * sizeof(OffsetNumber))
47 #define MATCH_THRESHOLD FRAGMENT_HEADER_SIZE
48 #define MAX_DELTA_SIZE (BLCKSZ + 2 * FRAGMENT_HEADER_SIZE)
77 const char *curpage,
const char *targetpage,
78 int targetStart,
int targetEnd,
79 int validStart,
int validEnd);
98 sizeof(length) + length <=
sizeof(pageData->
delta));
101 memcpy(ptr, &offset,
sizeof(offset));
102 ptr +=
sizeof(offset);
103 memcpy(ptr, &length,
sizeof(length));
104 ptr +=
sizeof(length);
105 memcpy(ptr,
data, length);
123 const char *curpage,
const char *targetpage,
124 int targetStart,
int targetEnd,
125 int validStart,
int validEnd)
133 if (validStart > targetStart)
135 fragmentBegin = targetStart;
136 targetStart = validStart;
140 loopEnd =
Min(targetEnd, validEnd);
146 if (curpage[
i] != targetpage[
i])
149 if (fragmentBegin < 0)
155 while (
i < loopEnd && curpage[
i] != targetpage[
i])
169 while (
i < loopEnd && curpage[
i] == targetpage[
i])
198 fragmentEnd - fragmentBegin,
199 targetpage + fragmentBegin);
206 if (loopEnd < targetEnd)
208 if (fragmentBegin < 0)
209 fragmentBegin = loopEnd;
210 fragmentEnd = targetEnd;
214 if (fragmentBegin >= 0)
217 fragmentEnd = targetEnd;
219 fragmentEnd - fragmentBegin,
220 targetpage + fragmentBegin);
231 int targetLower = ((
PageHeader) targetpage)->pd_lower,
232 targetUpper = ((
PageHeader) targetpage)->pd_upper,
256 memcpy(tmp.
data, curpage, BLCKSZ);
258 if (memcmp(tmp.
data, targetpage, targetLower) != 0 ||
259 memcmp(tmp.
data + targetUpper, targetpage + targetUpper,
260 BLCKSZ - targetUpper) != 0)
261 elog(
ERROR,
"result of generic xlog apply does not match");
317 else if (page->
buffer == buffer)
327 elog(
ERROR,
"maximum number %d of generic xlog buffers is exceeded",
372 memset(page + pageHeader->
pd_lower, 0,
391 memset(page + pageHeader->
pd_lower, 0,
460 const char *ptr = delta;
461 const char *end = delta + deltaSize;
468 memcpy(&offset, ptr,
sizeof(offset));
469 ptr +=
sizeof(offset);
470 memcpy(&length, ptr,
sizeof(length));
471 ptr +=
sizeof(length);
473 memcpy(page + offset, ptr, length);
524 memset(page + pageHeader->
pd_lower, 0,
#define BufferIsInvalid(buffer)
void mask_page_lsn_and_checksum(Page page)
void mask_unused_space(Page page)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
PageHeaderData * PageHeader
static void PageSetLSN(Page page, XLogRecPtr lsn)
elog(ERROR, "%s: %s", p2, msg)
Page GenericXLogRegisterBuffer(GenericXLogState *state, Buffer buffer, int flags)
static void computeRegionDelta(PageData *pageData, const char *curpage, const char *targetpage, int targetStart, int targetEnd, int validStart, int validEnd)
static void writeFragment(PageData *pageData, OffsetNumber offset, OffsetNumber length, const char *data)
static void applyPageRedo(Page page, const char *delta, Size deltaSize)
void generic_redo(XLogReaderState *record)
static void computeDelta(PageData *pageData, Page curpage, Page targetpage)
GenericXLogState * GenericXLogStart(Relation relation)
void generic_mask(char *page, BlockNumber blkno)
XLogRecPtr GenericXLogFinish(GenericXLogState *state)
void GenericXLogAbort(GenericXLogState *state)
#define GENERIC_XLOG_FULL_IMAGE
#define MAX_GENERIC_XLOG_PAGES
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * palloc_aligned(Size size, Size alignto, int flags)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define RelationNeedsWAL(relation)
PGIOAlignedBlock images[MAX_GENERIC_XLOG_PAGES]
PageData pages[MAX_GENERIC_XLOG_PAGES]
char delta[MAX_DELTA_SIZE]
#define InvalidXLogRecPtr
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBufData(uint8 block_id, char *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)
#define REGBUF_FORCE_IMAGE
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
#define XLogRecMaxBlockId(decoder)
#define XLogRecHasBlockRef(decoder, block_id)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)