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) 74 const char *curpage,
const char *targetpage,
75 int targetStart,
int targetEnd,
76 int validStart,
int validEnd);
95 sizeof(length) + length <=
sizeof(pageData->
delta));
98 memcpy(ptr, &offset,
sizeof(offset));
99 ptr +=
sizeof(offset);
100 memcpy(ptr, &length,
sizeof(length));
101 ptr +=
sizeof(length);
102 memcpy(ptr, data, length);
120 const char *curpage,
const char *targetpage,
121 int targetStart,
int targetEnd,
122 int validStart,
int validEnd)
130 if (validStart > targetStart)
132 fragmentBegin = targetStart;
133 targetStart = validStart;
137 loopEnd =
Min(targetEnd, validEnd);
143 if (curpage[i] != targetpage[i])
146 if (fragmentBegin < 0)
152 while (i < loopEnd && curpage[i] != targetpage[i])
166 while (i < loopEnd && curpage[i] == targetpage[i])
195 fragmentEnd - fragmentBegin,
196 targetpage + fragmentBegin);
203 if (loopEnd < targetEnd)
205 if (fragmentBegin < 0)
206 fragmentBegin = loopEnd;
207 fragmentEnd = targetEnd;
211 if (fragmentBegin >= 0)
214 fragmentEnd = targetEnd;
216 fragmentEnd - fragmentBegin,
217 targetpage + fragmentBegin);
228 int targetLower = ((
PageHeader) targetpage)->pd_lower,
229 targetUpper = ((
PageHeader) targetpage)->pd_upper,
253 memcpy(tmp.
data, curpage, BLCKSZ);
255 if (memcmp(tmp.
data, targetpage, targetLower) != 0 ||
256 memcmp(tmp.
data + targetUpper, targetpage + targetUpper,
257 BLCKSZ - targetUpper) != 0)
258 elog(
ERROR,
"result of generic xlog apply does not match");
312 else if (page->
buffer == buffer)
322 elog(
ERROR,
"maximum number %d of generic xlog buffers is exceeded",
323 MAX_GENERIC_XLOG_PAGES);
367 memset(page + pageHeader->
pd_lower, 0,
386 memset(page + pageHeader->
pd_lower, 0,
455 const char *ptr = delta;
456 const char *end = delta + deltaSize;
463 memcpy(&offset, ptr,
sizeof(offset));
464 ptr +=
sizeof(offset);
465 memcpy(&length, ptr,
sizeof(length));
466 ptr +=
sizeof(length);
468 memcpy(page + offset, ptr, length);
488 for (block_id = 0; block_id <= record->
max_block_id; block_id++)
519 memset(page + pageHeader->
pd_lower, 0,
528 for (block_id = 0; block_id <= record->
max_block_id; block_id++)
void XLogRegisterBufData(uint8 block_id, char *data, int len)
#define InvalidXLogRecPtr
void generic_redo(XLogReaderState *record)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
#define END_CRIT_SECTION()
#define XLogRecHasBlockRef(decoder, block_id)
#define START_CRIT_SECTION()
Page GenericXLogRegisterBuffer(GenericXLogState *state, Buffer buffer, int flags)
void mask_unused_space(Page page)
void generic_mask(char *page, BlockNumber blkno)
void pfree(void *pointer)
void UnlockReleaseBuffer(Buffer buffer)
char delta[MAX_DELTA_SIZE]
#define BufferIsInvalid(buffer)
PageData pages[MAX_GENERIC_XLOG_PAGES]
#define BufferGetPage(buffer)
static void computeDelta(PageData *pageData, Page curpage, Page targetpage)
#define REGBUF_FORCE_IMAGE
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
void mask_page_lsn_and_checksum(Page page)
static void applyPageRedo(Page page, const char *delta, Size deltaSize)
static void computeRegionDelta(PageData *pageData, const char *curpage, const char *targetpage, int targetStart, int targetEnd, int validStart, int validEnd)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
PageHeaderData * PageHeader
#define Assert(condition)
XLogRecPtr GenericXLogFinish(GenericXLogState *state)
#define BufferIsValid(bufnum)
#define RelationNeedsWAL(relation)
static void writeFragment(PageData *pageData, OffsetNumber offset, OffsetNumber len, const char *data)
PGAlignedBlock images[MAX_GENERIC_XLOG_PAGES]
void GenericXLogAbort(GenericXLogState *state)
#define MAX_GENERIC_XLOG_PAGES
void XLogBeginInsert(void)
#define PageSetLSN(page, lsn)
#define GENERIC_XLOG_FULL_IMAGE
GenericXLogState * GenericXLogStart(Relation relation)