1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2026-06-21 01:34:15 +02:00

a bit of sanity to reader_data

Use page pointer instead of page offset so it is easier to reason about.
And add assertion we always read further.
This commit is contained in:
Yura Sokolov
2022-12-12 12:21:41 +03:00
parent c74acb4610
commit a85d8dcb6e
+10 -9
View File
@@ -104,7 +104,7 @@ typedef struct XLogReaderData
bool xlogexists; bool xlogexists;
char page_buf[XLOG_BLCKSZ]; char page_buf[XLOG_BLCKSZ];
uint32 prev_page_off; int64_t prev_page_ptr;
bool need_switch; bool need_switch;
@@ -1090,11 +1090,11 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
*/ */
Assert(reader_data->xlogexists); Assert(reader_data->xlogexists);
Assert(reader_data->prev_page_ptr <= (int64_t)targetPagePtr);
/* /*
* Do not read same page read earlier from the file, read it from the buffer * Do not read same page read earlier from the file, read it from the buffer
*/ */
if (reader_data->prev_page_off != 0 && if (reader_data->prev_page_ptr == targetPagePtr)
reader_data->prev_page_off == targetPageOff)
{ {
memcpy(readBuf, reader_data->page_buf, XLOG_BLCKSZ); memcpy(readBuf, reader_data->page_buf, XLOG_BLCKSZ);
#if PG_VERSION_NUM < 130000 #if PG_VERSION_NUM < 130000
@@ -1142,7 +1142,7 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
#endif #endif
memcpy(reader_data->page_buf, readBuf, XLOG_BLCKSZ); memcpy(reader_data->page_buf, readBuf, XLOG_BLCKSZ);
reader_data->prev_page_off = targetPageOff; reader_data->prev_page_ptr = targetPagePtr;
#if PG_VERSION_NUM < 130000 #if PG_VERSION_NUM < 130000
*pageTLI = reader_data->tli; *pageTLI = reader_data->tli;
#endif #endif
@@ -1167,6 +1167,7 @@ InitXLogPageRead(XLogReaderData *reader_data, const char *archivedir,
MemSet(reader_data, 0, sizeof(XLogReaderData)); MemSet(reader_data, 0, sizeof(XLogReaderData));
reader_data->tli = tli; reader_data->tli = tli;
reader_data->xlogfile = -1; reader_data->xlogfile = -1;
reader_data->prev_page_ptr = -1;
if (allocate_reader) if (allocate_reader)
{ {
@@ -1372,7 +1373,7 @@ XLogThreadWorker(void *arg)
XLogReaderState *xlogreader; XLogReaderState *xlogreader;
XLogSegNo nextSegNo = 0; XLogSegNo nextSegNo = 0;
XLogRecPtr found; XLogRecPtr found;
uint32 prev_page_off = 0; int64_t prev_page_ptr = -1;
bool need_read = true; bool need_read = true;
xlogreader = WalReaderAllocate(wal_seg_size, reader_data); xlogreader = WalReaderAllocate(wal_seg_size, reader_data);
@@ -1540,8 +1541,8 @@ XLogThreadWorker(void *arg)
* Check if other thread got the target segment. Check it not very * Check if other thread got the target segment. Check it not very
* often, only every WAL page. * often, only every WAL page.
*/ */
if (wal_consistent_read && prev_page_off != 0 && if (wal_consistent_read &&
prev_page_off != reader_data->prev_page_off) prev_page_ptr != reader_data->prev_page_ptr)
{ {
XLogSegNo segno; XLogSegNo segno;
@@ -1552,7 +1553,7 @@ XLogThreadWorker(void *arg)
if (segno != 0 && segno < reader_data->xlogsegno) if (segno != 0 && segno < reader_data->xlogsegno)
break; break;
} }
prev_page_off = reader_data->prev_page_off; prev_page_ptr = reader_data->prev_page_ptr;
/* continue reading at next record */ /* continue reading at next record */
thread_arg->startpoint = InvalidXLogRecPtr; thread_arg->startpoint = InvalidXLogRecPtr;
@@ -1736,7 +1737,7 @@ CleanupXLogPageRead(XLogReaderState *xlogreader)
reader_data->gz_xlogfile = NULL; reader_data->gz_xlogfile = NULL;
} }
#endif #endif
reader_data->prev_page_off = 0; reader_data->prev_page_ptr = -1;
reader_data->xlogexists = false; reader_data->xlogexists = false;
} }