From 90ec10531b91117f3a28a6f2516e2cf842a981d8 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Wed, 3 Sep 2025 17:08:48 +0300 Subject: [PATCH] Do not create new timeline for replica promotion --- src/backend/access/transam/xlog.c | 2 +- src/backend/access/transam/xlogrecovery.c | 44 ++++++++++++----------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 46662aa21cb..16cfd18412a 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -6066,7 +6066,7 @@ StartupXLOG(void) * In a normal crash recovery, we can just extend the timeline we were in. */ newTLI = endOfRecoveryInfo->lastRecTLI; - if (ArchiveRecoveryRequested) + if (ArchiveRecoveryRequested && !NeonRecoveryRequested) { newTLI = findNewestTimeLine(recoveryTargetTLI) + 1; ereport(LOG, diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 62dd768fed4..1c344276675 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -1699,29 +1699,33 @@ FinishWalRecovery(void) char *page = palloc0(offs); XLogPageHeader xlogPageHdr = (XLogPageHeader) page; - xlogPageHdr->xlp_pageaddr = pageBeginPtr; - xlogPageHdr->xlp_magic = XLOG_PAGE_MAGIC; - xlogPageHdr->xlp_tli = recoveryTargetTLI; - xlogPageHdr->xlp_info = 0; - /* - * If we start writing with offset from page beginning, pretend in - * page header there is a record ending where actual data will - * start. - */ - xlogPageHdr->xlp_rem_len = offs - lastPageSize; - if (xlogPageHdr->xlp_rem_len > 0) - xlogPageHdr->xlp_info |= XLP_FIRST_IS_CONTRECORD; - readOff = XLogSegmentOffset(pageBeginPtr, wal_segment_size); - - if (isLongHeader) + memcpy(page, xlogreader->readBuf, offs); + if (xlogPageHdr->xlp_magic != XLOG_PAGE_MAGIC) { - XLogLongPageHeader longHdr = (XLogLongPageHeader) page; + xlogPageHdr->xlp_pageaddr = pageBeginPtr; + xlogPageHdr->xlp_magic = XLOG_PAGE_MAGIC; + xlogPageHdr->xlp_tli = recoveryTargetTLI; + xlogPageHdr->xlp_info = 0; + /* + * If we start writing with offset from page beginning, pretend in + * page header there is a record ending where actual data will + * start. + */ + xlogPageHdr->xlp_rem_len = offs - lastPageSize; + if (xlogPageHdr->xlp_rem_len > 0) + xlogPageHdr->xlp_info |= XLP_FIRST_IS_CONTRECORD; + readOff = XLogSegmentOffset(pageBeginPtr, wal_segment_size); + + if (isLongHeader) + { + XLogLongPageHeader longHdr = (XLogLongPageHeader) page; - longHdr->xlp_sysid = GetSystemIdentifier(); - longHdr->xlp_seg_size = wal_segment_size; - longHdr->xlp_xlog_blcksz = XLOG_BLCKSZ; + longHdr->xlp_sysid = GetSystemIdentifier(); + longHdr->xlp_seg_size = wal_segment_size; + longHdr->xlp_xlog_blcksz = XLOG_BLCKSZ; - xlogPageHdr->xlp_info |= XLP_LONG_HEADER; + xlogPageHdr->xlp_info |= XLP_LONG_HEADER; + } } result->lastPageBeginPtr = pageBeginPtr; result->lastPage = page;