Skip to content

Commit 02ef4d1

Browse files
committed
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 7bffc9b 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
1 parent ddd1eac commit 02ef4d1

File tree

1 file changed

+14
-4
lines changed
  • src/backend/access/transam

1 file changed

+14
-4
lines changed

src/backend/access/transam/xact.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5733,7 +5733,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
57335733
* because subtransaction commit is never WAL logged.
57345734
*/
57355735
static void
5736-
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
5736+
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid,
5737+
XLogRecPtr lsn)
57375738
{
57385739
TransactionId max_xid;
57395740

@@ -5798,7 +5799,16 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
57985799
}
57995800

58005801
/* Make sure files supposed to be dropped are dropped */
5801-
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5802+
if (parsed->nrels > 0)
5803+
{
5804+
/*
5805+
* See comments about update of minimum recovery point on truncation,
5806+
* in xact_redo_commit().
5807+
*/
5808+
XLogFlush(lsn);
5809+
5810+
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5811+
}
58025812
}
58035813

58045814
void
@@ -5838,15 +5848,15 @@ xact_redo(XLogReaderState *record)
58385848
xl_xact_parsed_abort parsed;
58395849

58405850
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
5841-
xact_redo_abort(&parsed, XLogRecGetXid(record));
5851+
xact_redo_abort(&parsed, XLogRecGetXid(record), record->EndRecPtr);
58425852
}
58435853
else if (info == XLOG_XACT_ABORT_PREPARED)
58445854
{
58455855
xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record);
58465856
xl_xact_parsed_abort parsed;
58475857

58485858
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
5849-
xact_redo_abort(&parsed, parsed.twophase_xid);
5859+
xact_redo_abort(&parsed, parsed.twophase_xid, record->EndRecPtr);
58505860

58515861
/* Delete TwoPhaseState gxact entry and/or 2PC file. */
58525862
LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE);

0 commit comments

Comments
 (0)