Skip to content

Commit 24333ab

Browse files
knizhnikKonstantin Knizhnik
authored andcommitted
Update WAL buffers when restoring WAL at compute needed for LR (#324)
* Update WAL buffers when restoring WAL at compute needed for LR * Fix copying data in WAL buffers --------- Co-authored-by: Konstantin Knizhnik <[email protected]>
1 parent a136670 commit 24333ab

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/backend/access/transam/xlog.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9287,3 +9287,29 @@ SetWalWriterSleeping(bool sleeping)
92879287
XLogCtl->WalWriterSleeping = sleeping;
92889288
SpinLockRelease(&XLogCtl->info_lck);
92899289
}
9290+
9291+
void
9292+
XLogUpdateWalBuffers(char* data, XLogRecPtr start, size_t len)
9293+
{
9294+
XLogRecPtr end;
9295+
int idx;
9296+
XLogRecPtr pagebegptr;
9297+
9298+
LWLockAcquire(WALBufMappingLock, LW_EXCLUSIVE);
9299+
9300+
end = start + len;
9301+
idx = XLogRecPtrToBufIdx(end);
9302+
pagebegptr = XLogCtl->xlblocks[idx] - XLOG_BLCKSZ;
9303+
9304+
if (pagebegptr + XLOG_BLCKSZ >= end && pagebegptr < end)
9305+
{
9306+
/* Last page of the segment is present in WAL buffers */
9307+
char* page = &XLogCtl->pages[idx * XLOG_BLCKSZ];
9308+
size_t overlap = end - pagebegptr;
9309+
if (overlap <= len)
9310+
memcpy(page, data + len - overlap, overlap);
9311+
else
9312+
memcpy(page + overlap - len, data, len);
9313+
}
9314+
LWLockRelease(WALBufMappingLock);
9315+
}

src/include/access/xlogrecovery.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,6 @@ extern void RecoveryRequiresIntParameter(const char *param_name, int currValue,
155155

156156
extern void xlog_outdesc(StringInfo buf, XLogReaderState *record);
157157

158+
extern void XLogUpdateWalBuffers(char* data, XLogRecPtr start, size_t len);
159+
158160
#endif /* XLOGRECOVERY_H */

0 commit comments

Comments
 (0)