diff options
author | Fujii Masao <fujii@postgresql.org> | 2021-07-29 01:34:13 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2021-07-29 01:35:00 +0900 |
commit | d7ded08e6e0e565adf6fea7c55bfcf2845e5f8cc (patch) | |
tree | 75724078e773c230c15f07fbffea2153ab264662 /src/backend/access/transam/xact.c | |
parent | c590904d50cc93b12fc895041c34e1ea821e768c (diff) | |
download | postgresql-d7ded08e6e0e565adf6fea7c55bfcf2845e5f8cc.tar.gz postgresql-d7ded08e6e0e565adf6fea7c55bfcf2845e5f8cc.zip |
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
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r-- | src/backend/access/transam/xact.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index ddac4b78bae..be8ed0b2491 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5887,7 +5887,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; @@ -5938,7 +5939,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 @@ -5978,7 +5988,7 @@ xact_redo(XLogReaderState *record) xl_xact_parsed_abort parsed; ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed); - xact_redo_abort(&parsed, XLogRecGetXid(record)); + xact_redo_abort(&parsed, XLogRecGetXid(record), record->EndRecPtr); } else if (info == XLOG_XACT_ABORT_PREPARED) { @@ -5986,7 +5996,7 @@ xact_redo(XLogReaderState *record) xl_xact_parsed_abort parsed; ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed); - xact_redo_abort(&parsed, parsed.twophase_xid); + xact_redo_abort(&parsed, parsed.twophase_xid, record->EndRecPtr); /* Delete TwoPhaseState gxact entry and/or 2PC file. */ LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE); |