Skip to content

Commit d7ded08

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 c590904 commit d7ded08

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
@@ -5887,7 +5887,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
58875887
* because subtransaction commit is never WAL logged.
58885888
*/
58895889
static void
5890-
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
5890+
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid,
5891+
XLogRecPtr lsn)
58915892
{
58925893
TransactionId max_xid;
58935894

@@ -5938,7 +5939,16 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
59385939
}
59395940

59405941
/* Make sure files supposed to be dropped are dropped */
5941-
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5942+
if (parsed->nrels > 0)
5943+
{
5944+
/*
5945+
* See comments about update of minimum recovery point on truncation,
5946+
* in xact_redo_commit().
5947+
*/
5948+
XLogFlush(lsn);
5949+
5950+
DropRelationFiles(parsed->xnodes, parsed->nrels, true);
5951+
}
59425952
}
59435953

59445954
void
@@ -5978,15 +5988,15 @@ xact_redo(XLogReaderState *record)
59785988
xl_xact_parsed_abort parsed;
59795989

59805990
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
5981-
xact_redo_abort(&parsed, XLogRecGetXid(record));
5991+
xact_redo_abort(&parsed, XLogRecGetXid(record), record->EndRecPtr);
59825992
}
59835993
else if (info == XLOG_XACT_ABORT_PREPARED)
59845994
{
59855995
xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record);
59865996
xl_xact_parsed_abort parsed;
59875997

59885998
ParseAbortRecord(XLogRecGetInfo(record), xlrec, &parsed);
5989-
xact_redo_abort(&parsed, parsed.twophase_xid);
5999+
xact_redo_abort(&parsed, parsed.twophase_xid, record->EndRecPtr);
59906000

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

0 commit comments

Comments
 (0)