From 81602888e7bd65a53029dcf7f29ab21bb7d10b60 Mon Sep 17 00:00:00 2001 From: Takashi Menjo Date: Thu, 28 Oct 2021 13:35:28 +0900 Subject: [PATCH v6 09/11] Ensure WAL mappings before assertion --- src/backend/access/transam/xlog.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 62f08cb50b..f0d7a317d2 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1945,6 +1945,23 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) */ if (ptr / XLOG_BLCKSZ == cachedPage) { + /* + * Ensure WAL mappings before assersion. + * + * cachedPos should be recaluculated because it has been probably + * invalidated due to WAL remapping. This should be done even if + * openLogSegNo seems not to change because the address of the + * mapping could have changed (ABA problem). + */ + if (wal_pmem_map) + { + endptr = ptr - ptr % XLOG_BLCKSZ + XLOG_BLCKSZ; + openLogSegNo = PmemXLogEnsurePrevMapped(endptr, tli); + cachedPos = PmemXLogGetBufferPages() + + (Size) XLogSegmentOffset(endptr - XLOG_BLCKSZ, + wal_segment_size); + } + Assert(((XLogPageHeader) cachedPos)->xlp_magic == XLOG_PAGE_MAGIC); Assert(((XLogPageHeader) cachedPos)->xlp_pageaddr == ptr - (ptr % XLOG_BLCKSZ)); return cachedPos + ptr % XLOG_BLCKSZ; -- 2.25.1