Skip to content

Commit 9803de0

Browse files
knizhnikKonstantin Knizhnik
authored andcommitted
Do not create new timeline for replica promotion (#746)
Co-authored-by: Konstantin Knizhnik <konstantin.knizhnik@databricks.com>
1 parent ed48df0 commit 9803de0

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

src/backend/access/transam/xlog.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6128,7 +6128,7 @@ StartupXLOG(void)
61286128
* In a normal crash recovery, we can just extend the timeline we were in.
61296129
*/
61306130
newTLI = endOfRecoveryInfo->lastRecTLI;
6131-
if (ArchiveRecoveryRequested)
6131+
if (ArchiveRecoveryRequested && !NeonRecoveryRequested)
61326132
{
61336133
newTLI = findNewestTimeLine(recoveryTargetTLI) + 1;
61346134
ereport(LOG,

src/backend/access/transam/xlogrecovery.c

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,29 +1707,33 @@ FinishWalRecovery(void)
17071707

17081708
XLogPageHeader xlogPageHdr = (XLogPageHeader) (page);
17091709

1710-
xlogPageHdr->xlp_pageaddr = pageBeginPtr;
1711-
xlogPageHdr->xlp_magic = XLOG_PAGE_MAGIC;
1712-
xlogPageHdr->xlp_tli = recoveryTargetTLI;
1713-
/*
1714-
* If we start writing with offset from page beginning, pretend in
1715-
* page header there is a record ending where actual data will
1716-
* start.
1717-
*/
1718-
xlogPageHdr->xlp_rem_len = offs - lastPageSize;
1719-
xlogPageHdr->xlp_info = (xlogPageHdr->xlp_rem_len > 0) ? XLP_FIRST_IS_CONTRECORD : 0;
1720-
1721-
/* Populate the long header correctly, if */
1722-
if ((pageBeginPtr & (wal_segment_size - 1)) == 0)
1710+
memcpy(page, xlogreader->readBuf, offs);
1711+
/* if the buffer was zeroed, manually construct the page header */
1712+
if (xlogPageHdr->xlp_magic != XLOG_PAGE_MAGIC)
17231713
{
1724-
XLogLongPageHeader longHdr = (XLogLongPageHeader) xlogPageHdr;
1725-
xlogPageHdr->xlp_info |= XLP_LONG_HEADER;
1726-
longHdr->xlp_seg_size = wal_segment_size;
1727-
longHdr->xlp_sysid = GetSystemIdentifier();
1728-
longHdr->xlp_xlog_blcksz = XLOG_BLCKSZ;
1729-
}
1714+
xlogPageHdr->xlp_pageaddr = pageBeginPtr;
1715+
xlogPageHdr->xlp_magic = XLOG_PAGE_MAGIC;
1716+
xlogPageHdr->xlp_tli = recoveryTargetTLI;
1717+
/*
1718+
* If we start writing with offset from page beginning, pretend in
1719+
* page header there is a record ending where actual data will
1720+
* start.
1721+
*/
1722+
xlogPageHdr->xlp_rem_len = offs - lastPageSize;
1723+
xlogPageHdr->xlp_info = (xlogPageHdr->xlp_rem_len > 0) ? XLP_FIRST_IS_CONTRECORD : 0;
17301724

1731-
readOff = XLogSegmentOffset(pageBeginPtr, wal_segment_size);
1725+
/* Populate the long header, if needed */
1726+
if ((pageBeginPtr & (wal_segment_size - 1)) == 0)
1727+
{
1728+
XLogLongPageHeader longHdr = (XLogLongPageHeader) xlogPageHdr;
1729+
xlogPageHdr->xlp_info |= XLP_LONG_HEADER;
1730+
longHdr->xlp_seg_size = wal_segment_size;
1731+
longHdr->xlp_sysid = GetSystemIdentifier();
1732+
longHdr->xlp_xlog_blcksz = XLOG_BLCKSZ;
1733+
}
17321734

1735+
readOff = XLogSegmentOffset(pageBeginPtr, wal_segment_size);
1736+
}
17331737
result->lastPageBeginPtr = pageBeginPtr;
17341738
result->lastPage = page;
17351739
elog(LOG, "Continue writing WAL at %X/%X", LSN_FORMAT_ARGS(xlogreader->EndRecPtr));

0 commit comments

Comments
 (0)