aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xact.c
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2021-07-29 01:34:13 +0900
committerFujii Masao <fujii@postgresql.org>2021-07-29 01:35:00 +0900
commitd7ded08e6e0e565adf6fea7c55bfcf2845e5f8cc (patch)
tree75724078e773c230c15f07fbffea2153ab264662 /src/backend/access/transam/xact.c
parentc590904d50cc93b12fc895041c34e1ea821e768c (diff)
downloadpostgresql-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.c18
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);