Skip to content

Commit a66b05b

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 aa1e921 commit a66b05b

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
@@ -5899,7 +5899,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
58995899
* because subtransaction commit is never WAL logged.
59005900
*/
59015901
static void
5902-
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
5902+
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid,
5903+
XLogRecPtr lsn)
59035904
{
59045905
TransactionId max_xid;
59055906

@@ -5949,7 +5950,16 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
59495950
}
59505951

59515952
/* Make sure files supposed to be dropped are dropped */
5952-
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5953+
if (parsed->nrels > 0)
5954+
{
5955+
/*
5956+
* See comments about update of minimum recovery point on truncation,
5957+
* in xact_redo_commit().
5958+
*/
5959+
XLogFlush(lsn);
5960+
5961+
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5962+
}
59535963
}
59545964

59555965
void
@@ -5989,15 +5999,15 @@ xact_redo(XLogReaderState *record)
59895999
xl_xact_parsed_abort parsed;
59906000

59916001
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
5992-
xact_redo_abort(&parsed, XLogRecGetXid(record));
6002+
xact_redo_abort(&parsed, XLogRecGetXid(record), record->EndRecPtr);
59936003
}
59946004
else if (info == XLOG_XACT_ABORT_PREPARED)
59956005
{
59966006
xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record);
59976007
xl_xact_parsed_abort parsed;
59986008

59996009
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
6000-
xact_redo_abort(&parsed, parsed.twophase_xid);
6010+
xact_redo_abort(&parsed, parsed.twophase_xid, record->EndRecPtr);
60016011

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

0 commit comments

Comments
 (0)