1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-02-15 15:09:56 +02:00

bugfix: multi-timeline pagemap

This commit is contained in:
Grigory Smolkin 2020-05-01 02:44:36 +03:00
parent 3e0c871f6b
commit 0ac5920a7c

View File

@ -276,7 +276,6 @@ extractPageMap(const char *archivedir, uint32 wal_seg_size,
timelineInfo *end_tlinfo = NULL; timelineInfo *end_tlinfo = NULL;
timelineInfo *tmp_tlinfo = NULL; timelineInfo *tmp_tlinfo = NULL;
XLogRecPtr prev_switchpoint = InvalidXLogRecPtr; XLogRecPtr prev_switchpoint = InvalidXLogRecPtr;
lsnInterval *wal_interval = NULL;
/* We must find TLI information about final timeline (t3 in example) */ /* We must find TLI information about final timeline (t3 in example) */
for (i = 0; i < parray_num(tli_list); i++) for (i = 0; i < parray_num(tli_list); i++)
@ -298,7 +297,7 @@ extractPageMap(const char *archivedir, uint32 wal_seg_size,
tmp_tlinfo = end_tlinfo; tmp_tlinfo = end_tlinfo;
while (tmp_tlinfo) while (tmp_tlinfo)
{ {
wal_interval = pgut_malloc(sizeof(lsnInterval)); lsnInterval *wal_interval = pgut_malloc(sizeof(lsnInterval));
wal_interval->tli = tmp_tlinfo->tli; wal_interval->tli = tmp_tlinfo->tli;
if (tmp_tlinfo->tli == end_tli) if (tmp_tlinfo->tli == end_tli)
@ -326,7 +325,7 @@ extractPageMap(const char *archivedir, uint32 wal_seg_size,
for (i = parray_num(interval_list) - 1; i >= 0; i--) for (i = parray_num(interval_list) - 1; i >= 0; i--)
{ {
bool inclusive_endpoint; bool inclusive_endpoint;
wal_interval = parray_get(interval_list, i); lsnInterval *tmp_interval = (lsnInterval *) parray_get(interval_list, i);
/* In case of replica promotion, endpoints of intermediate /* In case of replica promotion, endpoints of intermediate
* timelines can be unreachable. * timelines can be unreachable.
@ -334,17 +333,17 @@ extractPageMap(const char *archivedir, uint32 wal_seg_size,
inclusive_endpoint = false; inclusive_endpoint = false;
/* ... but not the end timeline */ /* ... but not the end timeline */
if (wal_interval->tli == end_tli) if (tmp_interval->tli == end_tli)
inclusive_endpoint = true; inclusive_endpoint = true;
extract_isok = RunXLogThreads(archivedir, 0, InvalidTransactionId, extract_isok = RunXLogThreads(archivedir, 0, InvalidTransactionId,
InvalidXLogRecPtr, wal_interval->tli, wal_seg_size, InvalidXLogRecPtr, tmp_interval->tli, wal_seg_size,
wal_interval->begin_lsn, wal_interval->end_lsn, tmp_interval->begin_lsn, tmp_interval->end_lsn,
false, extractPageInfo, NULL, inclusive_endpoint); false, extractPageInfo, NULL, inclusive_endpoint);
if (!extract_isok) if (!extract_isok)
break; break;
pg_free(wal_interval); pg_free(tmp_interval);
} }
pg_free(interval_list); pg_free(interval_list);
} }
@ -1064,6 +1063,12 @@ RunXLogThreads(const char *archivedir, time_t target_time,
elog(ERROR, "Invalid startpoint value %X/%X", elog(ERROR, "Invalid startpoint value %X/%X",
(uint32) (startpoint >> 32), (uint32) (startpoint)); (uint32) (startpoint >> 32), (uint32) (startpoint));
if (process_record)
elog(LOG, "Extracting pagemap from tli %i on range from %X/%X to %X/%X",
tli,
(uint32) (startpoint >> 32), (uint32) (startpoint),
(uint32) (endpoint >> 32), (uint32) (endpoint));
if (!XLogRecPtrIsInvalid(endpoint)) if (!XLogRecPtrIsInvalid(endpoint))
{ {
// if (XRecOffIsNull(endpoint) && !inclusive_endpoint) // if (XRecOffIsNull(endpoint) && !inclusive_endpoint)