From: Fujii Masao Date: Wed, 28 Jul 2021 16:35:52 +0000 (+0900) Subject: Update minimum recovery point on truncation during WAL replay of abort record. X-Git-Tag: REL9_6_23~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=32d182dd0da9628a4bc1515b69694d6e361a8de4;p=thirdparty%2Fpostgresql.git Update minimum recovery point on truncation during WAL replay of abort record. If a file is truncated, we must update minRecoveryPoint. Once a file is truncated, there's no going back; it would not be safe to stop recovery at a point earlier than that anymore. Commit 7bffc9b7bf changed xact_redo_commit() so that it updates minRecoveryPoint on truncation, but forgot to change xact_redo_abort(). Back-patch to all supported versions. Reported-by: mengjuan.cmj@alibaba-inc.com Author: Fujii Masao Reviewed-by: Heikki Linnakangas Discussion: https://postgr.es/m/b029fce3-4fac-4265-968e-16f36ff4d075.mengjuan.cmj@alibaba-inc.com --- diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index e75062e0f96..2ccb582100e 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5545,7 +5545,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed, * because subtransaction commit is never WAL logged. */ static void -xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) +xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid, + XLogRecPtr lsn) { TransactionId max_xid; @@ -5607,7 +5608,16 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) } /* Make sure files supposed to be dropped are dropped */ - DropRelationFiles(parsed->xnodes, parsed->nrels, true); + if (parsed->nrels > 0) + { + /* + * See comments about update of minimum recovery point on truncation, + * in xact_redo_commit(). + */ + XLogFlush(lsn); + + DropRelationFiles(parsed->xnodes, parsed->nrels, true); + } } void @@ -5651,12 +5661,12 @@ xact_redo(XLogReaderState *record) if (info == XLOG_XACT_ABORT) { Assert(!TransactionIdIsValid(parsed.twophase_xid)); - xact_redo_abort(&parsed, XLogRecGetXid(record)); + xact_redo_abort(&parsed, XLogRecGetXid(record), record->EndRecPtr); } else { Assert(TransactionIdIsValid(parsed.twophase_xid)); - xact_redo_abort(&parsed, parsed.twophase_xid); + xact_redo_abort(&parsed, parsed.twophase_xid, record->EndRecPtr); RemoveTwoPhaseFile(parsed.twophase_xid, false); } }