Revert recent changes related to handling of 2PC files at recovery
authorMichael Paquier <[email protected]>
Fri, 17 Jan 2025 04:27:43 +0000 (13:27 +0900)
committerMichael Paquier <[email protected]>
Fri, 17 Jan 2025 04:27:43 +0000 (13:27 +0900)
This commit reverts 8f67f994e8ea (down to v13) and c3de0f9eed38 (down to
v17), as these are proving to not be completely correct regarding two
aspects:
- In v17 and newer branches, c3de0f9eed38's check for epoch handling is
incorrect, and does not correctly handle frozen epochs.  A logic closer
to widen_snapshot_xid() should be used.  The 2PC code should try to
integrate deeper with FullTransactionIds, 5a1dfde8334b being not enough.
- In v13 and newer branches, 8f67f994e8ea is a workaround for the real
issue, which is that we should not attempt CLOG lookups without reaching
consistency.  This exists since 728bd991c3c4, and this is reachable with
ProcessTwoPhaseBuffer() called by restoreTwoPhaseData() at the beginning
of recovery.

Per discussion with Noah Misch.

Discussion: https://postgr.es/m/20250116010051[email protected]
Backpatch-through: 13

src/backend/access/transam/twophase.c
src/test/recovery/t/009_twophase.pl

index 330d2a5c9ecd2cc9261c039a7ca2e8ad46c8f654..95aa8be9c538149f71e8397d18636a6bd8d2cee2 100644 (file)
@@ -2183,40 +2183,40 @@ ProcessTwoPhaseBuffer(TransactionId xid,
    if (!fromdisk)
        Assert(prepare_start_lsn != InvalidXLogRecPtr);
 
-   /* Reject XID if too new */
-   if (TransactionIdFollowsOrEquals(xid, origNextXid))
+   /* Already processed? */
+   if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid))
    {
        if (fromdisk)
        {
            ereport(WARNING,
-                   (errmsg("removing future two-phase state file for transaction %u",
+                   (errmsg("removing stale two-phase state file for transaction %u",
                            xid)));
            RemoveTwoPhaseFile(xid, true);
        }
        else
        {
            ereport(WARNING,
-                   (errmsg("removing future two-phase state from memory for transaction %u",
+                   (errmsg("removing stale two-phase state from memory for transaction %u",
                            xid)));
            PrepareRedoRemove(xid, true);
        }
        return NULL;
    }
 
-   /* Already processed? */
-   if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid))
+   /* Reject XID if too new */
+   if (TransactionIdFollowsOrEquals(xid, origNextXid))
    {
        if (fromdisk)
        {
            ereport(WARNING,
-                   (errmsg("removing stale two-phase state file for transaction %u",
+                   (errmsg("removing future two-phase state file for transaction %u",
                            xid)));
            RemoveTwoPhaseFile(xid, true);
        }
        else
        {
            ereport(WARNING,
-                   (errmsg("removing stale two-phase state from memory for transaction %u",
+                   (errmsg("removing future two-phase state from memory for transaction %u",
                            xid)));
            PrepareRedoRemove(xid, true);
        }
index 7642e4f0b3cd5faa009632b071d31a41c4332fe1..fe7e8e798025dc9cee330c91770486aeae7ec124 100644 (file)
@@ -528,27 +528,4 @@ is( $psql_out,
    qq{27|issued to paris},
    "Check expected t_009_tbl2 data on standby");
 
-###############################################################################
-# Check handling of orphaned 2PC files at recovery.
-###############################################################################
-
-$cur_primary->teardown_node;
-
-# Grab location in logs of primary
-my $log_offset = -s $cur_primary->logfile;
-
-# Create a fake file with a transaction ID large enough to be in the future,
-# then check that the primary is able to start and remove this file at
-# recovery.
-
-my $future_2pc_file = $cur_primary->data_dir . '/pg_twophase/00FFFFFF';
-append_to_file $future_2pc_file, "";
-
-$cur_primary->start;
-$cur_primary->log_check(
-   "future two-phase file removed at recovery",
-   $log_offset,
-   log_like =>
-     [qr/removing future two-phase state file for transaction 16777215/]);
-
 done_testing();