From 417eb0ba58451a02e71377277fda6e4615c8db5b Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Tue, 31 Mar 2020 12:59:10 +0900 Subject: [PATCH v20 3/3] Allow init and init_from_backup to set arbitrary GUC parameters in TAP test. It is convenient that arbitrary GUC parameters can be specified on initializing a node or taking a base backup. Any non-predefined keyword parameter given to the methods is translated into a parameter setting in the config file. --- src/backend/access/transam/xlogreader.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f3fea5132f..90a9649f61 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -270,7 +270,9 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) uint32 pageHeaderSize; bool gotheader; int readOff; - +#ifndef FRONTEND + XLogSegNo targetSegNo; +#endif /* * randAccess indicates whether to verify the previous-record pointer of * the record we're reading. We only do this if we're reading @@ -314,6 +316,22 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) targetPagePtr = RecPtr - (RecPtr % XLOG_BLCKSZ); targetRecOff = RecPtr % XLOG_BLCKSZ; +#ifndef FRONTEND + /* + * Although It's safe that the current segment is recycled as a new + * segment since we check the page/record header at reading, it leads to + * an apparently strange error message when logical replication, which can + * be prevented by explicitly checking if the current segment is removed. + */ + XLByteToSeg(targetPagePtr, targetSegNo, state->segcxt.ws_segsize); + if (targetSegNo <= XLogGetLastRemovedSegno()) + { + report_invalid_record(state, + "WAL segment for LSN %X/%X has been removed", + (uint32)(RecPtr >> 32), (uint32) RecPtr); + goto err; + } +#endif /* * Read the page containing the record into state->readBuf. Request enough * byte to cover the whole record header, or at least the part of it that -- 2.18.2