From 52b3fd58f5fa22884744808bf7c7653a6b0309fb Mon Sep 17 00:00:00 2001 From: Takashi Menjo Date: Thu, 28 Oct 2021 13:35:28 +0900 Subject: [PATCH v5 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 a51847cb7a..668cebb871 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1924,6 +1924,23 @@ GetXLogBuffer(XLogRecPtr ptr) */ 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); + 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